Java: Import di un certificato SSL

Questo documento descrive i passi necessari per importare correttamente un certificato SSL per essere utilizzato nelle nostre applicazioni Java.

Un caso comune che richiede l'import di un certificato SSL è quando viene sollevata una exception quando tentiamo di invocare un sistema remoto richiede l'uso del protocollo SSL:

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: No trusted certificate found

Richiediamo al sistema esterno il certificato firmato ed opzionalmente il certificato dell'ente certificatore (chiamato solitamente Private Root CA).

In alternativa collegarsi con il proprio browser, all'url del sistema esterno e salvare il certificato cliccando sull'icona del lucchetto sulla barra degli indirizzi (o sulla barra di stato) ed esportare il certificato in formato X.509 (CER o PEM).

Per importare il certificato è necessario avere l'utente root, in quanto owner del keystore.

Possiamo dare al file del keystore i permessi 0777 in modo da poter effettuare questa operazione anche con un'utente non-root (in ambito aziendale chiedere al gestore della macchina se le policy permettono questa modifica):

# chmod 0777 $JAVA_HOME/jre/lib/security/cacerts

Per sicurezza facciamo il backup del file cacerts presente nella directory lib/security del JRE di Java:

# cp $JAVA_HOME/jre/lib/security/cacerts $JAVA_HOME/jre/lib/security/cacerts.orig

Importiamo il certificato nel keystore con il seguente comando:

# $JAVA_HOME/jre/bin/keytool \
  -importcert -keystore $JAVA_HOME/jre/lib/security/cacerts \
  -alias alias-cert -file /path/file.cer -trustcacerts

I parametri utilizzati sono:

-importcert Indica al keytool che vogliamo importare un nuovo certificato
-keystore Path del file cacerts del keystore
-alias Alias che vogliamo dare al certificato (opzionale)
-file Path del file del certificato del sistema esterno
-trustcacerts Indica al keytool che il certificato è valido (optionale)

Lanciando il comando ci verrà richiesta una password che di default è changeit.

Nel caso non è stato specificato l'opzione -trustcacerts, se il certificato è self-signed o firmato da un ente interno non riconosciuto verrà chiesto se considerare il certificato sicuro o meno.

Verifichiamo che il certificato sia stato importato correttamente:

# $JAVA_HOME/jre/bin/keytool \
  -keystore $JAVA_HOME/jre/lib/security/cacerts -list | grep "alias-cert"