Java usa un almacén de Autoridades Certificadoras (CA), Java trustStore, que es mantenido por la Java Development Kit (JDK). Cuando una aplicación Java se conecta a un servicio SSL/TLS, lo primero que hace es comprobar si el certificado está firmado por alguna de las CA albergadas en la trustStore. En caso de que el certificado no pueda ser validado por la trustStore en los logs se registrará un error similar a PKIX path building failed... unable to find valid certification path to requested target
.
Para comprobar si, efectivamente, los problemas de conexión se deben a la falta de una CA en la trustStore, se puede usar la clase de Java SSLPoke en dos sencillos pasos:
- Descargar SSLPoke.class
- Ejecutar
java SSLPoke host port
A continuación un ejemplo, usando SSLPoke
para validar una trustStore que aun no contiene la correspondiente CA.:
|
|
En caso de querer validar una trustStore distinta a la incluida por defecto en Java, $JAVA_HOME/lib/security/cacert
, se puede usar el parámetro -Djavax.net.ssl.trustStore=/path/truststore.jks
.
A continuación un ejemplo, usando SSLPoke
para validar una trustStore que contiene la correspondiente CA.:
|
|
Solucionar el problema PKIX path building failed
La solución consiste descargar los certificados de las CA e incluirlos en la trustStore de Java.
Descargar los certificados de las CA
El primer paso es descargar el certificado de las CA que lo firman. Esto se puede automatizar con el siguiente bloque, el cual permite descargar el certificado del sitio, de las CA Intermedias y de la CA final en formato PEM en archivos separados, donde cert01.pem equivale al certificado del sitio y los sucesivos cert0N.pem a las CA.
|
|
Ejemplo:
|
|
El primer certificado, cert01.pem, corresponde al certificado del servidor. Los restantes certificados, cert02.pem y cert03.pem en el ejemplo, corresponden a las CA.
Es posible comprobar los certificados mediante openssl x509 -text -noout -in cert.pem
, o bien limitar su salida a las partes que nos interesen como por ejemplo:
|
|
Importar los certificados de las CA en la trustStore:
El último paso es importar los certificados de las CA en la keyStore mediante keytool -import -trustcacerts -alias "My-Company CA" -file cert.pem -keystore /path/truststore.jks
.
Ejemplo:
|
|