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)
    ...

36voto

Arvind Kumar Avinash Punkte 62339

Mac

Die akzeptierte Antwort funktioniert nicht für Mac, da in Mac (Chrome oder Firefox) keine Export Schaltfläche vorhanden ist. Bitte überprüfen Sie diese Antwort, um das Zertifikat herunterzuladen und die folgenden Schritte wie unten beschrieben zu befolgen:

  1. Liste alle installierten Zertifikate im Keystore auf:

    cd $JAVA_HOME/lib/security keytool -list -keystore cacerts

Hinweise:

  • Das Standardpasswort des Keystores ist: changeit.
  • Für Java-8 oder eine niedrigere Version verwenden Sie den Befehl cd $JAVA_HOME/jre/lib/security
  1. Bevor Sie das Zertifikat im Keystore importieren, erstellen Sie ein Backup des Keystores:

    sudo cp cacerts cacerts.bak

  2. Importieren Sie das heruntergeladene Zertifikat in den Keystore:

    sudo keytool -importcert -alias youralias -file /path/to/the/downloaded/certificate -keystore cacerts

  3. Überprüfen Sie, ob das Zertifikat im Keystore gespeichert ist:

    sudo keytool -list -keystore cacerts -alias youralias

Wenn Sie detailliertere Informationen sehen möchten, fügen Sie die -v Flagge hinzu:

sudo keytool -v -list -keystore cacerts -alias youralias

27voto

Sneha Shejwal Punkte 311

Ich wollte das Zertifikat für smtp.gmail.com importieren. Die einzige Lösung, die für mich funktioniert hat, ist

  1. Geben Sie den Befehl ein, um dieses Zertifikat anzuzeigen

    D:\openssl\bin\openssl.exe s_client -connect smtp.gmail.com:465
  2. Kopieren und speichern Sie die Zeilen zwischen -----BEGIN CERTIFICATE----- und -----END CERTIFICATE----- in eine Datei, gmail.cer

  3. Führen Sie aus

    keytool -import -alias smtp.gmail.com -keystore "%JAVA_HOME%/jre/lib/security/cacerts" -file C:\Users\Admin\Desktop\gmail.cer
  4. Geben Sie das Passwort ein: changeit

  5. Klicken Sie auf "Ja", um das Zertifikat zu importieren

  6. Starten Sie Java neu

Führen Sie jetzt den Befehl aus und Sie sind startklar.

23voto

Reid Punkte 18017

Dies ist keine spezifische Antwort für Twitter, aber das ist die Frage, die erscheint, wenn Sie nach diesem Fehler suchen. Wenn Ihr System diesen Fehler erhält, wenn es sich mit einer Website verbindet, die ein gültiges Zertifikat zu haben scheint, wenn es in einem Webbrowser angezeigt wird, bedeutet das wahrscheinlich, dass diese Website eine unvollständige Zertifikatkette hat.

Zusammengefasst liegt das Problem darin, dass Zertifizierungsstellen ihr Stammzertifikat nicht verwenden, um einfach jedes beliebige Zertifikat zu signieren. Stattdessen signieren sie (in der Regel) Zertifikate von Zwischenstellen, die ebenfalls das Flag der Zertifizierungsstelle gesetzt haben (das heißt, sie dürfen Zertifikate signieren). Wenn Sie also ein Zertifikat von einer Zertifizierungsstelle kaufen, signieren sie Ihren CSR mit einem dieser Zwischenzertifikate.

Ihr Java-Truststore hat höchstwahrscheinlich nur das Stammzertifikat, nicht die Zwischenzertifikate.

Eine fehlerhaft konfigurierte Website könnte nur ihr signiertes Zertifikat zurückgeben. Das Problem dabei ist, dass es mit einem Zwischenzertifikat signiert wurde, das nicht in Ihrem Truststore vorhanden ist. Browser lösen dieses Problem, indem sie ein Zwischenzertifikat herunterladen oder aus einem Zwischenspeicher verwenden; das maximiert die Kompatibilität der Website. Java und Tools wie OpenSSL tun dies jedoch nicht. Und das führt zu dem Fehler in der Frage.

Sie können diesen Verdacht überprüfen, indem Sie den Qualys SSL-Test verwenden. Wenn Sie diesen gegen eine Website ausführen und es heißt

Dieser Server hat eine unvollständige Zertifikatkette.

dann ist das die Bestätigung. Sie können dies auch sehen, indem Sie die Zertifizierungspfade überprüfen und den Text Extra Download sehen.

Wie man das behebt: Der Serveradministrator muss den Webserver so konfigurieren, dass er auch die Zwischenzertifikate zurückgibt. Bei Comodo zum Beispiel wird hier die Datei .ca-bundle nützlich. Zum Beispiel in einer Apache-Konfiguration mit mod_ssl verwenden Sie die Konfigurationseinstellung SSLCertificateChainFile. Bei nginx müssen Sie die Zwischenzertifikate und das signierte Zertifikat zusammenfügen und anschließend in der SSL-Zertifikatskonfiguration verwenden. Weitere Informationen finden Sie, wenn Sie online nach "unvollständige Zertifikatkette" suchen.

17voto

M. F. Punkte 1594

Ich hatte eine etwas andere Situation, als sowohl JDK als auch JRE 1.8.0_112 auf meinem System vorhanden waren.

Ich habe die neuen CA-Zertifikate in [JDK_ORDNER]\jre\lib\security\cacerts mit dem bereits bekannten Befehl importiert:

keytool -import -trustcacerts -keystore cacerts -alias  -file 

Dennoch erhielt ich weiterhin den gleichen PKIX-Pfadkonstruktionsfehler.

Ich habe Debug-Informationen zum Java CLI hinzugefügt, indem ich java -Djavax.net.debug=all ... > debug.log verwendet habe. In der Datei debug.log zeigte die Zeile, die mit trustStore ist: beginnt, tatsächlich auf den im [JRE_ORDNER]\lib\security\cacerts gefundenen cacerts-Speicher.

In meinem Fall bestand die Lösung darin, die von JDK verwendete cacerts-Datei (die die neuen CAs enthielt) über diejenige zu kopieren, die von JRE verwendet wurde, und das hat das Problem behoben.

16voto

Venkatesh Punkte 191

Nach einem halben Tag des Kampfes fand ich einen weiteren Weg, um dieses Problem zu lösen. Ich konnte dies in MAC 10.15.5 (Catalina) lösen. Folgte den unten stehenden Schritten.

  • Dieses Problem tritt auf, wenn wir hinter einem Firmenproxy laufen, in meinem Fall ist es Zscaler.
  • Öffnen Sie den Schlüsselbundzugriff, exportieren Sie das CA-Zertifikat. (Wählen Sie das CA-Zertifikat aus, Datei->Elemente exportieren und speichern Sie es unter dem gewünschten Namen)
  • Kopieren Sie den Pfad der vorhandenen CACerts aus dem Java-Ordner (/Library/Java/JavaVirtualMachines/jdk1.8.0_251.jdk/Contents/Home/jre/lib/security/cacerts)
  • Öffnen Sie das Terminal und navigieren Sie zum Keytool-Ordner (/Library/Java/JavaVirtualMachines/jdk1.8.0_251.jdk/Contents/Home/jre/bin)
  • Führen Sie den unten stehenden Befehl aus.
  • Keytool -importcert - file (Pfad zum exportierten Zertifikat aus dem Schlüsselbundzugriff) -alias (einen Namen geben) -keystore (Pfad der vorhandenen cacerts aus dem Java-Ordner)
  • sudo Keytool -importcert -file /Users/Desktop/RootCA.cer -alias demo -keystore /Library/Java/JavaVirtualMachines/jdk1.8.0_251.jdk/Contents/Home/jre/lib/security/cacerts
  • Es wird nach dem Passwort gefragt, geben Sie es ein: changeit
  • Es fragt nach Bestätigung, sagen Sie: ja

Nach all diesen Schritten beenden Sie Eclipse und Terminal und starten Sie eine neue Sitzung.

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