Authentifizieren SSL-site in java: "pathLenConstraint verletzt - das cert muss das Letzte cert bei der Zertifizierung Pfad"
Ich versuche zu Lesen, von einer sicheren (d.h. SSL) web-Seite in Java-code.
Ich versuche, beide URLConnection (java.net) und Apache HTTPClient.
In beiden Fällen, wenn ich Anfrage, bekomme ich diese exception:
javax.net.ssl.SSLHandshakeException:
Sonne.Sicherheit.validator.ValidatorException:
PKIX path validation failed:
java.Sicherheit.cert.CertPathValidatorException:
basic-constraints-Prüfung fehlgeschlagen:
pathLenConstraint verletzt - das cert
es muss das Letzte cert in der
Zertifizierung Pfad an
com.Sonne.net.ssl.intern.ssl.- Warnungen.getSSLException(Warnungen.java:150)
bei
com.Sonne.net.ssl.intern.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1518)
bei
com.Sonne.net.ssl.intern.ssl.Handshaker.fatalSE(Handshaker.java:174)
bei
com.Sonne.net.ssl.intern.ssl.Handshaker.fatalSE(Handshaker.java:168)
bei
com.Sonne.net.ssl.intern.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:848)
bei
com.Sonne.net.ssl.intern.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:106)
bei
com.Sonne.net.ssl.intern.ssl.Handshaker.processLoop(Handshaker.java:495)
bei
com.Sonne.net.ssl.intern.ssl.Handshaker.process_record(Handshaker.java:433)
bei
com.Sonne.net.ssl.intern.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:818)
bei
com.Sonne.net.ssl.intern.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1030)
bei
com.Sonne.net.ssl.intern.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1057)
bei
com.Sonne.net.ssl.intern.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1041)
bei
Sonne.net.www.Protokoll.https.HttpsClient.afterConnect(HttpsClient.java:402)
bei
sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:166)
bei
Sonne.net.www.Protokoll.http.HttpURLConnection.getInputStream(HttpURLConnection.java:934)
bei
Sonne.net.www.Protokoll.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:234)
bei
com.sap.Fluss.coghead.rest.Main.testJavaHTTPConnection(Main).java:45)
bei
com.sap.Fluss.coghead.rest.Main.main(Main.java:32)
Verursacht durch:
Sonne.Sicherheit.validator.ValidatorException:
PKIX path validation failed:
java.Sicherheit.cert.CertPathValidatorException:
basic-constraints-Prüfung fehlgeschlagen:
pathLenConstraint verletzt - das cert
es muss das Letzte cert in der
Zertifizierung Pfad an
Sonne.Sicherheit.validator.PKIXValidator.doValidate(PKIXValidator.java:187)
bei
Sonne.Sicherheit.validator.PKIXValidator.engineValidate(PKIXValidator.java:139)
bei
Sonne.Sicherheit.validator.Validator.validate(Validator.java:203)
bei
com.Sonne.net.ssl.intern.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:172)
bei
com.Sonne.net.ssl.intern.ssl.JsseX509TrustManager.checkServerTrusted(SSLContextImpl.java:320)
bei
com.Sonne.net.ssl.intern.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:841)
... 13 weitere Schäden durch:
java.Sicherheit.cert.CertPathValidatorException:
basic-constraints-Prüfung fehlgeschlagen:
pathLenConstraint verletzt - das cert
es muss das Letzte cert in der
Zertifizierung Pfad an
sun.security.provider.certpath.PKIXMasterCertPathValidator.validate(PKIXMasterCertPathValidator.java:139)
bei
Sonne.Sicherheit.Anbieter.certpath.PKIXCertPathValidator.doValidate(PKIXCertPathValidator.java:316)
bei
Sonne.Sicherheit.Anbieter.certpath.PKIXCertPathValidator.engineValidate(PKIXCertPathValidator.java:178)
bei
java.Sicherheit.cert.CertPathValidator.validate(CertPathValidator.java:206)
bei
Sonne.Sicherheit.validator.PKIXValidator.doValidate(PKIXValidator.java:182)
... 18 mehr
Beachten Sie, dass ich es gelungen, eine nicht-ssl-Verbindung zu einem anderen host zu obwohl.
Ich bin auch in der Lage, um diese Seite anzuzeigen, die mithilfe der browser - die Zertifikate korrekt überprüft es.
Tun Sie ich muss irgendwie die Reihenfolge ändern von Zertifikaten, wie Sie die vom server abgerufen werden?
Gibt es eine Konfiguration, die ich bin fehlt?
Vielen Dank im Voraus,
Lior
Du musst angemeldet sein, um einen Kommentar abzugeben.
Grub ich weiter und die Antwort liegt in der Tatsache, dass ich brauchte, um importieren Sie die erforderlichen Zertifikate in den keystore verwendet, die von der JVM zur Authentifizierung SSL.
Der key store ist die "cacerts" - Datei unter dem jre/lib/security Ordner in der jre, der verwendet wird, um das Programm auszuführen.
Ich manuell exportieren Sie die site-Zertifikate - alle von Ihnen.
Dann habe ich importiert Sie in mein Standard-keystore mit dem 'keytool' Dienstprogramm von Sun bereitgestellt. Beachten Sie, dass Sie haben, um Sie zu importieren, in der richtigen Reihenfolge.
Ich dann das neue keystore-anstelle der JRE ist ein - und es funktionierte.
Ich denke, es wäre besser gewesen Sie zum importieren der Zertifikate direkt an die JRE ' s keystore, aber das tool fragte mich nach einem Passwort, was ich nicht wusste.
Ich glaube, es gibt auch einen Weg, um das Programm, um dieses leichter, nur diese noch nicht gefunden haben. Ich werde glücklich sein, um einige Hinweise (TrustManager-Klasse in JSSE?).
Schließlich, einige credit. Dieser Beitrag hier: http://javaishdiscoveries.blogspot.com/2009/02/battle-with-cacerts-and-https.html geholfen, um mich in die richtige Richtung.
javax.net.ssl.SSLHandshakeException: Sonne.Sicherheit.validator.ValidatorException: PKIX path validation failed: java.Sicherheit.cert.CertPathValidatorException: basic-constraints-Prüfung fehlgeschlagen: pathLenConstraint verletzt - das cert muss das Letzte cert bei der Zertifizierung Pfad zu
pathLenConstraint
sehen (Hinweis zum Zertifikat-Ketten) in
http://groups.google.com/group/google-checkout-developers-forum/web/google-checkout-and-ssl-certificates?version=49
google sagt, dass es möglicherweise Probleme mit dem Zertifikat-Kette um, ich habe gerade festgestellt, dass mein cert ist nicht in Ordnung, stehe noch nicht fest, daran zu arbeiten. Ich werde aktualisieren später.
alte post:
Haben fast das gleiche problem.
Hinzufügen Zertifikat Händisch zu keystore hilft, aber ich würde vorziehen, es zu tun mehr automatisch mit meinem client.
Also meine Lösung:
Ich werde keystore nur für diese eine app, und einem host
1. keystore nicht existieren, erstellen Sie mit dem generierten Kennwort
2. speichern Sie das Passwort in der config-Datei
3. Fragen Sie den Benutzer (oder nicht), ob er das Zertifikat akzeptieren
4. wenn ja, speichern Sie es auf keystore, und verwenden Sie es, wenn nötig
Ist das eine gute Lösung? Irgendwelche Kommentare?
War das problem mit den Zertifikat-Kette um.
Es war: Ein->C->B ist, aber sein sollte->B->C, sobald wir Feste Kette, um die Anwendung zu arbeiten begonnen.
Ich noch nicht persönlich behoben, die certs. aber dieser Beitrag war hilfreich
http://groups.google.com/group/google-checkout-api-troubleshooting/browse_thread/thread/99862c11d37d3127