"PKIX path building failed" og "unable to find valid certification path to requested target"
Jeg' prøver å få tweets ved hjelp av twitter4j -biblioteket for java-prosjektet mitt. På min første kjøring fikk jeg en feil om sertifikat sun.security.validator.ValidatorException
og sun.security.provider.certpath.SunCertPathBuilderException
. Så la jeg til twitter-sertifikat av:
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 uten å lykkes. Her er fremgangsmåten for å 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());
}
Og her er feilen:
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
Etter å ha brukt mange timer på å bygge cert-filer for å få Java 6-installasjonen min til å fungere med de nye twitter-sertifikatene, snublet jeg endelig over en utrolig enkel løsning i en kommentar i et av forumene. Det er bare å kopiere cacerts-filen fra en Java 7-installasjon og overskrive den i Java 6-installasjonen. Det er nok best å ta en sikkerhetskopi av cacerts-filen først, men så er det bare å kopiere den nye inn og BOOM! så fungerer det.
Merk at jeg faktisk kopierte en Windows cacerts-fil til en Linux-installasjon, og det fungerte helt fint.
Filen ligger i
jre/lib/security/cacerts
i både den gamle og den nye Java jdk-installasjonen.Håper dette sparer noen andre for timevis med irritasjon.
Jeg har snublet over dette problemet som det tok mange timer å løse, spesielt med autogenererte sertifikater, som i motsetning til offisielle sertifikater er ganske vanskelige, og Java liker dem ikke så godt.
Vennligst sjekk følgende lenke: Løs problemet med sertifikater i Java.
I utgangspunktet må du legge til sertifikatet fra serveren i Java Home certs.
InstallCert
og kjør den mens serveren kjører, med følgende argumenterserver[:port]
. Du trenger ikke noe passord, da det opprinnelige passordet fungerer for Java-sertifikater ("changeit").jssecerts
-fil i katalogen der du kjørte programmet (hvis det kjøres fra Eclipse, må du konfigurere arbeidskatalogen iRun -> Configurations
).$JAVA_HOME/jre/lib/security
.Når du har fulgt disse trinnene, vil tilkoblingene med sertifikatet ikke lenger generere unntak i Java.
Følgende kildekode er viktig, og den forsvant fra (Sun) Oracle-blogger, den eneste siden jeg fant den var på lenken som ble gitt, derfor legger jeg den ved i svaret for eventuell referanse.
Vanligvis oppstår denne typen unntak når det er uoverensstemmelse i PATH for det klarerte sertifikatet. Kontroller konfigurasjonen eller banen der dette serversertifikatet kreves for sikker kommunikasjon.