Connessione a Secure Server in Java tramite Apache Commons HttpClient 3.1 con ValidatorException
-
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?
Soluzione
Questo errore indica che non è possibile convalidare la catena di certificati. Le possibili cause sono,
- La CA principale non è considerata attendibile dal proprio JRE.
- 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 " ;.