Conexión a un servidor seguro en Java utilizando Apache Commons HttpClient 3.1 lanzando ValidatorException

StackOverflow https://stackoverflow.com/questions/1623924

  •  06-07-2019
  •  | 
  •  

Pregunta

Estoy intentando conectarme a un servidor seguro usando Apache Commons HttpClient 3.1 .
El problema es que cada vez que la aplicación se conecta arroja un

  

sun.security.validator.ValidatorException.

Aquí está el stacktrace :

  

javax.net.ssl.SSLHandshakeException:   sun.security.validator.ValidatorException: validación de ruta PKIX   falló: java.security.cert.CertPathValidatorException: asunto / emisor   error de verificación de encadenamiento de nombre javax.net.ssl.SSLHandshakeException:   sun.security.validator.ValidatorException: validación de ruta PKIX   falló: java.security.cert.CertPathValidatorException: asunto / emisor   verificación de encadenamiento de nombre fallida           en com.sun.net.ssl.internal.ssl.Alerts.getSSLException (Alerts.java:174)           en com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal (SSLSocketImpl.java:1611)           en com.sun.net.ssl.internal.ssl.Handshaker.fatalSE (Handshaker.java:187)           en com.sun.net.ssl.internal.ssl.Handshaker.fatalSE (Handshaker.java:181)           en com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate (ClientHandshaker.java:1035)           en com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage (ClientHandshaker.java:124)           en com.sun.net.ssl.internal.ssl.Handshaker.processLoop (Handshaker.java:516)           en com.sun.net.ssl.internal.ssl.Handshaker.process_record (Handshaker.java:454)           en com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord (SSLSocketImpl.java:884)           en com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake (SSLSocketImpl.java:1112)           en com.sun.net.ssl.internal.ssl.SSLSocketImpl.writeRecord (SSLSocketImpl.java:623)           en com.sun.net.ssl.internal.ssl.AppOutputStream.write (AppOutputStream.java:59)           en java.io.BufferedOutputStream.flushBuffer (BufferedOutputStream.java:65)           en java.io.BufferedOutputStream.flush (BufferedOutputStream.java:123)           en org.apache.commons.httpclient.methods.EntityEnclosingMethod.writeRequestBody (EntityEnclosingMethod.java:506)           en org.apache.commons.httpclient.HttpMethodBase.writeRequest (HttpMethodBase.java:2114)           en org.apache.commons.httpclient.HttpMethodBase.execute (HttpMethodBase.java:1096)           en org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry (HttpMethodDirector.java:398)           en org.apache.commons.httpclient.HttpMethodDirector.executeMethod (HttpMethodDirector.java:171)           en org.apache.commons.httpclient.HttpClient.executeMethod (HttpClient.java:397)           en org.apache.commons.httpclient.HttpClient.executeMethod (HttpClient.java:323)           en balanceschecker.connector.Connector.conn (Connector.java:27)           en balanceschecker.connector.Connector.RawPost (Connector.java:99)           en balanceschecker.connector.Connector.Post (Connector.java:111)           en balanceschecker.login.Login.Login (Login.java:87)           en balanceschecker.Main.main (Main.java:21) Causado por: sun.security.validator.ValidatorException: validación de ruta PKIX   falló: java.security.cert.CertPathValidatorException: asunto / emisor   verificación de encadenamiento de nombre fallida           en sun.security.validator.PKIXValidator.doValidate (PKIXValidator.java:251)           en sun.security.validator.PKIXValidator.doValidate (PKIXValidator.java:234)           en sun.security.validator.PKIXValidator.engineValidate (PKIXValidator.java:158)           en sun.security.validator.Validator.validate (Validator.java:218)           en com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.validate (X509TrustManagerImpl.java:126)           en com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted (X509TrustManagerImpl.java:209)           en com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted (X509TrustManagerImpl.java:249)           en com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate (ClientHandshaker.java:1014)           ... 21 más Causado por: java.security.cert.CertPathValidatorException: asunto / nombre del emisor   verificación de encadenamiento fallida           en sun.security.provider.certpath.PKIXMasterCertPathValidator.validate (PKIXMasterCertPathValidator.java:139)           en sun.security.provider.certpath.PKIXCertPathValidator.doValidate (PKIXCertPathValidator.java:326)           en sun.security.provider.certpath.PKIXCertPathValidator.engineValidate (PKIXCertPathValidator.java:178)           en java.security.cert.CertPathValidator.validate (CertPathValidator.java:250)           en sun.security.validator.PKIXValidator.doValidate (PKIXValidator.java:246)           ... 28 más

Aquí está el código que estoy usando (editado y compactado un poco)

installAllTrustManager();

PostMethod post = new PostMethod(server_path);
NameValuePair[] data = new NameValuePair {
   new NameValuePair("Username", username), 
   new NameValuePair("Password", password) 
};
        post.setRequestBody(data);
        post.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler(3, false));
try {
            HttpClient hc = new HttpClient();
            int result2 = hc.executeMethod(post);
            if (result2 != HttpStatus.SC_OK) {
                throw new IOException("HTTP Status Not OK: " + result2);
            }
            return post.getResponseBodyAsStream();
        } finally {
            post.releaseConnection();
        }

Eché un vistazo a los certificados del sitio y todavía son válidos por más de un año. Luego intenté omitir la verificación del certificado utilizando el código que se muestra en " Cómo para evitar el host de confianza y la verificación de certificados en Java " ;, sin embargo, la excepción aún se produce.

¿Qué estoy haciendo mal?
¿Cómo puedo conectarme con éxito al servidor?

¿Fue útil?

Solución

Este error significa que no puede validar la cadena de certificados. Las posibles causas son,

  1. El JRE no confía en la CA raíz.
  2. El certificado está firmado por un certificado intermedio pero el servidor no lo envía junto con el certificado.

Aquí es cómo obtener una lista de certificados raíz,

keytool -list -keystore $JAVA_HOME/lib/security/cacerts -v

No conozco ninguna forma de Java para verificar si se envía un certificado intermedio. Yo uso openssl para eso,

openssl s_client -host example.com -port 443

Le mostrará todos los certificados enviados por el servidor. Preste atención a "Cadena de certificados".

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top