article info
Published
October 29, 2015
Category
home > java > Java, SSL, et la cryptique erreur PKIX path building failed

Java, SSL, et la cryptique erreur PKIX path building failed

L'erreur PKIX path building failed (unable to find valid certification path to requested target) apparait quand Java échoue à établir une connexion SSL avec un server distant. Plus précisement, Java ne trouve pas dans son Trust Store (sur votre machine local) de certificat permettant de valider l'identité du server et ainsi refuse la connexion. Il y a plusieurs manières de résoudre le problème, l'une d'elle étant d'installer le certificat manquant.

Tout d'abord, il est bon d'avoir un moyen de reproduire rapidement l'erreur, sans avoir par exemple à lancer son serveur d'application et à se placer dans le bon context. Pour cela vous pouvez utiliser cette petite class utilitaire SSLPoke.

L'utilisation est assez simple:

<JAVA_HOME>/bin/java SSLPoke example.com 443

En exécutant la commande, vous devriez retomber sur l'exception PKIX path building failed.

Il est temps maintenant de télécharger le certificat manquant. Le plus simple sur unix est d'utiliser la commande openssl couplé à sed pour obtenir un fichier correct au format .crt.

openssl s_client -connect example.com:443 < /dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > public.crt

Il est également possible d'utiliser votre navigateur web et d'exporter le fichier.

L'importation du certificat dans le Trust Store se fait via l'utilitaire java keytool.

<JAVA_HOME>/bin/keytool -import -alias <server_name> -keystore <JAVA_HOME>/jre/lib/security/cacerts -file public.crt

La valeur pour <server_name> n'est pas très importante tant que vous n'utilisez pas une valeur déjà présente dans le Trust Store.

keytool va vous demander un mot de passe pour ajouter le certificat, par défaut celui-ci a la valeur changeit.

Si tout c'est bien passé, l'output de SSLPoke doit maintenant être Successfully connected.

Si toutefois l'erreur persiste, il reste une chose à vérifier: est ce que java utilise bien cacerts comme Trust Store. En effet, sur certaines installations, java utilise de préférence le fichier jssecacerts.

Pour en avoir le coeur net, forçons l'utilisation de cacerts:

<JAVA_HOME>/bin/java -Djavax.net.ssl.trustStore=<JAVA_HOME>/jre/lib/security/cacerts SSLPoke example.com 443

Si vous n'avez plus l'exception, cela signifie bien que java n'utilise pas cacerts. Il faut donc installer le certificat dans le fichier jssecacerts:

<JAVA_HOME>/bin/keytool -import -alias <server_name> -keystore <JAVA_HOME>/jre/lib/security/jssecacerts -file public.crt