Ich habe mich mit VPN verbunden, um die Inventar-API einzurichten, um die Produktliste zu erhalten, und es funktioniert einwandfrei. Sobald ich das Ergebnis vom Web-Service bekomme und mich an die Benutzeroberfläche binde. Außerdem habe ich PayPal in meine Anwendung für die Express-Kaufabwicklung integriert, wenn ich einen Zahlungsaufruf tätige, bei dem dieser Fehler auftritt. Ich benutze Servlet für den Back-End-Prozess. Kann jemand sagen, wie man dieses Problem behebt?
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException:
PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException:
unable to find valid certification path to requested target
Antworten:
Zunächst müssen Sie das öffentliche Zertifikat von dem Server erhalten, zu dem Sie eine Verbindung herstellen möchten. Dies kann auf verschiedene Arten geschehen, z. B. indem Sie den Serveradministrator kontaktieren und danach fragen, OpenSSL zum Herunterladen verwenden oder, da dies ein HTTP-Server zu sein scheint, eine Verbindung mit einem beliebigen Browser herstellen und die Sicherheitsinformationen der Seite anzeigen und Speichern einer Kopie des Zertifikats. (Google sollte Ihnen genau sagen können, was Sie für Ihren bestimmten Browser tun sollen.)
Nachdem Sie das Zertifikat in einer Datei gespeichert haben, müssen Sie es dem Trust Store Ihrer JVM hinzufügen. Bei
$JAVA_HOME/jre/lib/security/
für JREs oder$JAVA_HOME/lib/security
für JDKs, gibt es eine Datei mit dem Namencacerts
, der mit Java kommt und enthält die öffentlichen Zertifikate der bekannten Zertifizierungsstellen. Führen Sie zum Importieren des neuen Zertifikats keytool als Benutzer aus, der zum Schreiben in cacerts berechtigt ist:Sie werden höchstwahrscheinlich nach einem Passwort gefragt. Das mit Java gelieferte Standardkennwort lautet
changeit
. Fast niemand ändert es. Nachdem Sie diese relativ einfachen Schritte ausgeführt haben, kommunizieren Sie sicher und mit der Gewissheit, dass Sie mit dem richtigen Server und nur mit dem richtigen Server sprechen (solange diese ihren privaten Schlüssel nicht verlieren).quelle
Jetzt habe ich dieses Problem auf diese Weise gelöst,
Natürlich sollte diese Lösung nur in Szenarien verwendet werden, in denen es nicht möglich ist, die erforderlichen Zertifikate mithilfe
keytool
lokaler Tests mit temporären Zertifikaten zu installieren .quelle
Wann immer wir versuchen, eine Verbindung zur URL herzustellen,
Wenn der Server am anderen Standort mit dem https-Protokoll ausgeführt wird und die Kommunikation über die im Zertifikat angegebenen Informationen vorschreibt, haben wir folgende Option:
1) Fordern Sie das Zertifikat an (laden Sie das Zertifikat herunter) und importieren Sie dieses Zertifikat in Trustore. Die standardmäßigen Java-Verwendungen von Trustore finden Sie unter \ Java \ jdk1.6.0_29 \ jre \ lib \ security \ cacerts. Wenn wir erneut versuchen, eine Verbindung zur URL-Verbindung herzustellen, wird dies akzeptiert.
2) In normalen Geschäftsfällen stellen wir möglicherweise eine Verbindung zu internen URLs in Organisationen her und wissen, dass diese korrekt sind. In solchen Fällen vertrauen Sie darauf, dass es sich um die richtige URL handelt. In den oben genannten Fällen kann Code verwendet werden, der nicht das Speichern des Zertifikats für die Verbindung mit einer bestimmten URL vorschreibt.
Für den Punkt Nr. 2 müssen wir die folgenden Schritte ausführen:
1) Schreiben Sie die folgende Methode, mit der HostnameVerifier für HttpsURLConnection festgelegt wird, die in allen Fällen true zurückgibt, was bedeutet, dass wir dem trustStore vertrauen.
2) Schreiben Sie die folgende Methode, die doTrustToCertificates aufruft, bevor Sie versuchen, eine Verbindung zur URL herzustellen
Dieser Aufruf gibt den Antwortcode = 200 zurück, was bedeutet, dass die Verbindung erfolgreich ist.
Weitere Einzelheiten und ein Beispiel finden Sie unter URL .
quelle
Ich glaube, dass Sie versuchen, über SSL eine Verbindung zu etwas herzustellen, aber dass etwas ein Zertifikat bereitstellt, das nicht von Root-Zertifizierungsstellen wie verisign überprüft wurde. Im Wesentlichen können sichere Verbindungen standardmäßig nur hergestellt werden, wenn die Person, die versucht, eine Verbindung herzustellen, dies weiß Die Schlüssel der Gegenparteien oder eine andere Verndor wie Verisign können eingreifen und sagen, dass der bereitgestellte öffentliche Schlüssel tatsächlich richtig ist.
ALLE Betriebssysteme vertrauen darauf, dass eine Handvoll Zertifizierungsstellen und kleinere Zertifikatsaussteller von einem der großen Zertifizierer zertifiziert werden müssen, die eine Kette von Zertifizierern bilden, wenn Sie verstehen, was ich meine ...
Wie auch immer, ich komme auf den Punkt zurück. Ich hatte ein ähnliches Problem beim Programmieren eines Java-Applets und eines Java-Servers (Hoffentlich schreibe ich eines Tages einen vollständigen Blogpost darüber, wie ich die gesamte Sicherheit zum Laufen gebracht habe :))
Im Wesentlichen musste ich die öffentlichen Schlüssel vom Server extrahieren und in einem Schlüsselspeicher in meinem Applet speichern. Als ich eine Verbindung zum Server herstellte, verwendete ich diesen Schlüsselspeicher, um eine Vertrauensfactory zu erstellen, und diese Vertrauensfabrik, um die SSL zu erstellen Verbindung. Es gibt auch alternative Verfahren wie das Hinzufügen des Schlüssels zum vertrauenswürdigen Host der JVM und das Ändern des Standard-Vertrauensspeichers beim Start.
Ich habe dies vor ungefähr zwei Monaten getan und habe momentan keinen Quellcode bei mir. Verwenden Sie Google und Sie sollten in der Lage sein, dieses Problem zu lösen. Wenn Sie mir keine Nachricht senden können und ich Ihnen den relevanten Quellcode für das Projekt zur Verfügung stellen kann, wissen Sie nicht, ob dies Ihr Problem löst, da Sie den Code, der diese Ausnahmen verursacht, nicht angegeben haben. Außerdem habe ich mit Applets gearbeitet, von denen ich dachte, ich kann nicht verstehen, warum es auf Serverlets nicht funktioniert ...
PS Ich kann vor dem Wochenende keinen Quellcode erhalten, da externes SSH in meinem Büro deaktiviert ist :(
quelle
SSLHandshakeException kann auf zwei Arten gelöst werden.
Einbindung von SSL
Holen Sie sich das SSL (indem Sie den Administrator des Quellsystems fragen, kann es auch mit dem Befehl openssl heruntergeladen werden oder jeder Browser lädt die Zertifikate herunter)
Fügen Sie das Zertifikat in den Truststore (cacerts) unter JRE / lib / security ein
Geben Sie den Truststore-Speicherort in VM-Argumenten als "-Djavax.net.ssl.trustStore =" an.
SSL ignorieren
Besuchen Sie für diese Nummer 2 meine andere Antwort auf einer anderen Stackoverflow-Website: So führen Sie eine SSL-Überprüfung durch Ignorieren von SSL-Zertifikatfehlern mit Java
quelle
Jetzt habe ich dieses Problem auf diese Weise gelöst,
quelle