2016-04-19 29 views
0

Ich versuche, eine Verbindung zu einem REST-Dienst über HTTPS (SSL) herzustellen, und es hat nicht funktioniert. Der Fehler ist PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target. Ich verfolgte das Problem nach unten, die Tatsache, dass die Certificate Authority, ein Ort namens www.identrust.com, nicht zur Standardliste der vertrauenswürdigen Autoritäten im JRE-Standard-Keystore hinzugefügt wurde. Siehe Will the cross root cover trust by the default list in the JDK/JRE? oder Which browsers and operating systems support Let’s Encrypt.Java SSL-Verbindungslösung, wenn die Zertifizierungsstelle nicht in JRE ist

ich ein paar vorgeschlagenen Lösungen wie ignoriert Authentifizierung gesehen haben (Java: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target) oder das Zertifikat in den JRE-Schlüsselspeicher (“unable to find valid certification path to requested target”, but browser says it's OK) importieren, aber was ich will ist meine Java SE-Anwendung zu tun haben erfolgreich mit SSL-Sites zu verbinden, haben Zertifikate von www.identrust.com, sowie alle anderen gültigen Seiten. Mit anderen Worten, ich möchte den JRE-Keystore nicht bei jedem JDK-Update ändern, und ich möchte das Zertifikat nicht ignorieren.

Ich kann das Zertifikat von Identrust von ihrer Website erhalten (Certificate Chain Download Instructions), also wie füge ich es in die "Vertrauenskette" für meine Anwendung ein?

Antwort

2

Ignorieren der Serverzertifikatprüfung ist sehr schlecht und unsichere Praxis.

Das Importieren des Zertifikats in den JRE-Schlüsselspeicher ist ebenfalls eine schlechte Methode - wenn man bedenkt, dass die JRE mehrmals pro Jahr aktualisiert wird, was normalerweise bedeutet, dass Sie das Zertifikat erneut importieren müssen.

Die dritte und beste Option besteht darin, dem fehlenden CA-Zertifikat explizit zu vertrauen (oder dem Serverzertifikat direkt zu vertrauen). Sie können dies tun, indem Sie das zu verifizierende Zertifikat in einem separaten Java-Keystore platzieren und diesen Keystore in Ihre App einschließen (z. B. in der JAR-Datei).

Sie können die Trust Store benutzerdefinierte bieten die Systemeigenschaft javax.net.ssl.trustStore oder mit dem IMHO anhand bevorzugter Weise eine benutzerdefinierte SSL-Kontext Implementierung unter Verwendung von wie hier beschrieben: How do I accept a self-signed certificate with a Java HttpsURLConnection?

+0

So ziemlich die Schlussfolgerung, die ich zu mir kam, vielen Dank für das Feedback. –