Connecting Server in Java mit Apache Commons Secure Httpclient 3.1 werfen ValidatorException

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

  •  06-07-2019
  •  | 
  •  

Frage

Ich versuche, an einen sicheren Server mit Apache Commons HttpClient 3.1 zu verbinden.
Das Problem jedes Mal die Anwendung verbindet es ein wirft

  

sun.security.validator.ValidatorException.

Hier ist die stacktrace :

  

javax.net.ssl.SSLHandshakeException:   sun.security.validator.ValidatorException: PKIX Pfadüberprüfung   fehlgeschlagen: java.security.cert.CertPathValidatorException: subject / Emittenten   Name Verkettungs Prüfung fehlgeschlagen javax.net.ssl.SSLHandshakeException:   sun.security.validator.ValidatorException: PKIX Pfadüberprüfung   fehlgeschlagen: java.security.cert.CertPathValidatorException: subject / Emittenten   Name Prüfung nicht bestanden Verkettungs           bei com.sun.net.ssl.internal.ssl.Alerts.getSSLException (Alerts.java:174)           bei com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal (SSLSocketImpl.java:1611)           bei com.sun.net.ssl.internal.ssl.Handshaker.fatalSE (Handshaker.java:187)           bei com.sun.net.ssl.internal.ssl.Handshaker.fatalSE (Handshaker.java:181)           bei com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate (ClientHandshaker.java:1035)           bei com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage (ClientHandshaker.java:124)           bei com.sun.net.ssl.internal.ssl.Handshaker.processLoop (Handshaker.java:516)           bei com.sun.net.ssl.internal.ssl.Handshaker.process_record (Handshaker.java:454)           bei com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord (SSLSocketImpl.java:884)           bei com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake (SSLSocketImpl.java:1112)           bei com.sun.net.ssl.internal.ssl.SSLSocketImpl.writeRecord (SSLSocketImpl.java:623)           bei com.sun.net.ssl.internal.ssl.AppOutputStream.write (AppOutputStream.java:59)           bei java.io.BufferedOutputStream.flushBuffer (BufferedOutputStream.java:65)           bei java.io.BufferedOutputStream.flush (BufferedOutputStream.java:123)           bei org.apache.commons.httpclient.methods.EntityEnclosingMethod.writeRequestBody (EntityEnclosingMethod.java:506)           bei org.apache.commons.httpclient.HttpMethodBase.writeRequest (HttpMethodBase.java:2114)           bei org.apache.commons.httpclient.HttpMethodBase.execute (HttpMethodBase.java:1096)           bei org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry (HttpMethodDirector.java:398)           bei org.apache.commons.httpclient.HttpMethodDirector.executeMethod (HttpMethodDirector.java:171)           bei org.apache.commons.httpclient.HttpClient.executeMethod (HttpClient.java:397)           bei org.apache.commons.httpclient.HttpClient.executeMethod (HttpClient.java:323)           bei balanceschecker.connector.Connector.conn (Connector.java:27)           bei balanceschecker.connector.Connector.RawPost (Connector.java:99)           bei balanceschecker.connector.Connector.Post (Connector.java:111)           bei balanceschecker.login.Login.Login (Login.java:87)           bei balanceschecker.Main.main (Main.java:21) Verursacht durch: sun.security.validator.ValidatorException: PKIX Pfadüberprüfung   fehlgeschlagen: java.security.cert.CertPathValidatorException: subject / Emittenten   Name Prüfung nicht bestanden Verkettungs           bei sun.security.validator.PKIXValidator.doValidate (PKIXValidator.java:251)           bei sun.security.validator.PKIXValidator.doValidate (PKIXValidator.java:234)           bei sun.security.validator.PKIXValidator.engineValidate (PKIXValidator.java:158)           bei sun.security.validator.Validator.validate (Validator.java:218)           bei com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.validate (X509TrustManagerImpl.java:126)           bei com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted (X509TrustManagerImpl.java:209)           bei com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted (X509TrustManagerImpl.java:249)           bei com.sun.net.ssl.internal.ssl.ClientHandshaker.serverZertifikat (ClientHandshaker.java:1014)           ... 21 weitere Verursacht durch: java.security.cert.CertPathValidatorException: subject / Name des Emittenten   Verkettungsprüfung fehlgeschlagen           bei sun.security.provider.certpath.PKIXMasterCertPathValidator.validate (PKIXMasterCertPathValidator.java:139)           bei sun.security.provider.certpath.PKIXCertPathValidator.doValidate (PKIXCertPathValidator.java:326)           bei sun.security.provider.certpath.PKIXCertPathValidator.engineValidate (PKIXCertPathValidator.java:178)           bei java.security.cert.CertPathValidator.validate (CertPathValidator.java:250)           bei sun.security.validator.PKIXValidator.doValidate (PKIXValidator.java:246)           ... 28 mehr

Heres der Code ich verwende (bearbeitet und verdichtet, um eine Bit)

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

hatte ich einen Blick auf die Zertifikate der Website und sie sind seit über einem Jahr immer noch gültig. Ich habe dann versucht, die Zertifikatsprüfung zu umgehen, den Code mit, wie in „ Wie Bypass vertrauenswürdige Host und Zertifikatsprüfung in Java “, aber die Ausnahme noch geworfen.

Was mache ich falsch?
Wie kann ich erfolgreich eine Verbindung mit dem Server?

War es hilfreich?

Lösung

Dieser Fehler bedeutet, dass es die Zertifikatskette nicht überprüfen kann. Mögliche Ursachen sind,

  1. Die Root-CA wird von Ihrem JRE nicht vertrauenswürdig.
  2. Das Zertifikat wird von einem Zwischen cert unterzeichnet, aber Server sendet sie nicht zusammen mit dem cert.

Hier ist, wie eine Liste der Stamm cert bekommen,

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

Ich kenne keine Java Art und Weise zu überprüfen, ob Zwischen cert gesendet wird. Ich benutze openssl für das,

openssl s_client -host example.com -port 443

zeigt Ihnen alle Zertifikat-Server gesendet. Achten Sie auf „Zertifikat-Kette“.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top