2009-05-06 9 views
7

Ich versuche, von einer sicheren (d. H. SSL) Webseite im Java-Code zu lesen. Ich versuche, URLConnection (java.net) und Apache HTTPClient zu verwenden. In beiden Fällen, wenn ich den Antrag stellen, bekomme ich diese Ausnahme:Authentifizierung bei SSL-Site in Java nicht möglich: "pathLenConstraint verletzt - dieses Zertifikat muss das letzte Zertifikat im Zertifizierungspfad sein"

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX Pfad Validierung fehlgeschlagen: java.security. cert.CertPathValidatorException: Basiseinschränkungen fehlgeschlagen Prüfung: pathLenConstraint verletzt - dieses cert muss das letzte cert in der Zertifizierungspfad sein bei com.sun.net.ssl.internal.ssl.Alerts.getSSLException (Alerts.java:150) um com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal (SSLSock etImpl.java:1518) unter com.sun.net.ssl.internal.ssl.Handshaker.fatalSE (Handshaker.java:174) unter com.sun.net.ssl.internal.ssl.Handshaker.fatalSE (Handshaker.java:168) bei com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate (ClientHandshaker.java:848) bei com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage (ClientHandshaker.java:106) bei com.sun.net.ssl.internal.ssl.Handshaker.processLoop (Handshaker.java:495) bei com.sun.net.ssl.internal.ssl.Handshaker.process_record (Handshaker.java:433) unter com.sun.net.ssl.internal.ssl.SSLSocketIm pl.readRecord (SSLSocketImpl.java:818) bei com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake (SSLSocketImpl.java:1030) bei com.sun.net.ssl.internal.ssl. SSLSocketImpl.startHandshake (SSLSocketImpl.java:1057) bei com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake (SSLSocketImpl.java:1041) bei sun.net.www.protocol.https.HttpsClient. afterConnect (HttpsClient.java:402) bei sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect (AbstractDelegateHttpsURLConnection.java:166) bei sun.net.www.protocol.http.HttpURLConnection.getInputStream (HttpURLConnection. Java: 934) bei sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream (HttpsURLConnectionImpl.java:234) bei com.sap.river.coghead.rest.Main.testJavaHTTPConnection (Main.java:45) bei com .sap.river.coghead.rest.Main.main (Main.java:32) verursacht durch: sun.security.validator.ValidatorException: PKIX Pfadüberprüfung fehlgeschlagen: java.security.cert.CertPathValidatorException: Basiseinschränkungen Überprüfung fehlgeschlagen: pathLenConstraint verletzt - dieses Zertifikat muss das letzte Zertifikat in der Zertifizierung Pfad sein bei sun.security.validator.PKIXValidator.doValidate (PKIXValida tor.java:187) bei sun.security.validator.PKIXValidator.engineValidate (PKIXValidator.java:139) bei sun.security.validator.Validator.validate (Validator.java:203) bei com.sun .net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted (X509TrustManagerImpl.java:172) unter com.sun.net.ssl.internal.ssl.JsseX509TrustManager.checkServerTrusted (SSLContextImpl.Java: 320) bei com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate (ClientHandshaker.java:841) ... 13 weitere Verursacht durch: java.security.cert.CertPathValidatorException: Basiseinschränkungen Prüfung fehlgeschlagen: pathLenConstraint verletzt - dieses cert muss das letzte cert in der Zertifizierungspfad bei sun.security.provider.certpath.PKIXMasterCertPathValidator.validate (PKIXMasterCertPathValidator.java:139) bei sun.security.provider.certpath sein .PKIXCertPathValidator.doValidate (PKIXCertPathValidator.java:316) unter sun.security.provider.certpath.PKIXCertPathValidator.engineValidate (PKIXCert PathValidator.java:178) bei java.security.cert.CertPathValidator.validate (CertPathValidator.java:206) bei sun.security.validator.PKIXValidator.doValidate (PKIXValidator.java:182) ... 18 mehr

Beachten Sie, dass es mir gelungen ist, eine Nicht-SSL-Verbindung zu einem anderen Host herzustellen. Ich kann diese Seite auch mit dem Browser anzeigen - die Zertifikate werden dort korrekt validiert.

Muss ich irgendwie die Reihenfolge der Zertifikate ändern, wenn sie vom Server abgerufen werden? Gibt es eine Konfiguration, die ich vermisse?

Vielen Dank im Voraus,

Lior

Antwort

6

Ich grub weiter und die Antwort liegt in der Tatsache, dass ich die erforderlichen Zertifikate in den Schlüsselspeicher von der JVM SSL zur Authentifizierung verwendet importieren benötigt. Der Schlüsselspeicher ist die 'cacerts'-Datei unter dem jre/lib/security-Ordner in der jre, die zum Ausführen des Programms verwendet wird.

Ich manuell die Zertifikate der Website exportiert - alle von ihnen.
Dann habe ich es mit dem von Sun zur Verfügung gestellten Dienstprogramm "keytool" in meinen Standard-Keystore importiert. Beachten Sie, dass Sie sie in der richtigen Reihenfolge importieren müssen.
Ich habe dann den neuen Keystore anstelle der JRE's - und es hat funktioniert.

Ich denke, es wäre besser gewesen, die Zertifikate direkt in den Keystore der JRE zu importieren, aber das Tool fragte mich nach einem Passwort, das ich nicht kannte.

Ich glaube, es gibt auch eine Möglichkeit, dies einfacher zu programmieren, habe es noch nicht gefunden. Ich bin glücklich, einige Zeiger zu erhalten (TrustManager-Klasse in JSSE?).

Endlich etwas Kredit. Dieser Beitrag hier: http://javaishdiscoveries.blogspot.com/2009/02/battle-with-cacerts-and-https.html half mir in die richtige Richtung zu zeigen.

+0

Ich weiß nicht, ob das hilft, aber Java können Sie die Standard SLLSocketFactory ändern. – Powerlord

+0

Ja, ich stelle mir vor, ich muss etwas in diesem Bereich tun. Ich muss es nur weiter untersuchen. Danke trotzdem, - Lior – Lior

+2

FYI, das Passwort für die Standard-Java-Zertifikate keystore $ JAVA_HOME/lib/security/cacerts ist 'changeit' –

0

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX-Pfadüberprüfung fehlgeschlagen: java.security.cert.CertPathValidatorException: Basiseinschränkungen überprüfen fehlgeschlagen: pathLenConstraint verletzt - das Zertifikat bei

pathLenConstraint

(Tz über Zertifikatketten) in

http://groups.google.com/group/google-checkout-developers-forum/web/google-checkout-and-ssl-certificates?version=49

das letzte Zertifikat im Zertifizierungspfad sein muss Google sagt, es könnte ein Problem mit der Zertifikatskettenbestellung sein, ich habe gerade festgestellt, dass mein Zertifikat nicht in Ordnung ist, noch nicht behoben, daran gearbeitet. Ich werde das später aktualisieren.


alte Post:

hat fast das gleiche Problem.

Das Hinzufügen eines Zertifikats manuell zu Keystore hilft, aber ich würde es lieber automatisch mit meinem Client machen.

Also meine Lösung:

I Schlüsselspeicher nur für diese eine App, und ein Host 1. Schlüsselspeicher nicht vorhanden ist verwenden - erstellen mit einigen generiertes Passwort 2. speichern Passwort in der Konfigurationsdatei 3. fragen Benutzer (oder nicht), ob er dieses Zertifikat akzeptieren möchte 4. wenn ja - speichern Sie es im Keystore und verwenden Sie es bei Bedarf

Ist das eine gute Lösung? Irgendwelche Kommentare?

Verwandte Themen