Mais
"a construção do caminho PKIX falhou" e "incapaz de encontrar um caminho de certificação válido para o alvo solicitado"
I'estou tentando conseguir tweets usando a biblioteca **twitter4j*** para meu projeto java. Na minha primeira execução eu recebi um erro sobre o certificado sun.security.validator.validatorException' e
sun.security.provider.certpath.SunCertPathBuilderException'. Depois adicionei o certificado do twitter por:
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"
Mas sem sucesso. Aqui está o procedimento para ter 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());
}
E aqui está o erro:
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
Depois de muitas horas tentando construir arquivos cert para fazer minha instalação Java 6 funcionar com o novo cert's do twitter, eu finalmente tropecei em uma solução incrivelmente simples enterrada em um comentário em um dos quadros de mensagens. Basta copiar o arquivo cacerts de uma instalação Java 7 e sobrescrever o da sua instalação Java 6. Provavelmente é melhor fazer um backup do arquivo de cacerts primeiro, mas depois basta copiar o novo e BOOM! funciona.
Note que eu copiei um arquivo de cacerts do Windows para uma instalação Linux e funcionou muito bem.
O arquivo está localizado em
jre/lib/security/cacerts
tanto na antiga como na nova instalação Java jdk.Espero que isto poupe horas de agravamento a outra pessoa.
Eu tropecei nesta questão que levou muitas horas de pesquisa para ser resolvida, especialmente com certificados auto-gerados, que ao contrário dos oficiais, são bastante complicados e Java não gosta muito deles.
Por favor, verifique o seguinte link: Resolver problema com certificados em Java
Basicamente você tem que adicionar o certificado do servidor aos certificados Java Home.
InstallCert
e execute-o enquanto o servidor está rodando, fornecendo os seguintes argumentosserver[:port]
. Nenhuma senha é necessária, pois a senha original funciona para os certificados Java ("changeit").jssecerts' dentro do diretório onde você executou o Programa (Se executado a partir do Eclipse então certifique-se de configurar o diretório Work em
Run -> Configurations').Após seguir estes passos, as conexões com o certificado não gerarão mais exceções dentro do Java.
O seguinte código fonte é importante e desapareceu dos blogs (Sun) Oracle, a única página que encontrei estava no link fornecido, por isso estou anexando-o na resposta para qualquer referência.
Aqui normalmente este tipo de exceção ocorre quando há descasamento no PAI do certificado de confiança. Verifique a configuração ou caminho onde este certificado de servidor é necessário para uma comunicação segura.