Ligar a servidor seguro em Java usando Apache Commons HttpClient ValidatorException 3.1 de arremesso

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

  •  06-07-2019
  •  | 
  •  

Pergunta

Eu estou tentando se conectar a um servidor seguro usando Apache Commons HttpClient 3.1.
O problema é sempre que o conecta aplicação que lança um

sun.security.validator.ValidatorException.

Aqui está o stacktrace :

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: validação do caminho PKIX falhou: java.security.cert.CertPathValidatorException: sujeito / emissor nomear encadeamento verificação falhou javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: validação do caminho PKIX falhou: java.security.cert.CertPathValidatorException: sujeito / emissor verificação do nome encadeamento falhou em com.sun.net.ssl.internal.ssl.Alerts.getSSLException (Alerts.java:174) em com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal (SSLSocketImpl.java:1611) em com.sun.net.ssl.internal.ssl.Handshaker.fatalSE (Handshaker.java:187) em com.sun.net.ssl.internal.ssl.Handshaker.fatalSE (Handshaker.java:181) em com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate (ClientHandshaker.java:1035) em com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage (ClientHandshaker.java:124) em com.sun.net.ssl.internal.ssl.Handshaker.processLoop (Handshaker.java:516) em com.sun.net.ssl.internal.ssl.Handshaker.process_record (Handshaker.java:454) em com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord (SSLSocketImpl.java:884) em com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake (SSLSocketImpl.java:1112) em com.sun.net.ssl.internal.ssl.SSLSocketImpl.writeRecord (SSLSocketImpl.java:623) em com.sun.net.ssl.internal.ssl.AppOutputStream.write (AppOutputStream.java:59) em java.io.BufferedOutputStream.flushBuffer (BufferedOutputStream.java:65) em java.io.BufferedOutputStream.flush (BufferedOutputStream.java:123) em org.apache.commons.httpclient.methods.EntityEnclosingMethod.writeRequestBody (EntityEnclosingMethod.java:506) em org.apache.commons.httpclient.HttpMethodBase.writeRequest (HttpMethodBase.java:2114) em org.apache.commons.httpclient.HttpMethodBase.execute (HttpMethodBase.java:1096) em org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry (HttpMethodDirector.java:398) em org.apache.commons.httpclient.HttpMethodDirector.executeMethod (HttpMethodDirector.java:171) em org.apache.commons.httpclient.HttpClient.executeMethod (HttpClient.java:397) em org.apache.commons.httpclient.HttpClient.executeMethod (HttpClient.java:323) em balanceschecker.connector.Connector.conn (Connector.java:27) em balanceschecker.connector.Connector.RawPost (Connector.java:99) em balanceschecker.connector.Connector.Post (Connector.java:111) em balanceschecker.login.Login.Login (Login.java:87) em balanceschecker.Main.main (Main.java:21) Causada por: sun.security.validator.ValidatorException: validação do caminho PKIX falhou: java.security.cert.CertPathValidatorException: sujeito / emissor verificação do nome encadeamento falhou em sun.security.validator.PKIXValidator.doValidate (PKIXValidator.java:251) em sun.security.validator.PKIXValidator.doValidate (PKIXValidator.java:234) em sun.security.validator.PKIXValidator.engineValidate (PKIXValidator.java:158) em sun.security.validator.Validator.validate (Validator.java:218) em com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.validate (X509TrustManagerImpl.java:126) em com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted (X509TrustManagerImpl.java:209) em com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted (X509TrustManagerImpl.java:249) em com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate (ClientHandshaker.java:1014) ... 21 mais Causada por: java.security.cert.CertPathValidatorException: assunto nome / emissor verificação encadeamento falhou em sun.security.provider.certpath.PKIXMasterCertPathValidator.validate (PKIXMasterCertPathValidator.java:139) em sun.security.provider.certpath.PKIXCertPathValidator.doValidate (PKIXCertPathValidator.java:326) em sun.security.provider.certpath.PKIXCertPathValidator.engineValidate (PKIXCertPathValidator.java:178) em java.security.cert.CertPathValidator.validate (CertPathValidator.java:250) em sun.security.validator.PKIXValidator.doValidate (PKIXValidator.java:246) ... mais 28

Aqui está o código que estou usando (editado e compactado um pouco)

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();
        }

Eu tinha um olhar para os certificados do site e eles ainda são válidos por mais de um ano. Então eu tentei ignorar a verificação de certificado usando o código mostrado na " Como desvio de confiança de acolhimento e cheque certificado em Java ", no entanto, a exceção ainda é lançada.

O que estou fazendo de errado?
Como posso me conectar com êxito ao servidor?

Foi útil?

Solução

Isto significa erro não pode validar a cadeia de certificados. As causas possíveis são,

  1. A CA raiz não é confiável para o JRE.
  2. O certificado é assinado por um cert intermediário mas o servidor não está enviando-o juntamente com o cert.

Aqui é como obter uma lista de cert raiz,

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

Eu não conheço nenhuma maneira Java para verificar se cert intermediário é enviado. Eu uso openssl para isso,

openssl s_client -host example.com -port 443

irá mostrar-lhe tudo o certificado enviado pelo servidor. Preste atenção à "cadeia de certificados".

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top