Editar: - Intenté formatear la pregunta y acepté la respuesta de una manera más presentable en el mío Blog
Aquí está el problema original.
Recibo este error:
mensaje detallado sun.security.validator.ValidatorException: falló la construcción de la ruta PKIX:
sun.security.provider.certpath.SunCertPathBuilderException: no se pudo encontrar la ruta de certificación válida para el objetivo solicitadocausa javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: falló la construcción de la ruta PKIX: sun.security.provider.certpath.SunCertPathBuilderException: no se pudo encontrar la ruta de certificación válida para el objetivo solicitado
Estoy usando Tomcat 6 como servidor web. Tengo dos aplicaciones web HTTPS instaladas en diferentes Tomcats en diferentes puertos pero en la misma máquina. Di App1(port 8443)
y
App2(port 443)
. App1
se conecta a App2
. Cuando se App1
conecta a App2
me sale el error anterior. Sé que este es un error muy común, por lo que encontré muchas soluciones en diferentes foros y sitios. Tengo la siguiente entrada server.xml
de ambos Tomcats:
keystoreFile="c:/.keystore"
keystorePass="changeit"
Todos los sitios dicen la misma razón por la que el certificado otorgado por app2 no se encuentra en la tienda de confianza de app1 jvm. Esto parece ser cierto también cuando traté de golpear la misma URL en el navegador IE, funciona (con el calentamiento, hay un problema con el certificado de seguridad de este sitio web. Aquí digo que continúe con este sitio web). Pero cuando el cliente Java alcanza la misma URL (en mi caso) obtengo el error anterior. Para ponerlo en el almacén de confianza probé estas tres opciones:
Opción 1
System.setProperty("javax.net.ssl.trustStore", "C:/.keystore");
System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
Opción 2 Configuración a continuación en la variable de entorno
CATALINA_OPTS -- param name
-Djavax.net.ssl.trustStore=C:\.keystore -Djavax.net.ssl.trustStorePassword=changeit ---param value
Opción 3 Configuración a continuación en la variable de entorno
JAVA_OPTS -- param name
-Djavax.net.ssl.trustStore=C:\.keystore -Djavax.net.ssl.trustStorePassword=changeit ---param value
Pero nada funcionó .
Lo que finalmente funcionó es ejecutar el enfoque Java sugerido en Cómo manejar certificados SSL no válidos con Apache HttpClient? por Pascal Thivent, es decir, ejecutando el programa InstallCert.
Pero este enfoque está bien para la configuración de devbox, pero no puedo usarlo en el entorno de producción.
Me pregunto por qué tres enfoques mencionados anteriormente no funcionó cuando he mencionado los mismos valores en el server.xml
de app2
los valores del servidor y en el mismo almacén de confianza por el ajuste
System.setProperty("javax.net.ssl.trustStore", "C:/.keystore") and System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
en el app1
programa
Para obtener más información, así es como estoy haciendo la conexión:
URL url = new URL(urlStr);
URLConnection conn = url.openConnection();
if (conn instanceof HttpsURLConnection) {
HttpsURLConnection conn1 = (HttpsURLConnection) url.openConnection();
conn1.setHostnameVerifier(new HostnameVerifier() {
public boolean verify(String hostname, SSLSession session) {
return true;
}
});
reply.load(conn1.getInputStream());
domainname
mis servidores RHEL, el problema desapareció. Espero que ayude a alguien.