951 Stimmen

"PKIX Pfadkonstruktion fehlgeschlagen" and "kein gültiger Zertifikat-Pfad zum angeforderten Ziel gefunden"

Ich versuche, Tweets mit der Twitter4j-Bibliothek für mein Java-Projekt abzurufen, die unter Verwendung von java.net.HttpURLConnection (wie im Stack-Trace zu sehen ist) funktioniert. Bei meinem ersten Versuch erhielt ich einen Fehler bezüglich des Zertifikats sun.security.validator.ValidatorException und sun.security.provider.certpath.SunCertPathBuilderException. Dann fügte ich das Twitter-Zertifikat hinzu, indem ich folgendes durchführte:

C:\Program Files\Java\jdk1.7.0_45\jre\lib\security>keytool -importcert -trustcacerts -file PfadZuZertifikat -alias ca_alias -keystore "C:\Program Files\Java\jdk1.7.0_45\jre\lib\security\cacerts"

Aber ohne Erfolg. Hier ist das Verfahren zum Abrufen von Tweets:

public static void main(String[] args) throws TwitterException {
    ConfigurationBuilder cb = new ConfigurationBuilder();
    cb.setDebugEnabled(true)
        .setOAuthConsumerKey("meinConsumerKey")
        .setOAuthConsumerSecret("meinConsumerSecret")
        .setOAuthAccessToken("meinAccessToken")
        .setOAuthAccessTokenSecret("meinAccessTokenSecret");

    TwitterFactory tf = new TwitterFactory(cb.build());
    Twitter twitter = tf.getInstance();

    try {
        Query query = new Query("iphone");
        QueryResult result;
        result = twitter.search(query);
        System.out.println("Gesamtzahl der Tweets: " + result.getTweets().size());
        List tweets = result.getTweets();

        for (Status tweet : tweets) {
            System.out.println("@" + tweet.getUser().getScreenName() + " : " + tweet.getText());
        }
    } catch (TwitterException te) {
        te.printStackTrace();
        System.out.println("Fehler beim Suchen von Tweets: " + te.getMessage());
    }

Und hier ist der Fehler:

sun.security.validator.ValidatorException: PKIX-Pfadaufbau fehlgeschlagen: sun.security.provider.certpath.SunCertPathBuilderException: Kann gültigen Zertifikatspfad zum angeforderten Ziel nicht finden
Relevante Diskussionen finden Sie im Internet unter:
    http://www.google.co.jp/search?q=d35baff5 oder
    http://www.google.co.jp/search?q=1446302e
TwitterException{exceptionCode=[d35baff5-1446302e 43208640-747fd158 43208640-747fd158 43208640-747fd158], statusCode=-1, message=null, code=-1, retryAfter=-1, rateLimitStatus=null, version=3.0.5}
    at twitter4j.internal.http.HttpClientImpl.request(HttpClientImpl.java:177)
    at twitter4j.internal.http.HttpClientWrapper.request(HttpClientWrapper.java:61)
    at twitter4j.internal.http.HttpClientWrapper.get(HttpClientWrapper.java:81)
    at twitter4j.TwitterImpl.get(TwitterImpl.java:1929)
    at twitter4j.TwitterImpl.search(TwitterImpl.java:306)
    at jku.cc.servlets.TweetsAnalyzer.main(TweetsAnalyzer.java:38)
Verursacht durch: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX-Pfadaufbau fehlgeschlagen: sun.security.provider.certpath.SunCertPathBuilderException: Kann gültigen Zertifikatspfad zum angeforderten Ziel nicht finden
    at sun.security.ssl.Alerts.getSSLException(Unbekannter Quelltext)
    at sun.security.ssl.SSLSocketImpl.fatal(Unbekannter Quelltext)
    at sun.security.ssl.Handshaker.fatalSE(Unbekannter Quelltext)
    at sun.security.ssl.Handshaker.fatalSE(Unbekannter Quelltext)
    ...

4voto

Rohit Tatiya Punkte 381

Wenn Sie Probleme mit der unten stehenden Ausnahme haben:

Problem: javax.net.ssl.SSLHandshakeException: PKIX-Pfadbildung fehlgeschlagen ..... konnte keinen gültigen Zertifikatspfad zum angeforderten Ziel finden.

Ursache: SSL-Handshake schlägt fehl, da das erforderliche Serverzertifikat am Client nicht vorhanden ist. Für den JAVA-Anwendungsstack verwendet es seinen eigenen Zertifikatsspeicher entweder an den Standorten JRE oder JDK:

  1. JRE: jre/lib/security/cacerts
  2. JDK: :\Program Files\Java\jdk-11.0.15.1\lib/security/cacerts

Lösung: Sie müssen das Zertifikat im cacerts-Ordner des JAVA-Setups mit folgendem Befehl registrieren:

keytool -import -alias {Zertifikatsname} -keystore "{absoluter Pfad des cacerts-Verzeichnisses}" -file {.cer-Dateistandort}

Dieses Dienstprogramm verwendet das Standardpasswort "changeit". Bitte geben Sie dieses Passwort ein, wenn Sie dazu aufgefordert werden.

Wenn keytool nicht erkannt wird, beachten Sie bitte, dass diese .exe Teil des JRE- oder JDK-Bin-Ordners ist, daher sollte das Hinzufügen dieses Pfads in die lokale Umgebungsvariable des lokalen Rechners namens "Path" dieses Problem beheben.

4voto

Atihska Punkte 4024

Für mich ist der Zertifikatsfehler aufgetreten, weil ich Fiddler im Hintergrund laufen hatte und das das Zertifikat durcheinander bringt. Es fungiert als Proxy, also schließe das und starte Eclipse neu.

3voto

jasonoriordan Punkte 863

Ich habe meinen eigenen Truststore verwendet, anstatt den JRE-Truststore zu benutzen, indem ich das Argument -Djavax.net.ssl.trustStore= übergeben habe.

Ich habe diesen Fehler erhalten, unabhängig von den Zertifikaten im Truststore. Das Problem für mich war die Reihenfolge der übergebenen Eigenschaften auf der Argumentzeile. Wenn ich -Djavax.net.ssl.trustStore= & -Djavax.net.ssl.trustStorePassword= vor den -Dspring.config.location= & -jar Args platziere, konnte ich meinen REST-Aufruf erfolgreich über HTTPS ausführen.

3voto

ognjenkl Punkte 904

Ich habe dieses Problem auf Windows Server 2016 mit Java 8 gelöst, indem ich das Zertifikat aus dem pkcs12-Speicher in den cacerts-Keystore importiert habe.

Pfad zum pkcs12-Speicher:
C:\Apps\pkcs12.pfx

Pfad zu Java-cacerts:
C:\Program Files\Java\jre1.8.0_151\lib\security\cacerts

Pfad zum keytool:
C:\Program Files\Java\jre1.8.0_151\bin

Nachdem Sie sich im Ordner mit dem keytool in der Eingabeaufforderung (als Administrator) befinden, lautet der Befehl zum Importieren des Zertifikats aus pkcs12 in cacerts wie folgt:
keytool -v -importkeystore -srckeystore C:\Apps\pkcs12.pfx -srcstoretype PKCS12 -destkeystore "C:\Program Files\Java\jre1.8.0_151\lib\security\cacerts" -deststoretype JKS

Sie werden aufgefordert, einzugeben:
1. das Passwort des Zielschlüsselspeichers (cacerts-Passwort, standardmäßig "changeit")
2. das Passwort des Quellschlüsselspeichers (pkcs12-Passwort)

Um die Änderungen wirksam werden zu lassen, starten Sie die Server-Maschine neu (oder starten Sie einfach die JVM neu).

3voto

Ammad Punkte 3575

Ich bin auf das gleiche Problem gestoßen, jedoch habe ich den falschen JRE auf meinem Linux-Rechner aktualisiert. Es ist sehr wahrscheinlich, dass Tomcat eine andere JRE verwendet und Ihr CLI-Prompt so konfiguriert ist, dass sie eine andere JRE verwendet.

Stellen Sie sicher, dass Sie die richtige JRE verwenden.

Schritt #1:

ps -ef | grep tomcat

Sie werden etwas Ähnliches sehen wie:

root     29855     1  3 17:54 pts/3    00:00:42 /usr/java/jdk1.7.0_79/jre/bin/java 

Verwenden Sie nun dies:

keytool -import -alias beispiel -keystore  /usr/java/jdk1.7.0_79/jre/lib/security/cacerts -file cert.cer
PWD: changeit

*.cer-Datei kann wie folgt generiert werden (oder Sie können Ihre eigene verwenden)

openssl x509 -in cert.pem -outform pem -outform der -out cert.cer

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