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

1158voto

MagGGG Punkte 16018
  1. Gehen Sie zu URL in Ihrem Browser:
  • firefox - klicken Sie auf die HTTPS-Zertifikatskette (das Schlosssymbol direkt neben der URL-Adresse). Klicken Sie auf "Weitere Informationen" > "Sicherheit" > "Zertifikat anzeigen" > "Details" > "Exportieren..". Geben Sie den Namen ein und wählen Sie das Dateiformat Beispiel.cer
  • chrome - klicken Sie auf das Seiten-Symbol links neben der Adresse in der Adressleiste, wählen Sie "Zertifikat" -> "Details" -> "Exportieren" und speichern Sie im Format "Der-codiertes Binärformat, einzelnes Zertifikat".
  1. Jetzt haben Sie eine Datei mit dem Keystore und müssen sie zu Ihrem JVM hinzufügen. Bestimmen Sie den Speicherort der cacerts-Dateien, z.B. C:\Program Files (x86)\Java\jre1.6.0_22\lib\security\cacerts.

  2. Importieren Sie nun die Beispiel.cer Datei in cacerts über die Befehlszeile (möglicherweise benötigen Sie eine Administrator-Eingabeaufforderung):

keytool -import -alias Beispiel -Keystore "C:\Program Files (x86)\Java\jre1.6.0_22\lib\security\cacerts" -Datei Beispiel.cer

Sie werden nach einem Passwort gefragt, das standardmäßig changeit ist.

Starten Sie Ihren JVM/PC neu.

Quelle: http://magicmonster.com/kb/prg/java/ssl/pkix_path_building_failed.html

127voto

Jeremy Goodell Punkte 17417

Nach vielen Stunden, in denen ich versucht habe, Zertifikatsdateien zu erstellen, um meine Java 6-Installation mit den neuen Twitter-Zertifikaten zum Laufen zu bringen, bin ich schließlich auf eine unglaublich einfache Lösung gestoßen, die in einem Kommentar in einem der Message Boards vergraben war. Kopieren Sie einfach die cacerts-Datei aus einer Java 7-Installation und überschreiben Sie die in Ihrer Java 6-Installation. Es ist wahrscheinlich am besten, zuerst eine Sicherungskopie der cacerts-Datei zu erstellen, aber dann kopieren Sie einfach die neue Datei und ZACK! es funktioniert einfach.

Beachten Sie, dass ich tatsächlich eine Windows-cacerts-Datei auf eine Linux-Installation kopiert habe und es hat wunderbar funktioniert.

Die Datei befindet sich in jre/lib/security/cacerts sowohl in den alten als auch in den neuen Java JDK-Installationen.

Ich hoffe, dass dies jemand anderem Stunden voller Ärger erspart.

113voto

Mike Mitterer Punkte 5932

Mein UI-Ansatz:

  1. Laden Sie den Keystore Explorer von hier herunter
  2. Öffnen Sie $JAVA_HOME/jre/lib/security/cacerts
  3. Geben Sie das Passwort ein: changeit (Kann bei Mac changeme sein)
  4. Importieren Sie Ihre .crt-Datei

CMD-Line:

  1. keytool -importcert -file jetty.crt -alias jetty -keystore $JAVA_HOME/jre/lib/security/cacerts
  2. Geben Sie das Passwort ein: changeit (Kann bei Mac changeme sein)

76voto

Lu55 Punkte 19425

1. Überprüfen Sie das Zertifikat

Versuchen Sie, die Ziel-URL im Browser zu laden und das Zertifikat der Website anzuzeigen (normalerweise ist dies über das Symbol mit dem Schlosszeichen zugänglich. Es befindet sich links oder rechts in der Adressleiste des Browsers), ob es abgelaufen ist oder aus einem anderen Grund nicht vertrauenswürdig ist.

2. Installieren Sie die neuesten Versionen von JRE und JDK

Neue Versionen enthalten normalerweise den aktualisierten Satz von vertrauenswürdigen Zertifikaten.

Versuchen Sie auch, alte Versionen zu deinstallieren. Dies macht Konfigurationsfehler offensichtlich.

3. Überprüfen Sie Ihre Konfiguration:

  • Überprüfen Sie, wohin Ihre JAVA_HOME-Umgebungsvariable zeigt.
  • Überprüfen Sie, welche Java-Version Sie verwenden, um das Programm auszuführen. In IntelliJ überprüfen Sie:
    • Datei -> Projektstruktur... -> Projekteinstellungen -> Projekt -> Projektsdk:
    • Datei -> Projektstruktur... -> Plattform-Einstellungen -> SDKs

4. Kopieren Sie den gesamten Keystore aus der neuen Java-Version

Wenn Sie unter einem anderen JDK als dem neuesten verfügbaren entwickeln, versuchen Sie, die Datei %JAVA_HOME%/jre/lib/security/cacerts mit der neuen aus der zuletzt installierten JRE zu ersetzen (machen Sie zuerst eine Sicherungskopie), wie @jeremy-goodell in seiner Antwort vorschlägt

5. Fügen Sie Zertifikate zu Ihrem Keystore hinzu

Wenn keines der oben genannten Probleme löst, verwenden Sie keytool, um Zertifikate im Java-Keystore zu speichern:

keytool -trustcacerts -keystore "%JAVA_HOME%jre\lib\security\cacerts" -storepass changeit -importcert -alias  -file 

Die Datei mit dem Zertifikat kann über den Browser wie von @MagGGG in seiner Antwort vorgeschlagen, erhalten werden.

Hinweis 1: Sie müssen möglicherweise dies für jedes Zertifikat in der Kette zu Ihrem Website-Zertifikat wiederholen. Beginnen Sie mit dem Wurzelzertifikat.

Hinweis 2: sollte unter den Schlüsseln im Speicher eindeutig sein, oder keytool zeigt einen Fehler an.

Um eine Liste aller Zertifikate im Speicher zu erhalten, können Sie ausführen:

keytool -list -trustcacerts -keystore "%JAVA_HOME%jre\lib\security/cacerts" -storepass ändern

Falls etwas schief geht, hilft Ihnen dies, ein Zertifikat aus dem Speicher zu entfernen:

keytool -delete -alias  -keystore "%JAVA_HOME%jre\lib\security/cacerts" -storepass ändern

55voto

gorums Punkte 1201
-Dmaven.wagon.http.ssl.insecure=true -Dmaven.wagon.http.ssl.allowall=true

Es wird verwendet, um die Zertifikatsvalidierung zu überspringen.

Warnung!

Nur für Entwicklungszwecke verwenden, da dies unsicher ist!

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