628 Stimmen

Auflösen von javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX-Pfaderstellung fehlgeschlagen Fehler?

Bearbeiten: Ich habe versucht, die Frage und die akzeptierte Antwort in einer vorzeigbareren Form in meinem Blog .

Hier ist die Originalausgabe.

Ich erhalte diesen Fehler:

Ausführliche Meldung sun.security.validator.ValidatorException: PKIX-Pfad Erstellung fehlgeschlagen:
sun.security.provider.certpath.SunCertPathBuilderException: kann nicht auf keinen gültigen Zertifizierungspfad zum angeforderten Ziel finden

javax.net.ssl.SSLHandshakeException verursachen: sun.security.validator.ValidatorException: PKIX-Pfaderstellung fehlgeschlagen: sun.security.provider.certpath.SunCertPathBuilderException: Unfähig, einen gültigen Zertifizierungspfad für das angeforderte Ziel zu finden

Ich verwende Tomcat 6 als Webserver. Ich habe zwei HTTPS-Webanwendungen auf verschiedenen Tomcats an verschiedenen Ports, aber auf demselben Rechner installiert. Sagen wir App1 (Port 8443) und App2 (Port 443). App1 stellt eine Verbindung zu App2 her. Wenn App1 eine Verbindung zu App2 herstellt, erhalte ich den oben genannten Fehler. Ich weiß, dass dieser Fehler sehr häufig auftritt, und habe in verschiedenen Foren und auf verschiedenen Websites viele Lösungen gefunden. Ich habe den folgenden Eintrag in server.xml der beiden Tomcats:

keystoreFile="c:/.keystore" 
keystorePass="changeit"

Auf jeder Website wird derselbe Grund angegeben: Das von app2 ausgestellte Zertifikat befindet sich nicht im vertrauenswürdigen Speicher von app1 jvm. Dies scheint auch dann zuzutreffen, wenn ich versuche, die gleiche URL im IE-Browser aufzurufen, was auch funktioniert (mit der Meldung Es gibt ein Problem mit dem Sicherheitszertifikat dieser Website. Hier sage ich weiter zu dieser Website). Aber wenn dieselbe URL von einem Java-Client aufgerufen wird (in meinem Fall), erhalte ich den oben genannten Fehler. Um sie in den Truststore aufzunehmen, habe ich diese drei Optionen ausprobiert:

Option 1

System.setProperty("javax.net.ssl.trustStore", "C:/.keystore");
System.setProperty("javax.net.ssl.trustStorePassword", "changeit");

Option 2

Folgende Einstellung in der Umgebungsvariable

CATALINA_OPTS -- param name
-Djavax.net.ssl.trustStore=C:\.keystore -Djavax.net.ssl.trustStorePassword=changeit ---param value

Option 3

Folgende Einstellung in der Umgebungsvariable

JAVA_OPTS -- param name
-Djavax.net.ssl.trustStore=C:\.keystore -Djavax.net.ssl.trustStorePassword=changeit ---param value

Ergebnis

Aber nichts funktionierte.

Was endlich funktionierte führt den Java-Ansatz aus, der in Wie behandelt man ungültige SSL-Zertifikate mit Apache HttpClient? von Pascal Thivent, d.h. die Ausführung des Programms InstallCert.

Aber dieser Ansatz ist gut für Devbox-Setup, aber ich kann es nicht in der Produktionsumgebung verwenden.

Ich frage mich, warum die drei oben genannten Ansätze nicht funktionieren, wenn ich die gleichen Werte in server.xml des App2-Servers und dieselben Werte im Truststore durch Setzen von

System.setProperty("javax.net.ssl.trustStore", "C:/.keystore") and System.setProperty("javax.net.ssl.trustStorePassword", "changeit");

im Programm App1.

Für weitere Informationen stelle ich die Verbindung folgendermaßen her:

URL url = new URL(urlStr);

URLConnection conn = url.openConnection();

if (conn instanceof HttpsURLConnection) {

  HttpsURLConnection conn1 = (HttpsURLConnection) url.openConnection();

  conn1.setHostnameVerifier(new HostnameVerifier() {
    public boolean verify(String hostname, SSLSession session) {
      return true;
    }
  });

  reply.load(conn1.getInputStream());

2voto

Abhishek Punkte 1442

Für MacOS X ist unten der genaue Befehl, der bei mir funktionierte, wobei ich es mit einem doppelten Bindestrich in der Option "importcert" versuchen musste, was auch funktionierte:

sudo keytool -–importcert -file /PathTo/YourCertFileDownloadedFromBrowserLockIcon.crt -keystore /Library/Java/JavaVirtualMachines/jdk1.8.0_191.jdk/Contents/Home/jre/lib/security/cacerts -alias "Cert" -storepass changeit

2voto

Radu Linu Punkte 927

Bei mir hat die erkannte Lösung aus diesem Beitrag nicht funktioniert: https://stackoverflow.com/a/9619478/4507034 .

Stattdessen konnte ich das Problem lösen, indem ich die Zertifizierung in die vertrauenswürdigen Zertifizierungen meines Computers importierte.

Schritte:

  1. Rufen Sie die URL auf (z. B. https://localhost:8443/yourpath ), wo die Zertifizierung nicht funktioniert.
  2. Exportieren Sie die Bescheinigung wie in dem genannten Beitrag beschrieben.
  3. Öffnen Sie auf Ihrem Windows-Rechner: Manage computer certificates
  4. Ir a Trusted Root Certification Authorities -> Certificates
  5. Importieren Sie hier Ihre your_certification_name.cer Datei.

1voto

R A U N A K Punkte 29

Ich habe diesen Fehler in Android Studio erhalten. SO habe ich dies nach einer Menge Forschung.

Das Passwort ist changeit für cacert

Schritt 1: Öffnen Sie CMD als Administrator

Schritt 2: Geben Sie "Powershell" ein.

Schritt 3 : start-process powershell -verb runas

Schritt 4 : Fügen Sie alle Ihre Zertifikate in C:\Program Dateien \Android\Android Studio \jre\lib\security dieser Ort, an dem cacert verfügbar ist.

Schritt 5 : Gehen Sie zum Keytool-Verzeichnis Set-Location -Path " C:\Program Dateien \Android\Android Studio \jre\bin "

Schritt 6: Führen Sie diesen Befehl in der Powershell aus. \keytool -importcert -trustcacerts -alias GiveNameforyourcertificate -file " C:\Program Dateien \Android\Android Studio \jre\lib\security\Replace Mit Ihrem Zertifikatsnamen.cer" -keystore cacerts

Schritt 7: Wenn die Fehlermeldung "Zertifikat hinzugefügt (Zugriff verweigert)" erscheint, erstellen Sie eine D-Laufwerkspartition ( https://www.diskpart.com/Windows-10/how-to-create-d-drive-from-c-drive-in-Windows-10-0725.html ) oder verschieben Sie die Datei auf Laufwerk d und fügen Sie das Zertifikat hinzu

Wenn Sie Ihre Datei auf Laufwerk D gespeichert haben, führen Sie nur Folgendes aus

Schritt 8 : keytool -importcert -trustcacerts -alias Nameyourcertificate -file " D:\Certificatename.cer " -keystore cacerts

Schritt 9 : Prüfen Sie mit diesem Befehl, ob ein Zertifikat hinzugefügt wurde oder nicht. \keytool -list -keystore cacerts

1voto

SrikanthM Punkte 11

Auch wir hatten dasselbe Problem und haben alle folgenden Dinge getan.

  1. Reimportierte Server-SSL-Zertifikate.
  2. Vergewissern Sie sich, dass Weblogic die richtigen Zertifkate verwendet.

Schließlich aktivierte unser Weblogic den DEBUG-Modus und stellte fest, dass es eine Ausnahme "NOT HANDSHAKED" gibt.

Der Grund, den wir gefunden haben, ist, dass das Client-System jdk 1.6 verwendet und der Server eine höhere jdk-Version (1.8), weshalb es eine Abweichung der TLS-Version gibt, die das Problem verursacht.

Das Weblogic-Team hat die Serverkonfiguration durch Hinzufügen der folgenden Zeilen in den Serverargumenten optimiert.

-Djdk.tls.client.protocol=TLSv1.2 -DUseSunHttpHandler=true.

1voto

Ramin Udash Punkte 61

Ich benutze Flutter und habe diesen Fehler aus dem Nichts erhalten. Also, was im Grunde passiert ist, dass die Zeilen innerhalb Ihrer Abhängigkeiten innerhalb android/build.gradle Datei wie zum Beispiel:

  classpath 'com.android.tools.build:gradle:4.1.0'
  classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"

eine Bescheinigung verlangen, dass die Notendatei aus dem Internet heruntergeladen wird. Aber wenn es etwas gibt, das den Gradle daran hindert, diese Zertifikate herunterzuladen, wird dies normalerweise angezeigt.

Ich habe versucht, das Zertifikat zu exportieren und es manuell hinzuzufügen, aber das scheint nicht zu funktionieren. Was bei mir nach unzähligen Kopfzerbrechen funktionierte, war die Deaktivierung der Proxys in den Netzwerkeinstellungen. Irgendwo wurde erwähnt, dass die Deaktivierung von Charles Proxy das Problem beheben würde, aber in diesem Moment wusste ich nicht, was Charles ist und was Proxy ist. Und in meinem Fall hatte ich das Charles-Proxy-Ding nicht, also fuhr ich fort, die Proxys in den Netzwerkeinstellungen des Macs zu finden (unter Windows kann man sie irgendwo in den Netzwerkeinstellungen finden). Ich hatte Socks innerhalb des Proxys aktiviert. Ich deaktivierte es und baute dann das gradle neu auf und TA-DAH!!! Es funktionierte butterweich.

Es gibt ein paar Dinge zu beachten. Wenn Sie Ihr Projekt direkt nach der Deaktivierung des Proxys erstellen, ohne die Registerkarte "Netzwerkeinstellungen" zu schließen, funktioniert die Deaktivierung der Proxys nicht und es wird derselbe Fehler angezeigt. Auch wenn Sie das Projekt bereits erstellt haben und es nach der Deaktivierung der Proxys erneut ausführen, wird wahrscheinlich derselbe Fehler angezeigt (dies könnte auf IDE-Caches zurückzuführen sein). So hat es bei mir funktioniert: Starten Sie den Mac neu, öffnen Sie ein paar Tabs im Browser (für ein paar Netzwerkaufrufe), überprüfen Sie die Netzwerkeinstellungen in den Systemeinstellungen>> WiFi und deaktivieren Sie Proxies, schließen Sie die Systemeinstellungs-App und erstellen Sie das Projekt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X