Importar un certificado en el truststore de Java (cacerts)

Cuando una aplicación Java habla con un servidor cuya CA no conoce, aparece «PKIX path building failed». La solución es añadir la CA al truststore. Hay una vía rápida y otra duradera.

¿Dónde está cacerts?

La contraseña por defecto es changeit. Qué archivo usa realmente una aplicación lo muestra -Djavax.net.debug=ssl:trustmanager.

¿Qué certificado importar?

Importa la CA raíz de tu empresa (o la CA intermedia emisora), no el certificado del servidor. Un certificado de servidor deja de valer en cada cambio; la CA dura años. La CA te la da TI o la sacas de la cadena del servidor. El comprobador SSL muestra todos los certificados y los descarga en PEM.

El comando keytool

# Java 9 o superior
keytool -importcert -cacerts -alias raiz-empresa -file raiz-empresa.crt -storepass changeit -noprompt

# Java 8
keytool -importcert -keystore "$JAVA_HOME/jre/lib/security/cacerts" \
  -alias raiz-empresa -file raiz-empresa.crt -storepass changeit -noprompt

# comprobar y volver a quitar
keytool -list -cacerts -alias raiz-empresa -storepass changeit
keytool -delete -cacerts -alias raiz-empresa -storepass changeit

El archivo puede ser PEM o DER. En Linux y macOS normalmente necesitas sudo, porque cacerts pertenece al JDK. Después reinicia la aplicación: Java solo lee el truststore al arrancar.

La vía duradera en Linux

Una actualización del JDK sustituye cacerts y tu cambio desaparece. Por eso los paquetes de Debian, Ubuntu, RHEL y Fedora generan cacerts a partir del almacén de certificados del sistema. Añade la CA ahí y vale para Java, curl, Python y todo lo demás a la vez:

# Debian, Ubuntu (extensión .crt, formato PEM)
sudo cp raiz-empresa.crt /usr/local/share/ca-certificates/
sudo update-ca-certificates

# RHEL, Rocky, Alma, Fedora
sudo cp raiz-empresa.crt /etc/pki/ca-trust/source/anchors/
sudo update-ca-trust

Esto funciona con los paquetes Java de la distribución. Un JDK descomprimido a mano (por ejemplo en /opt) trae su propio cacerts. Modifícalo con keytool o apunta al almacén del sistema con -Djavax.net.ssl.trustStore=/etc/ssl/certs/java/cacerts (Debian) o /etc/pki/ca-trust/extracted/java/cacerts (RHEL).

En imágenes Docker

Las imágenes oficiales eclipse-temurin pueden incorporar CA al arrancar. Coloca los certificados en /certificates y define USE_SYSTEM_CA_CERTS=1:

docker run -e USE_SYSTEM_CA_CERTS=1 -v ./ca:/certificates:ro mi-app

# o fijo en la imagen
FROM eclipse-temurin:21-jre
COPY raiz-empresa.crt /usr/local/share/ca-certificates/
RUN update-ca-certificates

Con otras imágenes base, usa el comando keytool de arriba en el Dockerfile.

Un truststore propio en lugar de cacerts

Si no quieres tocar el JDK, dale a la aplicación su propio truststore. Importante: sustituye a cacerts y solo contiene lo que metas. Lo más fácil es copiar cacerts y añadir la CA:

cp "$JAVA_HOME/lib/security/cacerts" truststore.p12
keytool -importcert -keystore truststore.p12 -storepass changeit -alias raiz-empresa -file raiz-empresa.crt -noprompt
java -Djavax.net.ssl.trustStore=truststore.p12 -Djavax.net.ssl.trustStorePassword=changeit -jar app.jar

Un truststore solo con determinadas CA se crea en el asistente de keystores Java, en «PEM y respuesta de la CA»: pega los certificados de CA, guarda como truststore y listo.

FAQ

¿Tengo que cambiar la contraseña changeit?

No necesariamente en cacerts. Solo protege contra cambios, no contra la lectura, y el contenido son certificados públicos. Lo importante es que solo los administradores puedan escribir el archivo.

«Certificate was added to keystore», pero no cambia nada

Normalmente se modificó otro cacerts distinto del que usa la aplicación, por ejemplo con varios JDK instalados. Comprueba el archivo con -Djavax.net.debug=ssl:trustmanager.

¿Vale también para Tomcat, Jenkins o Maven?

Sí, todos usan el truststore del runtime Java con el que arrancan. En Maven es la JVM de JAVA_HOME o MAVEN_OPTS.

¿Puedo usar la CA de empresa del almacén de Windows?

Sí, con -Djavax.net.ssl.trustStoreType=Windows-ROOT Java lee el almacén de certificados de Windows. No hace falta importar nada.