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

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

2voto

Aniket Warey Punkte 869

Falls Ihr Host hinter einer Firewall/einem Proxy liegt, verwenden Sie den folgenden Befehl in der Eingabeaufforderung:

keytool -J-Dhttps.proxyHost= -J-Dhttps.proxyPort= -printcert -rfc -sslserver 

Ersetzen Sie und durch den konfigurierten HTTP-Proxyserver. Ersetzen Sie durch einen der Remote-Hosts (basically url) und Ports mit dem Zertifikatsproblem.

Nehmen Sie den letzten Zertifikatsinhalt, der gedruckt wird, und kopieren Sie ihn (kopieren Sie auch das Beginn- und Endzertifikat). Fügen Sie es in eine Textdatei ein und geben Sie die Erweiterung .crt . Importieren Sie dieses Zertifikat nun in cacerts mithilfe des Java-Keytool-Befehls, dann sollte es funktionieren.

keytool -importcert -file .crt -alias randomaliasname -keystore %JAVA_HOME%/jre/lib/security/cacerts -storepass changeit

2voto

Micó Papp Punkte 289

Die oben genannten Vorschläge funktionieren, aber ich wollte eine einfachere Lösung nur über die Befehlszeile, da ich es relativ oft brauche, also habe ich jssl erstellt.

Kurzfassung:
jssl example.com install
jssl example.com ping
jssl example.com uninstall

Sie können jssl über Homebrew installieren:
brew install pmamico/java/jssl
oder ohne Homebrew:
curl -sL https://raw.githubusercontent.com/pmamico/java-ssl-tools/main/install.sh | bash

Es funktioniert auch auf Windows, macOS und Linux.
Weitere Informationen unter https://github.com/pmamico/java-ssl-tools

2voto

Dennis Punkte 3940

Die vorgeschlagenen Lösungen haben bei mir nicht funktioniert. Am Ende habe ich diesen Workaround verwendet. Beachten Sie, nicht ideal.

-Dmaven.wagon.http.ssl.insecure=true -Dmaven.wagon.http.ssl.allowall=true -Dmaven.wagon.http.ssl.ignore.validity.dates=true -Dmaven.resolver.transport=wagon

1voto

Ich hatte dieses Problem mit Java 8, aber es wurde gelöst, nachdem ich auf Java 11 aktualisiert hatte

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