(Italiano) Come richiedere e installare un certificato SSL su Apache Karaf
Su questo blog, qualche giorno addietro, abbiamo affrontato la problematica su Come abilitare HTTPS su Apache Karaf Pax Web. Prima di abilitare il protocollo HTTPS, se ben ricordate, ci siamo preoccupati di come poter generare un self-signed certificate (o auto-firmato) per il nostro server Apache Karaf utilizzando il tool keytool.
Ricordiamo che il nostro certificato SSL è di tipo server, ovvero, solo il server è autenticato: l'utente può verificare l'autenticità del server a cui ci si connette e l'identità dell'organizzazione che lo gestisce.
Riuscire a installare sul nostro server Apache Karaf (configurato come descritto in Come abilitare HTTPS su Apache Karaf Pax Web) un certificato ricevuto da una Certificate Authority o Certification Authority (CA) è l'obiettivo ultimo di questo articolo.
Il linea generale i passi necessari per ottenere un certificato SSL da una CA è molto semplice e consta di queste azioni:
-
Creare un coppia di chiavi pubblica e privata (o keypair).
-
Creare una richiesta per un certificato basato su chiave pubblica CSR (Certificate Signing Request). La richiesta del certificato contiene informazioni riguardo il server e la società che lo ospita.
-
Inviare la richiesta, con una fotocopia di un documento di identità, a una CA. Non è possibile consigliare quale autorità di certificazione scegliere. La decisione potrebbe essere basata su esperienze passate, esperienze di amici o colleghi o per un fattore economico.Una volta scelta la CA, è necessario seguire le istruzioni fornite dalla CA per ottenere il certificato.
-
Una volta che la CA ha verificato l'identità del richiedente, invierà il certificato digitale (nei più comuni formati, quali: PEM, DER, PKCS#12) pronto per essere utilizzato da una o più applicazioni.
-
Installare il certificato ricevuto sul proprio server e configurare le applicazioni appropriate affinché usino correttamente il certificato.
Il terzo e quarto punto possono variare sulla base della CA da voi scelta. Potrebbe per esempio cambiare il metodo d'identificazione del richiedente o il formato e modalità di ricezione del certificato richiesto.
La CA che ho deciso d'utilizzare per richiedere il certificato SSL si chiama Let's Encrypt Authority X3. E' una CA gratuita, con processi di gestione automatici e open che tra le altre cose supporta il protocollo (ancora in stato draft) Automatic Certificate Management Environment (ACME). Per avviare il processo di richiesta del certificato ho utilizzato in particolare ZeroSSL (fully in-browser process, inclusa la creazione del CSR).
Per affrontare la parte pratica dell'articolo, è necessario che sulle proprie macchine siano installati il keytool e OpenSSL. Il primo tool fa parte della JDK, mentre il secondo tool può essere installato su qualunque sistema operativo della famiglia Microsoft, Apple e Nix*.
Preparare la richiesta del certificato
Così come previsto dal processo di richiesta del certificato SSL indicato in precedenza, procediamo con l'esecuzione del primo e secondo punto, così come mostrato a seguire.
$ openssl genrsa -out api.dontesta.it.key.pem 2048 $ openssl req -new -sha256 \ -key api.dontesta.it.key.pem \ -out api.dontesta.it.csr.pem
Il primo comando crea la coppia di chiavi di tipo RSA con una lunghezza pari a 2048 bit che viene salvata all'interno del file api.dontesta.it.key.pem e il cui contenuto è mostrato subito sotto. La coppia di chiavi appena generata deve essere conservata in un luogo sicuro.
-----BEGIN RSA PRIVATE KEY----- MIIEpQIBAAKCAQEAyvWJyiCnPUtBRuHyPHbF97afd2iVVjt3JXoK1h2KJ+g4IXdW KFTT3mRF+ZYtXdvmMQkDD35T4Yj/JvxAK8nelJ6jWVTbGExl64gtjDrAm2OIx6+t C9UhNt60cxAcVGjYVLLPByuBafnUb1zy/ngXnGzF/CaFwYIPBUDnMw/HQft0hCBc YmIVZtgd1VnmR2X+6YcTdJNBi7/8ncsEkQsrM2mcA6Rj992voscyMgllP0+5bMOR pFvbHtlbJzv8RYaNOMe+vpgkOPrfdABAnFlxMH/+JmGxHGv9WKQmPZEeDzkrAVgE NApT7TrU4RmhxGxsVhaK/XD0BHUWkSLbQeV7MQIDAQABAoIBAQC/3PJPNCMlHHkv CvW2Fwn6rJd/iEx0Ym617PNFilNKeopliKzYH6jSObS0xzVH31Ny03QjN2cQdDPQ pPH88y8JDBabok4kYESRLgDw6bGes69gJkDOSMLHXiz0ASzm1t564zY3Lvd+OYCL bjEAQoL/iwx22+viDJMqgjqN2MKjKeQYrALPzDEIlY/WNjO/I8Ha0mqirBkJC9vE aR+AqiST9x2xgJNU5eF1sAXnH0p6V3GdGzZNUB0k9Rq8JkQUDpZcGoSVy2aioCff MUjt6LsqZ9QemHEzpSWl3CBI3+cAwTZ1aQrdRuXYj636Y4BB8kXyvPsERiO6OMwk Cxo56/npAoGBAPpDOEea78VmiLAsvwNkiwqAhjCWnH9H/LVDOiJ//+TEnZpbQ3Wj 9+IAxsXfZYTtEvIakLftnRNr81nxAIXJt9X1Ga/+xJwbwGfQ0EjoyZLSWb8zYcYB 8aRWasBgP99Mdm6z33q6GvrubKF985lggygkH9svayOV+tGFkn0tlw1rAoGBAM+c slECZBHiYhZQtPXBi1uveJyiJyN/GrPJhHIhAPCTW+VTVKe6l4G8eVi3JPTVoVRK GsVhus+17i3mQWl/zfqINhVcAM0ag7PcgMhb8kYz4/TkWmugunS7HJrXlumvujOv Q10yB3dX/ILUqu9V5JbblRiKPkZxWfSIKpWkv0TTAoGBAPY91c5+4JU2wh+2p2vL LhPzShXc27dROZGQyE7R6xNJcllCmynRYEH7yZlAqj8UlaOqB+Mx5XAKs7M3su/w /vWC6PeGkiWYGMUNbSOQCWZxmuTKxdVybDTq4rbO/YnVTmK2kZnMLGfi2Pg9Wcb8 c5C3mrCsA5tMIzKtXunUReBpAoGBAJorl7NWni81uHcvyaGx7yXPwTY3p+7RJWgb HnKOFZ+RHi3G2tePVZDvAAGkRxpVRe9M9GJc95flVxDYqvyH/tKrsdXcs2+b3++B sFSZCumdAQvLQ2YnPi8O/+fwbs3sQ867uL+NNkQmn4ocGS+PzidEuow1pJc094MC VvU3GR4nAoGAQSvMXGAH1Hmh1hSTsrHuh8iSa2QChJHg24G/EBiMM5ttbQTAHg39 +xu11XmqYyk5blYypVAgDVZpmbYpvbm17pjJIG1kCjVHjSOoIbrCX/NMEgGnpk3e k6r2TFnNkZ05Ky142rWr0hjQcgoI2/+09S2+Nt3gkMpIcyfTNheBqzU= -----END RSA PRIVATE KEY-----
Il secondo comando crea invece la CSR partendo dalla coppia di chiavi e che contiene in forma codificata una raccolta d'informazioni, che poi, inviate alla CA, saranno utilizzate per generare il nostro certificato SSL. L'esecuzione di questo comando è interattivo, ovvero, saranno richieste le seguenti informazioni:
- Common Name: Il nome di dominio completo (FQDN) del server. Questo deve corrispondere esattamente con ciò che si digita nel browser web o si riceverà un errore di mancata corrispondenza del nome.
- Organization: Il nome legale della vostra organizzazione. Questo non deve essere abbreviato e dovrebbe includere suffissi, come Inc, Corp, o LLC, S.p.A, S.r.l, etc.
- Organizational Unit: La divisione che si occuperà della gestione del certificato all'interno della vostra organizzazione.
- City/Locality: La città dove l'organizzazione risiede.
- State/County/Region: Lo stato o regione dove l'organizzazione risiede. Dovrebbe essere indicata per esteso e non in forma abbreviata.
- Country: Il country code in formato ISO.
- Email address: Un indirizzo email valido per contattare la vostra organizzazione.
La CSR creata per quest'esempio contiene le queste informazioni: CN=api.dontesta.it, OU=R&D Labs, O=Antonio Musarra's Blog, C=IT, L=Rome, S=Italy
. Il file api.dontesta.it.csr.pem che contiene il CSR è mostrato a seguire.
-----BEGIN CERTIFICATE REQUEST----- MIIC6jCCAdICAQAwgaQxCzAJBgNVBAYTAklUMQ4wDAYDVQQIEwVJdGFseTENMAsG A1UEBxMEUm9tZTEfMB0GA1UEChMWQW50b25pbyBNdXNhcnJhJ3MgQmxvZzERMA8G A1UECxQIUiZEIExhYnMxGDAWBgNVBAMTD2FwaS5kb250ZXN0YS5pdDEoMCYGCSqG SIb3DQEJARYZYW50b25pby5tdXNhcnJhQGdtYWlsLmNvbTCCASIwDQYJKoZIhvcN AQEBBQADggEPADCCAQoCggEBAMr1icogpz1LQUbh8jx2xfe2n3dolVY7dyV6CtYd iifoOCF3VihU095kRfmWLV3b5jEJAw9+U+GI/yb8QCvJ3pSeo1lU2xhMZeuILYw6 wJtjiMevrQvVITbetHMQHFRo2FSyzwcrgWn51G9c8v54F5xsxfwmhcGCDwVA5zMP x0H7dIQgXGJiFWbYHdVZ5kdl/umHE3STQYu//J3LBJELKzNpnAOkY/fdr6LHMjIJ ZT9PuWzDkaRb2x7ZWyc7/EWGjTjHvr6YJDj633QAQJxZcTB//iZhsRxr/VikJj2R Hg85KwFYBDQKU+061OEZocRsbFYWiv1w9AR1FpEi20HlezECAwEAAaAAMA0GCSqG SIb3DQEBCwUAA4IBAQCnsCJDEHlQiKxmkfIDVSPgW5nTFZnkQEkZTzpLHXSqKHOZ P3E/wCGvjRx2s723Jv7L+Qhu896nb6QjVG8H2zaiWBE4vWByhfeTR7OQaIXZg86m E4uzbsXXJCmnmJ3Ho1oL+u597mKIULzKdnZwGkjxey9K/iwsbSGaQGt1SipAoELL K28yyO4FyzBm3B95GO/VXyhNS/yUaDzAPtQCZn7clzAkyBYp5KEjpofpsZJJqSIH xsE/RG41EZCW41NyTsYSF4BmMTnPR9n5uA7tjHhdEwsSSORhNTABECRbJ9wdOlF8 gE4tr0cPx57P0UTntFu46evk+uFwwlZoUVHcJxxP -----END CERTIFICATE REQUEST-----
Una volta generato il CSR di richiesta non resta altro che inviarlo alla CA insieme ad altra eventuale documentazione e restare in attesa del certificato SSL firmato.
Preparare il JKS dal certificato ricevuto dalla CA
Supponiamo di aver ricevuto il nostro certificato in formato PEM x509 (o OpenSSL) dalla CA prescelta. Con il certificato ricevuto, cosa ci facciamo? Dobbiamo creare il keystore in formato JKS partendo dal certificato ricevuto dalla CA e dalla coppia di chiavi, quest'ultima creata nel primo passo del processo di richiesta illustrato precedentemente. Nel Listato 3 è mostrato il contenuto del certificato rilasciato dalla CA e codificato in base64.
-----BEGIN CERTIFICATE----- MIIFAjCCA+qgAwIBAgISA9xSrx/nXMFtdds4ePY3qhj9MA0GCSqGSIb3DQEBCwUA MEoxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MSMwIQYDVQQD ExpMZXQncyBFbmNyeXB0IEF1dGhvcml0eSBYMzAeFw0xNzAzMDQxNTAyMDBaFw0x NzA2MDIxNTAyMDBaMBoxGDAWBgNVBAMTD2FwaS5kb250ZXN0YS5pdDCCASIwDQYJ KoZIhvcNAQEBBQADggEPADCCAQoCggEBAMr1icogpz1LQUbh8jx2xfe2n3dolVY7 dyV6CtYdiifoOCF3VihU095kRfmWLV3b5jEJAw9+U+GI/yb8QCvJ3pSeo1lU2xhM ZeuILYw6wJtjiMevrQvVITbetHMQHFRo2FSyzwcrgWn51G9c8v54F5xsxfwmhcGC DwVA5zMPx0H7dIQgXGJiFWbYHdVZ5kdl/umHE3STQYu//J3LBJELKzNpnAOkY/fd r6LHMjIJZT9PuWzDkaRb2x7ZWyc7/EWGjTjHvr6YJDj633QAQJxZcTB//iZhsRxr /VikJj2RHg85KwFYBDQKU+061OEZocRsbFYWiv1w9AR1FpEi20HlezECAwEAAaOC AhAwggIMMA4GA1UdDwEB/wQEAwIFoDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYB BQUHAwIwDAYDVR0TAQH/BAIwADAdBgNVHQ4EFgQUl8p8MC7xJvIkB8jxEhowTilB sekwHwYDVR0jBBgwFoAUqEpqYwR93brm0Tm3pkVl7/Oo7KEwcAYIKwYBBQUHAQEE ZDBiMC8GCCsGAQUFBzABhiNodHRwOi8vb2NzcC5pbnQteDMubGV0c2VuY3J5cHQu b3JnLzAvBggrBgEFBQcwAoYjaHR0cDovL2NlcnQuaW50LXgzLmxldHNlbmNyeXB0 Lm9yZy8wGgYDVR0RBBMwEYIPYXBpLmRvbnRlc3RhLml0MIH+BgNVHSAEgfYwgfMw CAYGZ4EMAQIBMIHmBgsrBgEEAYLfEwEBATCB1jAmBggrBgEFBQcCARYaaHR0cDov L2Nwcy5sZXRzZW5jcnlwdC5vcmcwgasGCCsGAQUFBwICMIGeDIGbVGhpcyBDZXJ0 aWZpY2F0ZSBtYXkgb25seSBiZSByZWxpZWQgdXBvbiBieSBSZWx5aW5nIFBhcnRp ZXMgYW5kIG9ubHkgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBDZXJ0aWZpY2F0ZSBQ b2xpY3kgZm91bmQgYXQgaHR0cHM6Ly9sZXRzZW5jcnlwdC5vcmcvcmVwb3NpdG9y eS8wDQYJKoZIhvcNAQELBQADggEBADNEpZ+ygBEZNaAM/gkNUeJWXFj8u91YupQN 4lSwg3mJxeHMn4fCxqW1hhpDb34K1t2YxnkYcOhhKGwLPBpRTUV25O0TNuIxQXEE OYYSa5izrt0kpatrtbwq64O7lAGvXdPBchK7hP/Y29oEjuyQoJy7KOX6YlSufR5r RG6v2EECwjzm1OuFxafTZ9OT1xr2cXXfFDsL7Dw8GBCwv+x3NRACd84jNfy1fjNp LhFKUUljvNDTUAliU6VT5B83yCBV5F2cQpd4JF7zTA/Z5abhNo6fKMJksCAMeDhm dY9su78cb9td0TGXXGMhWJSX1THewWVBZyFiVYYr+jkgKD4SP4Q= -----END CERTIFICATE-----
Il formato PKCS#12 Definisce il formato del file usato per conservare la chiave privata e i certificati pubblici, proteggendoli con una parola chiave. (Questo file non può essere usato direttamente da Apache)
Per creare il JKS utilizzando il certificato pubblico (quello ricevuto dalla CA) e la chiave privata, i passi da seguire sono i seguenti:
- Creare un archivio crittografico in formato PKCS#12 utilizzando i comandi OpenSSL.
- Creare il keystore JKS dall'archivio PKCS#12 utilizzando il keytool.
La Console 2 mostra i comandi da eseguire per portare a termine le azioni indicate sopra.
$ openssl pkcs12 -export -out api.dontesta.it.pfx \ -inkey api.dontesta.it.key.pem \ -in api.dontesta.it.cer.pem \ -certfile ca.cer.pem $ keytool -importkeystore -srckeystore api.dontesta.it.pfx \ -srcstoretype pkcs12 \ -destkeystore dontesta-karaf-server.jks \ -server -deststoretype jks \ -deststorepass changeit
Così facendo abbiamo ottenuto il keystore dontesta-karaf-server.jks pronto per essere installato sulla nostra istanza di Apache Karaf. Utilizzando il tool KeyStore Explorer è possibile in maniera più agevole creare il keystore partendo dal formato OpenSSL o PKCS#12 e altri formati supportati.
Installazione del keystore e test
Sulla nostra istanza di Apache Karaf (già configurata per il supporto SSL) installiamo il keystore dontesta-karaf-server.jks in ${karaf.etc}/keystore/. La configurazione per il supporto SSL che riporto a seguire rimane invariata.
javax.servlet.context.tempdir = /Users/amusarra/Progetti/Karaf/runtime/apache-karaf-4.0.8/data/pax-web-jsp org.ops4j.pax.web.config.file = /Users/amusarra/Progetti/Karaf/runtime/apache-karaf-4.0.8/etc/jetty.xml org.osgi.service.http.port = 8181 org.osgi.service.http.secure.enabled=true org.ops4j.pax.web.ssl.keystore=${karaf.etc}/keystore/dontesta-karaf-server.jks org.ops4j.pax.web.ssl.password=changeit org.ops4j.pax.web.ssl.keypassword=changeit
Avviamo il nostro Apache Karaf e successivamente puntiamo il browser all'indirizzo https://api.dontesta.it:8443/system/console/bundles o se preferite utilizziamo cURL in questo modo: curl -v https://api.dontesta.it:8443/system/console
.
In Figura 1 è mostrato il dettaglio del certificato che abbiamo appena installato su Apache Karaf, e subito a seguire l'output del comando curl. Dall'immagine è possibile notare due informazioni importanti, la catena di certificazione (o certificate chain) e il nome della CA che ha emesso il nostro certificato, oltre ad avere il "bollino verde".
Dall'output ricevuto dall'esecuzione del comando curl, ho evidenziato le righe che mostrano tutta la catena di certificazione (o certificate chain). Per coloro che sono più avvezzi all'utilizzo di cURL, ho evitato di specificare il parametro -k, utilizzato quando il server a cui vogliamo connetterci non dispone di un certificato SSL affidabile.
* Trying 127.0.0.1... * TCP_NODELAY set * Connected to api.dontesta.it (127.0.0.1) port 8443 (#0) * TLS 1.2 connection using TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 * Server certificate: api.dontesta.it * Server certificate: Let's Encrypt Authority X3 * Server certificate: DST Root CA X3 > GET /system/console HTTP/1.1 > Host: api.dontesta.it:8443 > User-Agent: curl/7.51.0 > Accept: */* > < HTTP/1.1 401 Unauthorized < Date: Mon, 06 Mar 2017 23:01:25 GMT < WWW-Authenticate: Basic realm="karaf" < Content-Length: 0 < Server: Jetty(9.2.19.v20160908) < * Curl_http_done: called premature == 0 * Connection #0 to host api.dontesta.it left intact
A questo punto possiamo affermare che l'installazione su Apache Karaf del nostro certificato SSL rilasciato da una CA riconosciuta è andata a buon fine.