"PKIX yolu oluşturma başarısız oldu" ve "istenen hedef için geçerli sertifika yolu bulunamıyor"
Java projem için twitter4j kütüphanesini kullanarak tweetleri almaya çalışıyorum. İlk çalıştırmamda sertifika sun.security.validator.ValidatorException
ve sun.security.provider.certpath.SunCertPathBuilderException
ile ilgili bir hata aldım. Daha sonra twitter sertifikasını ekledim:
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"
Ama başarılı olamadım. İşte twitter almak için prosedür:
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());
}
Ve işte hata:
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
Java 6 kurulumumun yeni twitter sertifikalarıyla çalışmasını sağlamak için sertifika dosyaları oluşturmaya çalışarak saatler geçirdikten sonra, sonunda mesaj panolarından birinde bir yorumda gömülü olan inanılmaz derecede basit bir çözüme rastladım. Java 7 kurulumundaki cacerts dosyasını kopyalayın ve Java 6 kurulumunuzdakinin üzerine yazın. Muhtemelen en iyisi önce cacerts dosyasının bir yedeğini almaktır, ancak daha sonra yenisini kopyalayın ve BOOM! sadece çalışır.
Aslında bir Windows cacerts dosyasını bir Linux kurulumuna kopyaladım ve gayet iyi çalıştı.
Dosya, hem eski hem de yeni Java jdk kurulumlarında
jre/lib/security/cacerts
içinde bulunur.Umarım bu başka birini saatlerce uğraşmaktan kurtarır.
Bu sorunu çözmek için saatler süren bir araştırma yaptım, özellikle de Resmi sertifikaların aksine oldukça zor olan ve Java'nın pek hoşlanmadığı otomatik oluşturulan sertifikalarda.
Lütfen aşağıdaki bağlantıyı kontrol edin: Java'da Sertifikalarla İlgili Sorun Çözme
Temel olarak sunucudan gelen sertifikayı Java Home sertifikalarına eklemeniz gerekir.
sınıfının Java kaynak kodunu indirin ve sunucu çalışırken aşağıdaki argümanları sağlayarak çalıştırın
server[:port]`. Java sertifikaları için orijinal parola çalıştığından parolaya gerek yoktur ("changeit").jssecerts
dosyası oluşturmanıza izin verecektir (Eclipse'den çalıştırılırsa, Çalışma dizininiÇalıştır -> Yapılandırmalar
bölümünde yapılandırdığınızdan emin olun).$JAVA_HOME/jre/lib/security
dizinine kopyalayın.Bu adımları izledikten sonra, sertifika ile yapılan bağlantılar artık Java içinde istisna oluşturmayacaktır.
Aşağıdaki kaynak kodu önemlidir ve (Sun) Oracle bloglarından kaybolmuştur, bulduğum tek sayfa verilen bağlantıdaydı, bu nedenle herhangi bir referans için cevaba ekliyorum.
Burada normalde bu tür bir istisna, güvenilen sertifikanın YOL'unda uyumsuzluk olduğunda ortaya çıkar. Güvenli iletişim için bu sunucu sertifikasının gerekli olduğu yapılandırmayı veya yolu kontrol edin.