Pour réaliser des appels à des partenaires ou valider une authentification, une application Java réalise des appels HTTP. Ces appels doivent être sécurisés en utilisant le HTTPS et l’application vérifie que le certificat est valide. Pour valider le certificat, nous avons besoin d’ajouter les certificats racines dans le keystore.

La première étape est d’extraire les certificats racine et intermédiaires à partir d’une URL. On télécharge la chaîne de certificats à partir de openssl puis on l’extrait pour le mettre dans un fichier spécifique.

echo | openssl s_client -showcerts -connect ${HOSTNAME}:${PORT} | \
   awk '/-----BEGIN CERTIFICATE-----/,/-----END CERTIFICATE-----/{print $0; if (/END CERTIFICATE/) print ""}' > "$CHAIN_FILE";
csplit -f cert- -n 2 "$CHAIN_FILE" '/END CERTIFICATE/+1' {2}

Récupération du nom du certificat pour l’injecter dans le keystore. Pour ce faire, on récupère le CN présent dans le certificat.

openssl x509 -in "$cert_file" -noout -subject -nameopt RFC2253 2>/dev/null | \
         sed -n 's/.*CN=\([^,]*\).*/\1/p'

Une fois les informations récupérées, on injecte dans le keystore de Java avec Keytool:

keytool -importcert -trustcacerts -cacerts -storepass "$keystore_password" -alias "$alias_name" -file "$cert_file" -noprompt

Compatible Java 9+

On utilise l’option -cacerts pour définir l’emplacement du cacerts de Java, qui a été introduite en version 9.

Le script complet est présent sur GitHub.