Dans Développement local en HTTPS avec nginx et Docker nous avions généré une autorité de certification locale et un certificat émis par cette autorité pour utiliser du https en local pendant le développement d’une application web.
Comme vous le savez peut-être en ayant lu précédemment mon billet Application modulaire Java et dépendances automodule .jar, je travaille actuellement (oui, c’est toujours actuel même si c’est vrai que ça fait un petit moment maintenant 😏) à la ré-écriture de l’application Opencomp Genie en JavaFX.
C’est dans ce contexte que j’ai eu besoin d’ajouter l’autorité de certification locale précédemment générée au magasin de confiance (truststore) de la machine virtuelle java utilisée par l’application à l’exécution.
Comme le certificat que l’on utilise n’est pas émis par une autorité de certification « tierce » de « confiance » mais par notre autorité de certification locale, lors de l’appel au code suivant :
URL url = URI.create("https://my.opencomp.local/users/profile.json").toURL();
HttpsURLConnection connection = (HttpsURLConnection)url.openConnection();
connection.setRequestMethod("GET");
connection.connect();
une exception IOException
sera levée avec pour message :
PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
En ajoutant l’autorité de certification locale précédemment générée au magasin de confiance (truststore), l’application java peut faire appel à l’API de mon application Web en local avec une URL de type https://my.opencomp.local/
sans erreur car la machine virtuelle java saura que le certificat présenté par l’application Web est bien « de confiance ».
Identifier la JVM pour laquelle on veut modifier le cacerts
Avant d’effectuer l’opération à proprement parler, il faut d’abord savoir où se situe la JVM que l’on utilise avec l’appli. Pour cela, depuis l’application Java, on peut utiliser un petit code de ce style :
System.out.println(ProcessHandle.current()
.info()
.command()
.orElseThrow());
A l’exécution, cela devrait vous retourner le chemin de la JVM utilisée par l’application, ici :
/home/jtraulle/.jdks/temurin-21.0.6/bin/java
(où /home/jtraulle/.jdks
est le chemin où IntelliJ IDEA Community stocke les JDK).
Ajouter l’autorité de certification locale au cacerts
Désormais, on n’a plus qu’à ajouter le certificat de notre autorité de certification racine locale aux autorités de certification de confiance de notre JVM :
cd /home/jtraulle/.jdks/temurin-21.0.6/bin
./keytool -import -trustcacerts -alias ca_localhost \
-file /home/jtraulle/Sites/opencomp/certs/ca.crt \
-keystore /home/jtraulle/.jdks/temurin-21.0.6/lib/security/cacerts \
-storepass changeit