Altro
"PKIX path building failed" e "unable to find valid certification path to requested target"
Sto cercando di ottenere i tweet usando la libreria twitter4j per il mio progetto java. Sulla mia prima esecuzione ho ottenuto un errore sul certificato sun.security.validator.ValidatorException
e sun.security.provider.certpath.SunCertPathBuilderException
. Poi ho aggiunto il certificato di twitter da:
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"
Ma senza successo. Ecco la procedura per ottenere 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());
}
Ed ecco l'errore:
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
Dopo molte ore a cercare di costruire i file cert per far funzionare la mia installazione di Java 6 con i nuovi cert di Twitter, alla fine mi sono imbattuto in una soluzione incredibilmente semplice sepolta in un commento in uno dei forum. Basta copiare il file cacerts da un'installazione Java 7 e sovrascrivere quello della vostra installazione Java 6. Probabilmente è meglio fare prima un backup del file cacerts, ma poi basta copiare quello nuovo e BOOM! funziona.
Notate che in realtà ho copiato un file cacerts di Windows su un'installazione Linux e ha funzionato benissimo.
Il file si trova in
jre/lib/security/cacerts
sia nella vecchia che nella nuova installazione Java jdk.Spero che questo risparmi a qualcun altro ore di aggravamento.
Mi sono imbattuto in questo problema che ha richiesto molte ore di ricerca per essere risolto, specialmente con i certificati auto-generati, che a differenza di quelli ufficiali, sono abbastanza complicati e Java non li ama molto.
Si prega di controllare il seguente link: Risolvere il problema dei certificati in Java
Fondamentalmente devi aggiungere il certificato dal server ai certificati di Java Home.
InstallCert
ed eseguitelo mentre il server è in esecuzione, fornendo i seguenti argomentiserver[:port]
. Non è necessaria alcuna password, poiché la password originale funziona per i certificati Java ("changeit").jssecerts
all'interno della directory dove avete eseguito il programma (se eseguito da Eclipse allora assicuratevi di configurare la directory di lavoro inRun -> Configurations
).$JAVA_HOME/jre/lib/security
.Dopo aver seguito questi passi, le connessioni con il certificato non genereranno più eccezioni in Java.
Il seguente codice sorgente è importante ed è scomparso dai blog di (Sun) Oracle, l'unica pagina che ho trovato era sul link fornito, quindi lo sto allegando nella risposta per qualsiasi riferimento.
Qui normalmente questo tipo di eccezione si verifica quando c'è una mancata corrispondenza nel PATH del certificato di fiducia. Controllate la configurazione o il percorso in cui questo certificato del server è richiesto per la comunicazione sicura.