У багатьох випадках виникнення проблем з відправленням email через протокол SMTP пов’язані з проблемами сертифікації. У цій статті ми розглянемо один з таких випадків та надамо рішення.
Здається, що проблема полягає в тому, що ваша програма на Java не може встановити достовірний шлях сертифікації для цільової мети. Ваша спроба додати сертифікат Twitter за допомогою команди keytool не принесла успіху, і ви все ще отримуєте помилки сертифікації.
Для початку розглянемо стек-трейс помилки, який ви отримали:
1 |
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 |
Цей стек-трейс показує, що проблема полягає в неможливості знайти достовірний шлях сертифікації до цільової мети. Це може статися, якщо ваша програма не має достатньо повних даних про сертифікати, необхідні для підтвердження довіри до сервера.
Одним з можливих рішень може бути додавання сертифікатів у довірене хранилище вашої програми. Ви можете спробувати додати сертифікати в довірене хранилище за допомогою наступного підходу:
1 |
keytool -importcert -trustcacerts -file PathToCert -alias ca_alias -keystore "C:\Program Files\Java\jdk1.7.0_45\jre\lib\security\cacerts" |
Замініть “PathToCert” на шлях до вашого сертифіката та “ca_alias” на аліас, який ви бажаєте використовувати для цього сертифіката. Після цього спробуйте знову виконати свій код та перевірте, чи ви все ще отримуєте помилку сертифікації.
Якщо це рішення не допомагає, можливо, вам доведеться розглянути інші варіанти, такі як налаштування довірених кореневих сертифікатів у вашій програмі або перевірка конфігурації вашого середовища виконання.
Не забудьте також перевірити, чи ваша програма використовує актуальну версію бібліотеки Twitter4J та чи налаштовані відповідні ключі доступу до Twitter API.
Загалом, проблеми з сертифікацією можуть бути досить складними для вирішення, але з належними зусиллями і розумінням причин цих проблем ви зможете знайти відповідне рішення для вашої конкретної ситуації.