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:
- Java JDK instalado 1.7.0_25
- Establezca la variable de entorno del sistema
JAVA_HOME
enC:/Progra~1/Java/jdk1.7.0_25/
- Importó el certificado en cacerts con
keytool
- 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
.
En mi caso, el problema se resolvió instalando el JDK 10 oficial de Oracle en lugar de usar el OpenJDK predeterminado que venía con mi Ubuntu. Esta es la guía que seguí: https://www.linuxuprising.com/2018/04/install-oracle-java-10-in-ubuntu-or.html
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
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
- Descargar root CA cert .
- 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í.
javax.net.ssl.trustStore
importación parajavax.net.ssl.trustStore
:keytool -import -alias gmail_imap -file Equifax_Secure_Certificate_Authority.pem
- 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