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());

-1voto

Apurva Singh Punkte 4090
  • Vergewissern Sie sich über den Standort Ihrer JVM. Es kann ein halbes Dutzend JREs auf Ihrem System. Welche verwendet Ihr Tomcat wirklich? Überall im Code, der in Ihrem Tomcat läuft, schreiben Sie println(System.getProperty("java.home")). Merken Sie sich diese Stelle. In <java.home>/lib/security/cacerts befinden sich die Zertifikate, die von Ihrem Tomcat verwendet werden.
  • Suchen Sie das fehlerhafte Root-Zertifikat. Dieses kann finden, indem Sie SSL-Debug mit -Djavax.net.debug=all aktivieren. Führen Sie Ihre Anwendung und notieren Sie in den ssl-Protokollen der Konsole die CA, die fehlschlägt. Die Url wird verfügbar sein. In meinem Fall war ich überrascht, dass ein Proxy-Zscaler derjenige war, der versagte, da er tatsächlich meine Aufrufe vermittelte und sein eigenes CA-Zertifikat zurückgab.
  • Url in Browser einfügen. Das Zertifikat wird heruntergeladen.
  • Importieren Sie dieses Zertifikat mit keytool import in cacerts.

-1voto

milfar dean Punkte 111

Ich bin auf dieses Problem gestoßen, als ich REST-Aufrufe von meinem App-Server in AWS EC2 ausgeführt habe. Die folgenden Schritte haben das Problem für mich behoben.

  1. curl -vs https://your\_rest\_path
  2. echo | openssl s_client -connect ihre_domain:443
  3. sudo apt-get install ca-certificates

curl -vs https://your\_rest\_path wird jetzt funktionieren!

-1voto

espajava Punkte 63

Ich habe das gleiche Problem auch auf Apache Tomcat/7.0.67 und Java JVM Version: 1.8.0_66-b18. Mit dem Upgrade von Java auf JRE 1.8.0_241 und es scheint, dass das Problem gelöst wurde.

-1voto

Wirling Punkte 4055

Ich hatte dieses Problem mit Android Studio, wenn ich hinter einem Proxy bin. Ich habe Crashlytics verwendet, das versucht, die Mapping-Datei während eines Builds hochzuladen.

Ich habe das fehlende Proxy-Zertifikat zum Truststore hinzugefügt, der sich unter /Users/[username]/Documents/Android Studio.app/Contents/jre/jdk/Contents/Home/jre/lib/security/cacerts

mit dem folgenden Befehl: keytool -import -trustcacerts -keystore cacerts -storepass [password] -noprompt -alias [alias] -file [my_certificate_location]

zum Beispiel mit dem Standard-Passwort für den Truststore keytool -import -trustcacerts -keystore cacerts -storepass changeit -noprompt -alias myproxycert -file /Users/myname/Downloads/MyProxy.crt

-1voto

chiperortiz Punkte 4553

Achten Sie auf eine tolle Antwort für @NDeveloper. Ich habe natürlich kopiert und eingefügt, die Werte geändert und ich bekam

Illegal option:  ?import

Ich habe die Bindestriche überprüft und gesehen, dass in dieser Antwort der Bindestrich mit dem ASCII

– 8211

Wenn Sie Probleme haben, überprüfen Sie, ob der ASCII-Code, der bei mir geholfen hat, dieser Code war = 45

- 45

Mein Code

keytool -import -noprompt -trustcacerts -alias Certificado -file "C:\Users\JavIut\Desktop\Company\Certificados\Certificado.cer" -keystore "C:\Program Files\Java\jdk1.8.0_121\jre\lib\security\cacerts"

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