Où se trouve cacerts ?
- Java 9 et plus :
$JAVA_HOME/lib/security/cacerts - Java 8 :
$JAVA_HOME/jre/lib/security/cacerts
Le mot de passe par défaut est changeit. Le fichier réellement utilisé par une application s’affiche avec -Djavax.net.debug=ssl:trustmanager.
Quel certificat importer ?
Importe l’AC racine de ton entreprise (ou l’AC intermédiaire émettrice), pas le certificat du serveur. Un certificat serveur devient invalide à chaque changement ; l’AC dure des années. Tu obtiens l’AC auprès de l’IT ou dans la chaîne du serveur. La vérification SSL affiche tous les certificats et les télécharge en PEM.
La commande keytool
# Java 9 et plus keytool -importcert -cacerts -alias racine-entreprise -file racine-entreprise.crt -storepass changeit -noprompt # Java 8 keytool -importcert -keystore "$JAVA_HOME/jre/lib/security/cacerts" \ -alias racine-entreprise -file racine-entreprise.crt -storepass changeit -noprompt # vérifier puis supprimer keytool -list -cacerts -alias racine-entreprise -storepass changeit keytool -delete -cacerts -alias racine-entreprise -storepass changeit
Le fichier peut être en PEM ou DER. Sous Linux et macOS, il faut en général sudo, car cacerts appartient au JDK. Redémarre ensuite l’application : Java ne lit le truststore qu’au démarrage.
La méthode durable sous Linux
Une mise à jour du JDK remplace cacerts et ta modification disparaît. Les paquets Debian, Ubuntu, RHEL et Fedora génèrent donc cacerts à partir du magasin de certificats du système. Ajoute l’AC à celui-ci et elle vaut pour Java, curl, Python et tous les autres :
# Debian, Ubuntu (extension .crt, format PEM) sudo cp racine-entreprise.crt /usr/local/share/ca-certificates/ sudo update-ca-certificates # RHEL, Rocky, Alma, Fedora sudo cp racine-entreprise.crt /etc/pki/ca-trust/source/anchors/ sudo update-ca-trust
Cela fonctionne pour les paquets Java de la distribution. Un JDK décompressé à la main (par ex. sous /opt) a son propre cacerts. Modifie-le avec keytool ou pointe vers le magasin système avec -Djavax.net.ssl.trustStore=/etc/ssl/certs/java/cacerts (Debian) ou /etc/pki/ca-trust/extracted/java/cacerts (RHEL).
Dans les images Docker
Les images officielles eclipse-temurin savent reprendre des AC au démarrage. Place les certificats dans /certificates et définis USE_SYSTEM_CA_CERTS=1 :
docker run -e USE_SYSTEM_CA_CERTS=1 -v ./ca:/certificates:ro mon-app # ou directement dans l’image FROM eclipse-temurin:21-jre COPY racine-entreprise.crt /usr/local/share/ca-certificates/ RUN update-ca-certificates
Avec d’autres images de base, utilise la commande keytool ci-dessus dans le Dockerfile.
Un truststore séparé au lieu de cacerts
Si tu ne veux pas toucher au JDK, donne à l’application son propre truststore. Important : il remplace cacerts et ne contient que ce que tu y mets. Le plus simple est de copier cacerts et d’y ajouter l’AC :
cp "$JAVA_HOME/lib/security/cacerts" truststore.p12 keytool -importcert -keystore truststore.p12 -storepass changeit -alias racine-entreprise -file racine-entreprise.crt -noprompt java -Djavax.net.ssl.trustStore=truststore.p12 -Djavax.net.ssl.trustStorePassword=changeit -jar app.jar
Un truststore limité à certaines AC se crée dans l’assistant keystore Java, onglet « PEM & réponse AC » : colle les certificats d’AC, enregistre en truststore, terminé.
FAQ
Faut-il changer le mot de passe changeit ?
Pas forcément pour cacerts. Il protège seulement contre la modification, pas la lecture, et le contenu est fait de certificats publics. L’important est que seuls les administrateurs puissent écrire le fichier.
« Certificate was added to keystore », mais rien ne change ?
En général, un autre cacerts a été modifié que celui utilisé par l’application, par ex. avec plusieurs JDK installés. Vérifie le fichier avec -Djavax.net.debug=ssl:trustmanager.
Cela vaut-il pour Tomcat, Jenkins ou Maven ?
Oui, ils utilisent tous le truststore du runtime Java avec lequel ils démarrent. Pour Maven, c’est la JVM de JAVA_HOME ou de MAVEN_OPTS.
Puis-je reprendre l’AC d’entreprise depuis le magasin Windows ?
Oui, avec -Djavax.net.ssl.trustStoreType=Windows-ROOT, Java lit le magasin de certificats Windows. Aucun import n’est nécessaire.