2009-05-06 7 views
7

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

Respuesta

6

me clavaron en más y la respuesta radica en el hecho de que tenía que importar los certificados necesarios en el almacén de claves utilizado por la JVM para autenticar SSL. El almacén de claves es el archivo 'cacerts' en la carpeta jre/lib/security en el jre que se utiliza para ejecutar el programa.

Exporté manualmente los certificados del sitio, todos ellos.
Luego lo importé a mi almacén de claves predeterminado utilizando la utilidad 'keytool' proporcionada por Sun. Tenga en cuenta que debe importarlos en el orden correcto.
Luego coloqué el nuevo almacén de claves en lugar del de JRE, y funcionó.

Supongo que hubiera sido mejor importar los certificados directamente al almacén de claves de JRE, pero la herramienta me pidió una contraseña que no sabía.

Creo que también hay una forma de programar esto más fácilmente, pero aún no lo hemos encontrado. Estaré encantado de obtener algunos punteros (clase TrustManager en JSSE?).

Finalmente, algo de crédito. Este post aquí: http://javaishdiscoveries.blogspot.com/2009/02/battle-with-cacerts-and-https.html me ayudó a orientarme en la dirección correcta.

+0

No sé si esto ayuda, pero Java le permite cambiar la SLLSocketFactory defecto. – Powerlord

+0

sí, me imagino que necesito hacer algo en esa área. Solo necesito investigarlo más a fondo. Gracias de todos modos, - Lior – Lior

+2

FYI, la contraseña para el almacén de claves de certificados Java predeterminado $ JAVA_HOME/lib/security/cacerts es 'changeit' –

0

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: validación de ruta de PKIX fallida: java.security.cert.CertPathValidatorException: limitaciones básicas de comprobación erróneo: pathLenConstraint violó - este certificado debe ser el último certificado en la ruta de certificación en

pathLenConstraint

See (Nota sobre cadenas de certificados) en

http://groups.google.com/group/google-checkout-developers-forum/web/google-checkout-and-ssl-certificates?version=49

Google dice que puede haber un problema con el orden de la cadena de certificados. Acabo de descubrir que mi certificado no está en orden, no está arreglado todavía, no está trabajando en eso. Lo actualizaré más tarde.


antiguo puesto:

tienen casi el mismo problema.

Agregar certificado de forma manual a keystore ayuda, pero prefiero hacerlo más automáticamente, con mi cliente.

Así que mi solución:

usaré almacén de claves sólo para ésta aplicación, y no existe un host 1. almacén de claves - crear con contraseña generada 2. Guardar contraseña en el archivo de configuración 3. piden usuario (o no) si desea aceptar este certificado 4. en caso afirmativo, guárdelo en el almacén de claves y úselo cuando sea necesario

¿Es esta una buena solución? ¿Algún comentario?

Cuestiones relacionadas