Saltar al contenido

Resolviendo javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: Error al crear la ruta PKIX ¿Error?

Si encuentras alguna incompatibilidad en tu código o proyecto, recuerda probar siempre en un entorno de testing antes añadir el código al proyecto final.

Solución:

Necesita agregar el certificado para Aplicación2 al archivo de almacén de confianza de la JVM utilizada ubicada en %JAVA_HOME%libsecuritycacerts.

Primero puede verificar si su certificado ya está en el almacén de confianza ejecutando el siguiente comando:
keytool -list -keystore "%JAVA_HOME%/jre/lib/security/cacerts" (no es necesario que proporcione una contraseña)

Si falta su certificado, puede obtenerlo descargándolo con su navegador y agregarlo al almacén de confianza con el siguiente comando:

keytool -import -noprompt -trustcacerts -alias -file -keystore -storepass

Ejemplo:
keytool -import -noprompt -trustcacerts -alias myFancyAlias -file /path/to/my/cert/myCert.cer -keystore /path/to/my/jdk/jre/lib/security/cacerts/keystore.jks -storepass changeit

Después de la importación, puede ejecutar el primer comando nuevamente para verificar si se agregó su certificado.

La información de Sun / Oracle se puede encontrar aquí.

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: error en la construcción de la ruta PKIX: sun.security.provider.certpath.SunCertPathBuilderException: no se puede encontrar la ruta de certificación válida para el destino solicitado

• Cuando recibí el error, intenté buscar en Google el significado de la expresión y encontré que este problema ocurre cuando un servidor cambia su certificado SSL HTTPS y nuestra versión anterior de Java no reconoce la autoridad de certificación raíz (CA). .

• Si puede acceder a la URL HTTPS en su navegador, entonces es posible actualizar Java para reconocer la CA raíz.

• En su navegador, vaya a la URL HTTPS a la que Java no pudo acceder. Haga clic en la cadena de certificados HTTPS (hay un icono de candado en Internet Explorer), haga clic en el candado para ver el certificado.

• Vaya a “Detalles” del certificado y “Copiar a archivo”. Copiarlo en Base64 (.cer) formato. Se guardará en su escritorio.

• Instale el certificado ignorando todas las alertas.

• Así es como reuní la información del certificado de la URL a la que intentaba acceder.

Ahora tenía que hacer mi versión de Java para conocer el certificado para que no se niegue a reconocer la URL. A este respecto, debo mencionar que busqué en Google que la información del certificado raíz permanece de forma predeterminada en el JDK jre lib seguridad ubicación, y la contraseña predeterminada para acceder es: cambialo.

Para ver la información de los cacerts, los siguientes son los procedimientos a seguir:

• Haga clic en el botón Inicio -> Ejecutar

• Escriba cmd. Se abre el símbolo del sistema (es posible que deba abrirlo como administrador).

• Ir a tu Java/jreX/bin directorio

• Escriba lo siguiente

keytool -list -keystore D: Java jdk1.5.0_12 jre lib security cacerts

Proporciona la lista de los certificados actuales contenidos en el almacén de claves. Se parece a esto:

C: Documents and Settings NeelanjanaG> keytool -list -keystore D: Java jdk1.5.0_12 jre lib security cacerts

Ingrese la contraseña del almacén de claves: changeit

Tipo de almacén de claves: jks

Proveedor de almacén de claves: SUN

Su almacén de claves contiene 44 entradas

verisignclass3g2ca, 26 de marzo de 2004, TrustCertEntry,

Huella digital de certificado (MD5): A2: 33: 9B: 4C: 74: 78: 73: D4: 6C: E7: C1: F3: 8D: CB: 5C: E9

entrustclientca, 9 de enero de 2003, TrustCertEntry,

Huella digital de certificado (MD5): 0C: 41: 2F: 13: 5B: A0: 54: F5: 96: 66: 2D: 7E: CD: 0E: 03: F4

thawtepersonalbasicca, 13 de febrero de 1999, TrustCertEntry,

Huella digital de certificado (MD5): E6: 0B: D2: C9: CA: 2D: 88: DB: 1A: 71: 0E: 4B: 78: EB: 02: 41

addtrustclass1ca, 1 de mayo de 2006, TrustCertEntry,

Huella digital de certificado (MD5): 1E: 42: 95: 02: 33: 92: 6B: B9: 5F: C0: 7F: DA: D6: B2: 4B: FC

verisignclass2g3ca, 26 de marzo de 2004, TrustCertEntry,

Huella digital de certificado (MD5): F8: BE: C4: 63: 22: C9: A8: 46: 74: 8B: B8: 1D: 1E: 4A: 2B: F6

• Ahora tenía que incluir el certificado previamente instalado en los cacerts.

• Para ello el siguiente es el procedimiento:

keytool –import –noprompt –trustcacerts –alias ALIASNAME -file FILENAME_OF_THE_INSTALLED_CERTIFICATE -keystore PATH_TO_CACERTS_FILE -storepass PASSWORD

Si está utilizando Java 7:

keytool –importcert –trustcacerts –alias ALIASNAME -file PATH_TO_FILENAME_OF_THE_INSTALLED_CERTIFICATE -keystore PATH_TO_CACERTS_FILE -storepass changeit

• Luego agregará la información del certificado en el archivo cacert.

¡Es la solución que encontré para la excepción mencionada anteriormente!

Cómo trabajarlo en Tomcat 7

Quería admitir un certificado autofirmado en una aplicación Tomcat, pero el siguiente fragmento no funcionó

import java.io.DataOutputStream;
import java.net.HttpURLConnection;
import java.net.URL;

public class HTTPSPlayground 
    public static void main(String[] args) throws Exception 

        URL url = new URL("https:// ... .com");
        HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();

        httpURLConnection.setRequestMethod("POST");
        httpURLConnection.setRequestProperty("Accept-Language", "en-US,en;q=0.5");
        httpURLConnection.setDoOutput(true);
        DataOutputStream wr = new DataOutputStream(httpURLConnection.getOutputStream());

        String serializedMessage = "";
        wr.writeBytes(serializedMessage);
        wr.flush();
        wr.close();

        int responseCode = httpURLConnection.getResponseCode();
        System.out.println(responseCode);
    

esto es lo que resolvió mi problema:

1) Descarga el .crt expediente

echo -n | openssl s_client -connect :443 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > ~/.crt
  • reemplazar con su dominio (p. ej. jossef.com)

2) Aplicar el .crt archivo en Java cacerts almacén de certificados

keytool -import -v -trustcacerts -alias  -file ~/.crt -keystore /jre/lib/security/cacerts -keypass changeit -storepass changeit
  • reemplazar con su dominio (p. ej. jossef.com)
  • reemplazar con su directorio de inicio de Java

3) Hackearlo

Aunque instalé mi certificado en Javaalmacenes de certificados predeterminados, Tomcat ignora eso (parece que no está configurado para usar los almacenes de certificados predeterminados de Java).

Para piratear esto, agregue lo siguiente en algún lugar de su código:

String certificatesTrustStorePath = "/jre/lib/security/cacerts";
System.setProperty("javax.net.ssl.trustStore", certificatesTrustStorePath);

// ...

Comentarios y valoraciones del tutorial

Eres capaz de añadir valor a nuestra información dando tu veteranía en las reseñas.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *