"PKIX path building failed" und "unable to find valid certification path to requested target"
Ich versuche, Tweets mit twitter4j Bibliothek für mein Java-Projekt zu erhalten. Bei meinem ersten Lauf bekam ich einen Fehler über das Zertifikat sun.security.validator.ValidatorException
und sun.security.provider.certpath.SunCertPathBuilderException
. Dann fügte ich Twitter-Zertifikat durch:
C:\Program Files\Java\jdk1.7.0_45\jre\lib\security>keytool -importcert -trustcacerts -file PathToCert -alias ca_alias -keystore "C:\Program Files\Java\jdk1.7.0_45\jre\lib\security\cacerts"
Aber ohne Erfolg. Hier ist das Verfahren, um Twitter zu erhalten:
public static void main(String[] args) throws TwitterException {
ConfigurationBuilder cb = new ConfigurationBuilder();
cb.setDebugEnabled(true)
.setOAuthConsumerKey("myConsumerKey")
.setOAuthConsumerSecret("myConsumerSecret")
.setOAuthAccessToken("myAccessToken")
.setOAuthAccessTokenSecret("myAccessTokenSecret");
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("Total amount of tweets: " + result.getTweets().size());
List<Status> tweets = result.getTweets();
for (Status tweet : tweets) {
System.out.println("@" + tweet.getUser().getScreenName() + " : " + tweet.getText());
}
} catch (TwitterException te) {
te.printStackTrace();
System.out.println("Failed to search tweets: " + te.getMessage());
}
Und hier ist der Fehler:
sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
Relevant discussions can be found on the Internet at:
http://www.google.co.jp/search?q=d35baff5 or
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)
Caused by: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at sun.security.ssl.Alerts.getSSLException(Unknown Source)
at sun.security.ssl.SSLSocketImpl.fatal(Unknown Source)
at sun.security.ssl.Handshaker.fatalSE(Unknown Source)
at sun.security.ssl.Handshaker.fatalSE(Unknown Source)
at sun.security.ssl.ClientHandshaker.serverCertificate(Unknown Source)
at sun.security.ssl.ClientHandshaker.processMessage(Unknown Source)
at sun.security.ssl.Handshaker.processLoop(Unknown Source)
at sun.security.ssl.Handshaker.process_record(Unknown Source)
at sun.security.ssl.SSLSocketImpl.readRecord(Unknown Source)
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(Unknown Source)
at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source)
at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source)
at sun.net.www.protocol.https.HttpsClient.afterConnect(Unknown Source)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
at java.net.HttpURLConnection.getResponseCode(Unknown Source)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(Unknown Source)
at twitter4j.internal.http.HttpResponseImpl.<init>(HttpResponseImpl.java:34)
at twitter4j.internal.http.HttpClientImpl.request(HttpClientImpl.java:141)
... 5 more
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at sun.security.validator.PKIXValidator.doBuild(Unknown Source)
at sun.security.validator.PKIXValidator.engineValidate(Unknown Source)
at sun.security.validator.Validator.validate(Unknown Source)
at sun.security.ssl.X509TrustManagerImpl.validate(Unknown Source)
at sun.security.ssl.X509TrustManagerImpl.checkTrusted(Unknown Source)
at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(Unknown Source)
... 20 more
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(Unknown Source)
at java.security.cert.CertPathBuilder.build(Unknown Source)
... 26 more
Failed to search tweets: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
346
3
Nach vielen Stunden, in denen ich versucht habe, cert-Dateien zu erstellen, um meine Java 6-Installation mit den neuen twitter cert's zum Laufen zu bringen, bin ich schließlich über eine unglaublich einfache Lösung gestolpert, die in einem Kommentar in einem der Message Boards versteckt war. Kopieren Sie einfach die cacerts-Datei aus einer Java 7-Installation und überschreiben Sie die Datei in Ihrer Java 6-Installation. Wahrscheinlich ist es am besten, zuerst eine Sicherungskopie der cacerts-Datei zu machen, aber dann kopiert man einfach die neue Datei hinein und BOOM! es funktioniert.
Ich habe tatsächlich eine Windows-Cacerts-Datei auf eine Linux-Installation kopiert, und es funktionierte einwandfrei.
Die Datei befindet sich in
jre/lib/security/cacerts
sowohl in der alten als auch in der neuen Java jdk Installation.Ich hoffe, dies erspart jemand anderem stundenlangen Ärger.
Ich bin über dieses Problem gestolpert, dessen Behebung viele Stunden der Recherche in Anspruch genommen hat, insbesondere bei automatisch generierten Zertifikaten, die im Gegensatz zu den offiziellen Zertifikaten ziemlich kompliziert sind und die Java nicht so sehr mag.
Bitte schauen Sie sich den folgenden Link an: Problem mit Zertifikaten in Java lösen
Grundsätzlich müssen Sie das Zertifikat des Servers zu den Java Home-Zertifikaten hinzufügen.
InstallCert
herunter und führen Sie ihn aus, während der Server läuft, wobei Sie die folgenden Argumente angeben:server[:port]
. Es wird kein Passwort benötigt, da das ursprüngliche Passwort für die Java-Zertifikate funktioniert ("changeit").jssecerts
-Datei in dem Verzeichnis zu erstellen, in dem Sie das Programm ausgeführt haben (Wenn es von Eclipse aus ausgeführt wird, stellen Sie sicher, dass Sie das Arbeitsverzeichnis inRun -> Configurations
konfigurieren).$JAVA_HOME/jre/lib/security
.Nachdem Sie diese Schritte durchgeführt haben, werden die Verbindungen mit dem Zertifikat keine Ausnahmen mehr in Java erzeugen.
Der folgende Quellcode ist wichtig und er ist aus den (Sun) Oracle Blogs verschwunden, die einzige Seite, auf der ich ihn gefunden habe, war der angegebene Link, daher füge ich ihn der Antwort als Referenz bei.
Normalerweise tritt diese Art von Ausnahme auf, wenn der PATH des vertrauenswürdigen Zertifikats nicht übereinstimmt. Überprüfen Sie die Konfiguration oder den Pfad, in dem dieses Serverzertifikat für die sichere Kommunikation erforderlich ist.