Keystore, truststore, JKS, PKCS#12: los términos
Las aplicaciones Java como Tomcat, Spring Boot, Jira, Keycloak o Elasticsearch no guardan los certificados como archivos sueltos sino en un keystore: un archivo protegido con contraseña y entradas con nombre (alias).
- Keystore: contiene tu propia clave privada con su certificado e intermedios. Con él se identifica un servidor (o un cliente con mTLS).
- Truststore: contiene solo certificados de CA de confianza. El truststore de Java se llama
cacertsy está en$JAVA_HOME/lib/security/. - JKS es el formato antiguo propio de Java. Desde Java 9 el estándar es PKCS#12 (.p12, .pfx), que también leen OpenSSL, Windows y los navegadores.
- JCEKS es una variante de JKS con mejor protección de claves que además puede guardar claves secretas (p. ej. AES).
Errores típicos y su significado
- «Keystore was tampered with, or password was incorrect»: la contraseña es incorrecta. Aquí aparece como comprobación de integridad fallida.
- «Cannot recover key» / «Given final block not properly padded»: en JKS, la clave tiene otra contraseña que el keystore. La herramienta pide entonces la contraseña de la clave.
- «PKIX path building failed» en el cliente: faltan los intermedios en el keystore del servidor o la CA raíz en el truststore del cliente. La herramienta muestra ambas cosas.
- El truststore se ignora aunque el certificado está dentro: los PKCS#12 creados con OpenSSL no tienen el atributo de confianza de Java, así que Java no ve los certificados como entradas de confianza. Los truststores creados aquí sí lo tienen.
- «Alias name does not identify a key entry»: el alias de la configuración apunta a un certificado suelto en lugar de a la clave.
Convertir JKS a PKCS#12
Abre el archivo, elige «PKCS#12» abajo, pon una contraseña y descárgalo. Después ajusta el tipo en la configuración, p. ej. certificateKeystoreType="PKCS12" en Tomcat o server.ssl.key-store-type=PKCS12 en Spring Boot. «PKCS#12 compatible» usa métodos antiguos (3DES, SHA-1) para Windows Server 2016, versiones antiguas de Java 8 y equipos que no leen AES en PKCS#12.
Si faltan intermedios, el conversor de certificados los añade. El comprobador SSL muestra después lo que envía de verdad el servidor, y la comprobación de claves verifica también si clave, certificado y CSR van juntos.
FAQ
¿Se sube mi keystore a algún sitio?
No. El archivo se lee y descifra en tu navegador; contraseñas y claves no salen de tu dispositivo. Una vez cargada, la página funciona también sin conexión.
¿Cuál es la contraseña de cacerts?
changeit por defecto. Desde Java 9, keytool accede directamente con la opción -cacerts, sin indicar la ruta.
¿Puedo recuperar una contraseña de keystore olvidada?
No. En JKS los certificados se muestran sin contraseña, pero las claves privadas no. Solo queda una clave y un certificado nuevos.
¿Por qué PKCS#12 solo tiene una contraseña?
En PKCS#12, Java usa la misma contraseña para el archivo y la clave, y muchos programas como Tomcat incluso lo exigen. Las contraseñas de clave separadas prácticamente solo existen en JKS.
¿Qué pasa con las claves secretas de JCEKS?
Se muestran pero no se incluyen, porque su contenido se guarda como objeto Java serializado. keytool -importkeystore puede pasarlas a PKCS#12.