Connessione a Secure Server in Java tramite Apache Commons HttpClient 3.1 con ValidatorException

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

  •  06-07-2019
  •  | 
  •  

Domanda

Sto provando a connettermi a un server sicuro usando Apache Commons HttpClient 3.1 .
Il problema si presenta ogni volta che l'applicazione connette genera un

  

sun.security.validator.ValidatorException.

Ecco il stacktrace :

  

javax.net.ssl.SSLHandshakeException:   sun.security.validator.ValidatorException: convalida del percorso PKIX   non riuscito: java.security.cert.CertPathValidatorException: subject / issuer   controllo del concatenamento dei nomi non riuscito javax.net.ssl.SSLHandshakeException:   sun.security.validator.ValidatorException: convalida del percorso PKIX   non riuscito: java.security.cert.CertPathValidatorException: subject / issuer   controllo del concatenamento dei nomi non riuscito           su com.sun.net.ssl.internal.ssl.Alerts.getSSLException (Alerts.java:174)           su com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal (SSLSocketImpl.java:1611)           su com.sun.net.ssl.internal.ssl.Handshaker.fatalSE (Handshaker.java:187)           su com.sun.net.ssl.internal.ssl.Handshaker.fatalSE (Handshaker.java:181)           su com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate (ClientHandshaker.java:1035)           su com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage (ClientHandshaker.java:124)           su com.sun.net.ssl.internal.ssl.Handshaker.processLoop (Handshaker.java:516)           su com.sun.net.ssl.internal.ssl.Handshaker.process_record (Handshaker.java:454)           su com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord (SSLSocketImpl.java:884)           su com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake (SSLSocketImpl.java:1112)           su com.sun.net.ssl.internal.ssl.SSLSocketImpl.writeRecord (SSLSocketImpl.java:623)           su com.sun.net.ssl.internal.ssl.AppOutputStream.write (AppOutputStream.java:59)           at java.io.BufferedOutputStream.flushBuffer (BufferedOutputStream.java:65)           at java.io.BufferedOutputStream.flush (BufferedOutputStream.java:123)           su org.apache.commons.httpclient.methods.EntityEnclosingMethod.writeRequestBody (EntityEnclosingMethod.java:506)           su org.apache.commons.httpclient.HttpMethodBase.writeRequest (HttpMethodBase.java:2114)           su org.apache.commons.httpclient.HttpMethodBase.execute (HttpMethodBase.java:1096)           su org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry (HttpMethodDirector.java:398)           su org.apache.commons.httpclient.HttpMethodDirector.executeMethod (HttpMethodDirector.java:171)           su org.apache.commons.httpclient.HttpClient.executeMethod (HttpClient.java:397)           su org.apache.commons.httpclient.HttpClient.executeMethod (HttpClient.java:323)           at balanceschecker.connector.Connector.conn (Connector.java:27)           at balanceschecker.connector.Connector.RawPost (Connector.java:99)           at balanceschecker.connector.Connector.Post (Connector.java:111)           at balanceschecker.login.Login.Login (Login.java:87)           at balanceschecker.Main.main (Main.java:21) Causato da: sun.security.validator.ValidatorException: convalida del percorso PKIX   non riuscito: java.security.cert.CertPathValidatorException: subject / issuer   controllo del concatenamento dei nomi non riuscito           at sun.security.validator.PKIXValidator.doValidate (PKIXValidator.java:251)           at sun.security.validator.PKIXValidator.doValidate (PKIXValidator.java:234)           at sun.security.validator.PKIXValidator.engineValidate (PKIXValidator.java:158)           at sun.security.validator.Validator.validate (Validator.java:218)           su com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.validate (X509TrustManagerImpl.java:126)           su com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted (X509TrustManagerImpl.java:209)           su com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted (X509TrustManagerImpl.java:249)           su com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate (ClientHandshaker.java:1014)           ... altri 21 Causato da: java.security.cert.CertPathValidatorException: nome soggetto / emittente   controllo del concatenamento non riuscito           at sun.security.provider.certpath.PKIXMasterCertPathValidator.validate (PKIXMasterCertPathValidator.java:139)           at sun.security.provider.certpath.PKIXCertPathValidator.doValidate (PKIXCertPathValidator.java:326)           at sun.security.provider.certpath.PKIXCertPathValidator.engineValidate (PKIXCertPathValidator.java:178)           at java.security.cert.CertPathValidator.validate (CertPathValidator.java:250)           at sun.security.validator.PKIXValidator.doValidate (PKIXValidator.java:246)           ... altri 28

Ecco il codice che sto usando (modificato e compattato un po ')

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

Ho dato un'occhiata ai certificati del sito e sono ancora validi per oltre un anno. Ho quindi cercato di aggirare il controllo del certificato utilizzando il codice mostrato in " Come per ignorare l'host attendibile e il controllo del certificato in Java " tuttavia l'eccezione viene ancora generata.

Cosa sto facendo di sbagliato?
Come posso collegarmi correttamente al server?

È stato utile?

Soluzione

Questo errore indica che non è possibile convalidare la catena di certificati. Le possibili cause sono,

  1. La CA principale non è considerata attendibile dal proprio JRE.
  2. Il certificato è firmato da un certificato intermedio ma il server non lo sta inviando insieme al certificato.

Ecco come ottenere un elenco di certificati root,

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

Non conosco alcun modo Java per verificare se viene inviato un certificato intermedio. Uso openssl per questo,

openssl s_client -host example.com -port 443

Ti mostrerà tutti i certificati inviati dal server. Fai attenzione a " Catena di certificati " ;.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top