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

13voto

Barani r Punkte 1733

Problembeschreibung:

Ich habe folgenden Fehler erhalten, als ich versucht habe, mvn clean install in meinem Projekt auszuführen und über die Clean-and-Build-Option von Netbeans IDE. Dieses Problem tritt auf, wenn das Zertifikat nicht verfügbar ist, wenn wir über die NET beans IDE/die Eingabeaufforderung herunterladen, aber die Dateien über den Browser herunterladen können.

Fehler:

Verursacht durch: org.eclipse.aether.transfer.ArtifactTransferException: Konnte Artefakt com.java.project:product:jar:1.0.32 von/to repo-local (https://url/local-repo) nicht übertragen: sun.security.validator.ValidatorException: PKIX-Pfadkonstruktion fehlgeschlagen: sun.security.provider.certpath.SunCertPathBuilderException: kann gültigen Zertifikatspfad zum angeforderten Ziel nicht finden  

Lösung:

1. Laden Sie das Zertifikat der betreffenden URL herunter:

  • Starten Sie IE als Administrator (sonst können wir das Zertifikat nicht herunterladen)
  • Geben Sie die URL in den IE ein -> https://url/local-repo (In meinem Fall hatte diese URL ein nicht vertrauenswürdiges Zertifikat Bildbeschreibung eingeben.)
  • Laden Sie das Zertifikat herunter, indem Sie auf Zertifikatsfehler klicken -> Zertifikat anzeigen
  • Wählen Sie den Tab Details -> in Datei kopieren -> weiter -> wählen Sie "DER-kodierten binären X.509 (.CER)
  • Speichern Sie das Zertifikat an einem beliebigen Speicherort, zum Beispiel: c:/user/sheldon/desktop/product.cer
  • Herzlichen Glückwunsch! Sie haben das Zertifikat für die Website erfolgreich heruntergeladen

2. Installieren Sie jetzt den Key Store, um das Problem zu beheben.

  • Führen Sie den keytool-Befehl aus, um das heruntergeladene Keystore in die vorhandene Zertifikatsdatei einzufügen.
  • Befehl: Unten stehender Befehl im bin-Ordner von jdk (JAVA_HOME).

C:\Program Files\Java\jdk1.8.0_141\jre\bin>keytool -importcert -file "C:/user/sheldon/desktop/product.cer" -alias product -keystore "C:/Program Files/Java/jdk1.8.0_141/jre/lib/security/cacerts".

  • Sie werden aufgefordert, ein Passwort einzugeben. Geben Sie das Keystore-Passwort ein: geben Sie erneut "changeit" für "Dieses Zertifikat vertrauen? [no]:" ein, geben Sie "yes" ein

Beispiel für Befehlszeilenbefehle/-ausgaben:

keytool -importcert -file "C:/Users/sheldon/Desktop/product.cer" -alias product -keystore "C:/Program Files/Java/jdk1.8.0_141/jre/lib/security/cacerts"
Geben Sie das Keystore-Passwort ein:
Dieses Zertifikat vertrauen? [no]:  yes
Zertifikat wurde dem Keystore hinzugefügt
  • Herzlichen Glückwunsch! Jetzt sollten Sie den Fehler "PKIX-Pfadkonstruktion fehlgeschlagen: sun.security.provider.certpath.SunCertPathBuilderException" in Ihrer Netbeans IDE behoben haben.

13voto

Vikash Kumar Punkte 916

Dies ist eine Lösung, aber in Form meiner Geschichte mit diesem Problem:

Ich war fast tot, nachdem ich alle oben genannten Lösungen ausprobiert hatte (für 3 Tage) und nichts hat für mich funktioniert.

Ich hatte alle Hoffnung verloren.

Ich habe mein Sicherheitsteam kontaktiert, weil ich mich hinter einem Proxy befand, und sie sagten mir, dass sie ihre Sicherheitsrichtlinie kürzlich aktualisiert hatten.

Später haben sie eine neue "cacerts"-Datei herausgegeben, die alle Zertifikate enthält.

Ich habe die cacerts-Datei entfernt, die sich im %JAVA_HOME%/jre/lib/security befindet, und das hat mein Problem gelöst.

Also, wenn du dieses Problem hast, könnte es auch von deinem Netzwerkteam stammen.

12voto

Abdul Mohsin Punkte 1083

Einfache Schritte zur Behebung dieser Ausnahme (Ich habe es unter Java 11 gemacht),

  • Zuerst müssen Sie die öffentliche SSL-Zertifikatsdatei der Ziel-Domäne herunterladen, die Sie anrufen möchten, dafür
  • Öffnen Sie die Website der Ziel-Domäne im Chrome (Beispiel: https://amazonservice.domain.com)
  • Klicken Sie auf das kleine Schlosssymbol vor der URL im Browser
  • Klicken Sie auf Zertifikate anzeigen
  • Klicken Sie nun auf Zertifikat ist gültig, wie unten gezeigt
  • Bildbeschreibung eingeben
  • Jetzt wird sich ein neues Popup öffnen, wie unten gezeigt, Los
  • Öffnen Sie den Details-Tab
  • Wählen Sie den RootCert oben aus
  • Klicken Sie auf Exportieren und speichern Sie die .cer-Datei in einem Verzeichnis auf Ihrem System

Jetzt haben Sie den öffentlichen Keystore Ihrer Ziel-Domäne, die Sie in Ihrer Java-Anwendung aufrufen möchten, jetzt müssen wir diesen Keystore in Ihr JRE importieren, dafür gehen Sie zum Verzeichnis $JAVA_HOME/bin und führen Sie den folgenden Befehl aus

./keytool -importcert -alias someAliasName -keystore {JAVA_HOME}/lib/security/cacerts -file {PathToDownloads}/certificateFileName.cer

Es wird nach einem Passwort gefragt, geben Sie das Passwort ein, wenn Sie es wissen, das Standardpasswort für das Zertifikat ist changeit

Referenzen

  1. https://confluence.atlassian.com/kb/how-to-import-a-public-ssl-certificate-into-a-jvm-867025849.html
  2. https://confluence.atlassian.com/kb/unable-to-connect-to-ssl-services-due-to-pkix-path-building-failed-error-779355358.html

12voto

Abhishek Galoda Punkte 2624

Der Grund, warum wir den obigen Fehler erhalten, liegt darin, dass das JDK mit vielen vertrauenswürdigen Zertifizierungsstellen (CA) Zertifikaten in einer Datei namens 'cacerts' gebündelt ist, aber diese Datei hat keine Ahnung von unserem selbstsignierten Zertifikat. Mit anderen Worten, die cacerts-Datei hat unser selbstsigniertes Zertifikat nicht importiert und behandelt es daher nicht als vertrauenswürdige Entität, weshalb der obige Fehler auftritt.

Wie man den obigen Fehler behebt

Um den obigen Fehler zu beheben, müssen wir lediglich das selbstsignierte Zertifikat in die cacerts-Datei importieren.

Erstens suchen Sie die cacerts-Datei. Wir müssen den JDK-Standort herausfinden. Wenn Sie Ihre Anwendung über eine der IDEs wie Eclipse oder IntelliJ Idea ausführen, gehen Sie zu den Projekteinstellungen und finden Sie heraus, wo sich der JDK-Standort befindet. Beispielsweise wäre auf einem Mac OS der typische Speicherort der cacerts-Datei unter diesem Pfad /Library/Java/JavaVirtualMachines/{{JDK_version}}/Contents/Home/jre/lib/security auf einem Windows-Computer wäre es unter {{Installationsverzeichnis}}/{{JDK_version}}/jre/lib/security

Nachdem Sie die cacerts-Datei gefunden haben, müssen wir jetzt unser selbstsigniertes Zertifikat in diese cacerts-Datei importieren. Überprüfen Sie den vorherigen Artikel, wenn Sie nicht wissen, wie Sie das selbstsignierte Zertifikat korrekt generieren können.

Wenn Sie keine Zertifikatsdatei (.crt) haben und nur eine .jks-Datei haben, können Sie eine .crt-Datei generieren, indem Sie den folgenden Befehl verwenden. Wenn Sie bereits eine .crt/.pem-Datei haben, können Sie den folgenden Befehl ignorieren

## Zum Generieren eines Zertifikats aus dem Keystore (.jks-Datei) ####

keytool -export -keystore keystore.jks -alias selfsigned -file selfsigned.crt

Schritt wird eine Datei namens selfsigned.crt generieren. Importieren Sie nun das Zertifikat in den cacerts

Fügen Sie das Zertifikat jetzt zu JRE/lib/security/cacerts (trustore) hinzu

keytool -importcert -file selfsigned.crt -alias selfsigned -keystore {{cacerts path}}

zum Beispiel

keytool -importcert -file selfsigned.nextgen.crt -alias selfsigned.nextgen -keystore /Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/Contents/Home/jre/lib/security/cacerts

Das ist alles, starten Sie Ihre Anwendung neu und es sollte funktionieren. Wenn es immer noch nicht funktioniert und einen SSL-Handshake-Fehler verursacht. Es bedeutet wahrscheinlich, dass Sie eine andere Domain verwenden als die im Zertifikat registrierte.

Der Link mit ausführlicher Erklärung und Schritt-für-Schritt-Lösung ist hier.

9voto

Ankur jain Punkte 873

Ich hatte dasselbe Problem und konnte es mit den folgenden einfachen Schritten lösen:

1) Laden Sie die InstallCert.java von Google herunter

2) Kompilieren Sie es mit javac InstallCert.java

3) Führen Sie InstallCert.java mit java InstallCert.java aus, geben Sie den Hostnamen und den HTTPS-Port ein und drücken Sie "1", wenn nach der Eingabe gefragt wird. Es fügt "localhost" als vertrauenswürdigen Keystore hinzu und generiert eine Datei namens "jssecacerts" wie unten gezeigt:

java InstallCert localhost:443

4) Kopieren Sie die jssecacerts in den Ordner $JAVA_HOME/jre/lib/security

Die Hauptquelle zur Lösung des Problems finden Sie hier:

https://ankurjain26.blogspot.in/2017/11/javaxnetsslsslhandshakeexception.html

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