Estoy intentando leer desde una página web segura (es decir, SSL) en código Java. Estoy tratando de usar tanto URLConnection (java.net) como HTTPClient de Apache. En ambos casos, cuando hago la solicitud, me sale esta excepción:No se puede autenticar en el sitio SSL en java: "pathLenConstraint violado - este certificado debe ser el último certificado en la ruta de certificación"
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: validación de rutas PKIX falló: java.security. cert.CertPathValidatorException: restricciones básicas Fallo de la verificación: pathLenConstraint violó - este cert debe ser la última cert en el camino certificación en com.sun.net.ssl.internal.ssl.Alerts.getSSLException (Alerts.java:150) en com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal (SSLSock) etImpl.java:1518) en com.sun.net.ssl.internal.ssl.Handshaker.fatalSE (Handshaker.java:174) en com.sun.net.ssl.internal.ssl.Handshaker.fatalSE (Handshaker.java:168) en com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate (ClientHandshaker.java:848) en com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage (ClientHandshaker.java:106) en com.sun.net.ssl.internal.ssl.Handshaker.processLoop (Handshaker.java:495) en com.sun.net.ssl.internal.ssl.Handshaker.process_record (Handshaker.java:433) en com.sun.net.ssl.internal.ssl.SSLSocketIm pl.readRecord (SSLSocketImpl.java:818) en com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake (SSLSocketImpl.java:1030) en com.sun.net.ssl.internal.ssl. SSLSocketImpl.startHandshake (SSLSocketImpl.java:1057) en com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake (SSLSocketImpl.java:1041) en sun.net.www.protocol.https.HttpsClient. afterConnect (HttpsClient.java:402) en sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect (AbstractDelegateHttpsURLConnection.java:166) en sun.net.www.protocol.http.HttpURLConnection.getInputStream (HttpURLConnection. java: 934) en sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream (HttpsURLConnectionImpl.java:234) en com.sap.river.coghead.rest.Main.testJavaHTTPConnection (Main.java:45) en com .sap.river.coghead.rest.Main.main (Main.java:32) Causado por: sun.security.validator.ValidatorException: validación de rutas no PKIX: java.security.cert.CertPathValidatorException: restricciones básicas error de comprobación: violación de pathLenConstraint: este certificado debe ser el último certificado en la ruta de certificación en sun.security.validator.PKIXValidator.doValidate (PKIXValida) tor.java:187) en sun.security.validator.PKIXValidator.engineValidate (PKIXValidator.java:139) en sun.security.validator.Validator.validate (Validator.java:203) en com.sun .net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted (X509TrustManagerImpl.java:172) en com.sun.net.ssl.internal.ssl.JsseX509TrustManager.checkServerTrusted (SSLContextImpl.java: 320) en com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate (ClientHandshaker.java:841) ... 13 más causada por: java.security.cert.CertPathValidatorException: restricciones básicas comprobación erróneo: pathLenConstraint violó - este cert debe ser la última cert en el camino certificación en sun.security.provider.certpath.PKIXMasterCertPathValidator.validate (PKIXMasterCertPathValidator.java:139) en sun.security.provider.certpath .PKIXCertPathValidator.doValidate (PKIXCertPathValidator.java:316) en sun.security.provider.certpath.PKIXCertPathValidator.engineValidate (PKIXCert) PathValidator.java:178) en java.security.cert.CertPathValidator.validate (CertPathValidator.java:206) en sun.security.validator.PKIXValidator.doValidate (PKIXValidator.java:182) ... 18 más
Sin embargo, tenga en cuenta que he logrado establecer una conexión que no sea SSL, aunque para un host diferente. También puedo ver esta página usando el navegador: los certificados se validan correctamente allí.
¿Debo cambiar de algún modo el orden de los certificados a medida que se recuperan del servidor? ¿Hay alguna configuración que me falta?
Gracias de antemano,
Lior
No sé si esto ayuda, pero Java le permite cambiar la SLLSocketFactory defecto. – Powerlord
sí, me imagino que necesito hacer algo en esa área. Solo necesito investigarlo más a fondo. Gracias de todos modos, - Lior – Lior
FYI, la contraseña para el almacén de claves de certificados Java predeterminado $ JAVA_HOME/lib/security/cacerts es 'changeit' –