Lisää
"PKIX-polun luominen epäonnistui" ja "ei löydy pätevää varmennepolkua pyydettyyn kohteeseen"
Yritän saada twiittejä käyttämällä twitter4j-kirjastoa java-projektiini. Ensimmäisellä ajokerralla sain virheilmoituksen varmenteesta sun.security.validator.ValidatorException
ja sun.security.provider.certpath.SunCertPathBuilderException
. Sitten lisäsin twitter varmenteen:
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"
Mutta tuloksetta. Tässä on menettelytapa, jolla saat twitterit:
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());
}
Ja tässä on virhe:
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
Kun monta tuntia yrittänyt rakentaa cert tiedostoja saada minun Java 6 asennus toimii uuden twitter cert's, Olen vihdoin törmännyt uskomattoman yksinkertainen ratkaisu haudattu kommentti yksi ilmoitustauluja. Kopioi cacerts-tiedosto Java 7 -asennuksesta ja korvaa Java 6 -asennuksessa oleva tiedosto. Luultavasti on parasta tehdä varmuuskopio cacerts-tiedostosta ensin, mutta sitten vain kopioit uuden tiedoston ja BOOM! se vain toimii.
Huomaa, että olen itse asiassa kopioinut Windowsin cacerts-tiedoston Linux-asennukseen ja se toimi hienosti.
Tiedosto sijaitsee osoitteessa
jre/lib/security/cacerts
sekä vanhassa että uudessa Java jdk -asennuksessa.Toivottavasti tämä säästää jonkun muun tuntikausien vaivalta.
Olen törmännyt tähän ongelmaan, jonka korjaaminen vei monta tuntia tutkimustyötä, erityisesti automaattisesti luotujen varmenteiden kanssa, jotka ovat toisin kuin viralliset varmenteet melko hankalia, eikä Java pidä niistä kovin paljon.
Tarkista seuraava linkki: Varmenteiden ongelman ratkaiseminen Javassa 1
Periaatteessa sinun on lisättävä palvelimelta tuleva varmenne Java Home certsiin.
InstallCert
Java-lähdekoodi ja suorita se palvelimen ollessa käynnissä antamalla seuraavat argumentitserver[:port]
. Salasanaa ei tarvita, koska alkuperäinen salasana toimii Java-sertifikaateissa ("changeit").jssecerts
-tiedoston sen hakemiston sisälle, jossa suoritit ohjelman (jos se suoritetaan Eclipsen kautta, varmista, että olet määrittänyt työhakemiston kohdassaRun -> Configurations
).$JAVA_HOME/jre/lib/security
.Näiden vaiheiden jälkeen varmenteella varustetut yhteydet eivät enää tuota poikkeuksia Javassa.
Seuraava lähdekoodi on tärkeä, ja se katosi (Sun) Oraclen blogeista, ainoa sivu, josta löysin sen, oli annettu linkki, joten liitän sen vastaukseen mahdollisia viitteitä varten.
Yleensä tällainen poikkeus tapahtuu, kun luotetun varmenteen PATH-osoitteessa on ristiriita. Tarkista kokoonpano tai polku, jossa tätä palvelinvarmentetta tarvitaan suojattua viestintää varten.