validate that received not net manager handshake_failure fatal does disable create chains certificates all accept java exception ssl certificate

that - La creación de rutas PKIX falló en la aplicación Java



javax.net.ssl.sslhandshakeexception android (5)

He estado luchando durante casi una semana para que mis aplicaciones funcionen después de mover mis aplicaciones de Windows 2000 a Windows 2008 R2 Server.

El procedimiento:

  1. Java JDK instalado 1.7.0_25
  2. Establezca la variable de entorno del sistema JAVA_HOME en C:/Progra~1/Java/jdk1.7.0_25/
  3. Importó el certificado en cacerts con keytool
  4. Se aseguró de que el certificado exista en keytool con -list .

Intenté repetir el paso 3 con InstallCert para asegurarme de que no había estropeado nada.

Los métodos anteriores no resolvieron mi problema, así que traté de hacerlo programáticamente:

System.setProperty("javax.net.ssl.trustStore", "C:/Progra~1/Java/jdk1.7.0_25/jre/lib/security/cacerts"); System.setProperty("javax.net.ssl.trustStorePassword", "changeit");

Aún sin suerte. Estoy atascado y no estoy seguro de qué dirección tomar desde aquí.

Stack trace:

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target at sun.security.ssl.Alerts.getSSLException(Alerts.java:192) at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1886) at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:276) at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:270) at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1341) at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:153) at sun.security.ssl.Handshaker.processLoop(Handshaker.java:868) at sun.security.ssl.Handshaker.process_record(Handshaker.java:804) at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1016) at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1312) at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1339) at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1323) at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:515) at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185) at sun.net.www.protocol.https.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:153) at util.SMS.send(SMS.java:93) at domain.ActivationSMSSenderMain.sendActivationMessagesToCustomers(ActivationSMSSenderMain.java:80) at domain.ActivationSMSSenderMain.<init>(ActivationSMSSenderMain.java:44) at domain.ActivationSMSSenderMain.main(ActivationSMSSenderMain.java:341) Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:385) at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:292) at sun.security.validator.Validator.validate(Validator.java:260) at sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:326) at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:231) at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:126) at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1323) ... 14 more Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:196) at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:268) at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:380) ... 20 more

ACTUALIZAR:

Both System.out.println(System.getProperty("javax.net.ssl.trustStore")); y System.out.println(System.getProperty("javax.net.ssl.keyStore"));

devuelve null .



Ha importado el certificado al almacén de confianza del JRE provisto en el JDK, pero está ejecutando el java.exe del JRE instalado directamente.

EDITAR

Para mayor claridad, y para resolver el enredo de malentendidos en el comentario a continuación, debe importar el certificado al archivo cacerts del JRE que tiene la intención de usar, y que rara vez será el único que se envía dentro del JDK, porque los clientes normalmente no tendrá un JDK. Cualquier cosa en el comentario a continuación que sugiera lo contrario debería ser ignorada ya que no expresa mi intención aquí.

Una solución mucho mejor sería crear su propio almacén de confianza, comenzando con una copia del archivo de cacerts , y específicamente decirle a Java que use ese a través de la propiedad del sistema javax.net.ssl.trustStore.

Debe hacer que esta parte del proceso de construcción se desarrolle para mantenerse actualizado con los cambios del archivo de cacerts causados ​​por las actualizaciones de JDK.


Me encontré con problemas similares cuya causa y solución resultaron ser bastante simples:

Causa principal : no importó el certificado apropiado utilizando la herramienta de claves

NOTA: solo importe certificados de CA raíz (o sus propios firmados)

NOTA: no importe un certificado de raíz de cadena intermedio que no sea certificado

Ejemplo de solución para imap.gmail.com

  1. Determine el certificado raíz de CA:

    openssl s_client -showcerts -connect imap.gmail.com:993

    en este caso, encontramos que la CA raíz es Equifax Secure Certificate Authority

  2. Descargar root CA cert .
  3. Verifique que el certificado descargado tenga las huellas dactilares correctas de SHA-1 y / o MD5 comparando con la información que se encuentra aquí.
  4. javax.net.ssl.trustStore importación para javax.net.ssl.trustStore :

    keytool -import -alias gmail_imap -file Equifax_Secure_Certificate_Authority.pem

  5. Ejecute su código java

Según su pastebin, debe agregar el certificado proxy.tkk.com al almacén de confianza.


Si está utilizando Eclipse, simplemente realice una verificación cruzada en Eclipse Windows -> preferencias ----> java ---> JRE instalados señala el JRE actual y el JRE donde ha configurado su certificado. Si no, elimina el JRE y agrega el jre donde está instalado tu certificado