"PKIX path building failed" och "unable to find valid certification path to requested target"
Jag försöker hämta tweets med hjälp av biblioteket twitter4j i mitt java-projekt. Vid min första körning fick jag ett fel om certifikatet sun.security.validator.ValidatorException
och sun.security.provider.certpath.SunCertPathBuilderException
. Sedan lade jag till twittercertifikatet genom att:
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"
Men utan framgång. Här är proceduren för att få twitters:
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());
}
Och här är felet:
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
Efter många timmars försök att bygga cert-filer för att få min Java 6-installation att fungera med de nya twitter-certarna snubblade jag till slut över en otroligt enkel lösning som låg begravd i en kommentar på en av anslagstavlorna. Det är bara att kopiera cacerts-filen från en Java 7-installation och skriva över den som finns i din Java 6-installation. Det är förmodligen bäst att först göra en säkerhetskopia av cacerts-filen, men sedan är det bara att kopiera in den nya filen och BOOM! det fungerar bara.
Observera att jag faktiskt kopierade en Windows cacerts-fil till en Linux-installation och det fungerade utmärkt.
Filen finns i
jre/lib/security/cacerts
i både den gamla och den nya Java jdk-installationen.Hoppas att detta sparar timmar av besvär för någon annan.
Jag har snubblat över detta problem som tog många timmars forskning för att åtgärda, speciellt med automatiskt genererade certifikat, som till skillnad från officiella certifikat är ganska knepiga och Java gillar dem inte så mycket.
Vänligen kontrollera följande länk: Lösa problem med certifikat i Java
I grund och botten måste du lägga till certifikatet från servern till Java Home certs.
InstallCert
och kör den medan servern körs, med följande argumentserver[:port]
. Inget lösenord behövs, eftersom det ursprungliga lösenordet fungerar för Java-certifikaten ("changeit").jssecerts
-fil i den katalog där du utförde programmet (Om det utförs från Eclipse så se till att du konfigurerar arbetskatalogen iRun -> Configurations
).$$JAVA_HOME/jre/lib/security
.Efter att ha följt dessa steg kommer anslutningarna med certifikatet inte längre att generera undantag i Java.
Följande källkod är viktig och den försvann från (Sun) Oracles bloggar, den enda sida jag hittade den på var på den angivna länken, därför bifogar jag den i svaret för eventuella referenser.
Normalt uppstår den här typen av undantag när det finns en missmatchning i PATH för det betrodda certifikatet. Kontrollera konfigurationen eller sökvägen där servercertifikatet krävs för säker kommunikation.