“Creazione del percorso PKIX non riuscita” e “imansible trovare il percorso di certificazione valido per l’objective richiesto”

Sto cercando di ottenere tweet usando la libreria twitter4j per il mio progetto java. Alla mia prima esecuzione ho ricevuto 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 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 qui c’è 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.(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. Vai all’URL nel browser Firefox, fai clic sulla catena di certificati HTTPS (accanto all’indirizzo URL). Fai clic su "more info" > "security" > "show certificate" > "details" > "export.." . Rispondi al nome e scegli il tipo di file example.cer. Ora hai un file con keystore e devi aggiungerlo alla tua JVM

    2. Determina la posizione dei file cacerts, ad es. C:\Program Files (x86)\Java\jre1.6.0_22\lib\security\cacerts.

    3. Successivamente importa il file example.cer in cacerts nella riga di comando:

    keytool -import -alias example -keystore C:\Program Files (x86)\Java\jre1.6.0_22\lib\security\cacerts -file example.cer

    Ti verrà chiesta la password il cui valore predefinito è changeit

    Riavvia il tuo JVM / PC.

    fonte: http://magicmonster.com/kb/prg/java/ssl/pkix_path_building_failed.html

    Dopo molte ore cercando di creare file cert per far funzionare la mia installazione Java 6 con i nuovi cert di Twitter, alla fine sono incappato in una soluzione incredibilmente semplice seppellita in un commento in una delle bacheche dei messaggi. Basta copiare il file cacerts da un’installazione di Java 7 e sovrascrivere quello nell’installazione di Java 6. Probabilmente è meglio fare un backup del file cacerts per primo, ma poi basta copiare quello nuovo in e BOOM! funziona e basta

    Si noti che in realtà ho copiato un file cacerts di Windows su un’installazione Linux e ha funzionato bene.

    Il file si trova in jre/lib/security/cacerts nelle installazioni jdk Java vecchie e nuove.

    Spero che questo salvi altre ore di irritazione.

    Mi sono imbattuto in questo problema che ha richiesto molte ore di ricerche da risolvere, in particolare con i certificati generati automaticamente, che a differenza di quelli ufficiali sono piuttosto complicati e a Java non piacciono molto.

    Si prega di controllare il seguente link: Risolvere il problema con i certificati in Java

    Fondamentalmente è necessario aggiungere il certificato dal server ai certificati di Java Home.

    1. Genera o ottieni il tuo certificato e configura Tomcat per usarlo in Servers.xml
    2. Scarica il codice sorgente Java della class InstallCert ed InstallCert mentre il server è in esecuzione, fornendo i seguenti argomenti server[:port] . Non è necessaria alcuna password, poiché la password originale funziona per i certificati Java (“changeit”).
    3. Il programma si collegherà al server e Java genererà un’eccezione, analizzerà il certificato fornito dal server e ti permetterà di creare un file jssecerts all’interno della directory in cui hai eseguito il programma (se eseguito da Eclipse assicurati di configurare il Directory di lavoro in Run -> Configurations ).
    4. Copia manualmente il file in $JAVA_HOME/jre/lib/security

    Dopo aver seguito questi passaggi, le connessioni con il certificato non genereranno più eccezioni all’interno di Java.

    Il seguente codice sorgente è importante ed è scomparso dai blog Oracle (Sun), l’unica pagina che ho trovato era sul link fornito, quindi la sto allegando nella risposta per qualsiasi riferimento.

     /* * Copyright 2006 Sun Microsystems, Inc. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * - Neither the name of Sun Microsystems nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Originally from: * http://blogs.sun.com/andreas/resource/InstallCert.java * Use: * java InstallCert hostname * Example: *% java InstallCert ecc.fedora.redhat.com */ import javax.net.ssl.*; import java.io.*; import java.security.KeyStore; import java.security.MessageDigest; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; /** * Class used to add the server's certificate to the KeyStore * with your trusted certificates. */ public class InstallCert { public static void main(String[] args) throws Exception { String host; int port; char[] passphrase; if ((args.length == 1) || (args.length == 2)) { String[] c = args[0].split(":"); host = c[0]; port = (c.length == 1) ? 443 : Integer.parseInt(c[1]); String p = (args.length == 1) ? "changeit" : args[1]; passphrase = p.toCharArray(); } else { System.out.println("Usage: java InstallCert [:port] [passphrase]"); return; } File file = new File("jssecacerts"); if (file.isFile() == false) { char SEP = File.separatorChar; File dir = new File(System.getProperty("java.home") + SEP + "lib" + SEP + "security"); file = new File(dir, "jssecacerts"); if (file.isFile() == false) { file = new File(dir, "cacerts"); } } System.out.println("Loading KeyStore " + file + "..."); InputStream in = new FileInputStream(file); KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType()); ks.load(in, passphrase); in.close(); SSLContext context = SSLContext.getInstance("TLS"); TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); tmf.init(ks); X509TrustManager defaultTrustManager = (X509TrustManager) tmf.getTrustManagers()[0]; SavingTrustManager tm = new SavingTrustManager(defaultTrustManager); context.init(null, new TrustManager[]{tm}, null); SSLSocketFactory factory = context.getSocketFactory(); System.out.println("Opening connection to " + host + ":" + port + "..."); SSLSocket socket = (SSLSocket) factory.createSocket(host, port); socket.setSoTimeout(10000); try { System.out.println("Starting SSL handshake..."); socket.startHandshake(); socket.close(); System.out.println(); System.out.println("No errors, certificate is already trusted"); } catch (SSLException e) { System.out.println(); e.printStackTrace(System.out); } X509Certificate[] chain = tm.chain; if (chain == null) { System.out.println("Could not obtain server certificate chain"); return; } BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); System.out.println(); System.out.println("Server sent " + chain.length + " certificate(s):"); System.out.println(); MessageDigest sha1 = MessageDigest.getInstance("SHA1"); MessageDigest md5 = MessageDigest.getInstance("MD5"); for (int i = 0; i < chain.length; i++) { X509Certificate cert = chain[i]; System.out.println (" " + (i + 1) + " Subject " + cert.getSubjectDN()); System.out.println(" Issuer " + cert.getIssuerDN()); sha1.update(cert.getEncoded()); System.out.println(" sha1 " + toHexString(sha1.digest())); md5.update(cert.getEncoded()); System.out.println(" md5 " + toHexString(md5.digest())); System.out.println(); } System.out.println("Enter certificate to add to trusted keystore or 'q' to quit: [1]"); String line = reader.readLine().trim(); int k; try { k = (line.length() == 0) ? 0 : Integer.parseInt(line) - 1; } catch (NumberFormatException e) { System.out.println("KeyStore not changed"); return; } X509Certificate cert = chain[k]; String alias = host + "-" + (k + 1); ks.setCertificateEntry(alias, cert); OutputStream out = new FileOutputStream("jssecacerts"); ks.store(out, passphrase); out.close(); System.out.println(); System.out.println(cert); System.out.println(); System.out.println ("Added certificate to keystore 'jssecacerts' using alias '" + alias + "'"); } private static final char[] HEXDIGITS = "0123456789abcdef".toCharArray(); private static String toHexString(byte[] bytes) { StringBuilder sb = new StringBuilder(bytes.length * 3); for (int b : bytes) { b &= 0xff; sb.append(HEXDIGITS[b >> 4]); sb.append(HEXDIGITS[b & 15]); sb.append(' '); } return sb.toString(); } private static class SavingTrustManager implements X509TrustManager { private final X509TrustManager tm; private X509Certificate[] chain; SavingTrustManager(X509TrustManager tm) { this.tm = tm; } public X509Certificate[] getAcceptedIssuers() { throw new UnsupportedOperationException(); } public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { throw new UnsupportedOperationException(); } public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { this.chain = chain; tm.checkServerTrusted(chain, authType); } } } 

    Il mio approccio UI:

    1. Scarica http://www.keystore-explorer.org/
    2. Apri $ JAVA_HOME / jre / lib / security / cacerts
    3. inserisci PW: changeit (Can be changeme su Mac)
    4. Importa il tuo file .crt

    CMD-Line:

    1. keytool -importcert -file jetty.crt -alias jetty -keystore $ JAVA_HOME / jre / lib / security / cacerts
    2. inserisci PW: changeit (Can be changeme su Mac)

    Ho avuto una situazione leggermente diversa, quando entrambi i JDK e JRE 1.8.0_112 erano presenti sul mio sistema.

    Ho importato i nuovi certificati CA in [JDK_FOLDER]\jre\lib\security\cacerts utilizzando il comando già noto:

     keytool -import -trustcacerts -keystore cacerts -alias  -file  

    Eppure, ho continuato a ricevere lo stesso errore di costruzione del percorso PKIX .

    Ho aggiunto le informazioni di debug alla CLI java, utilizzando java -Djavax.net.debug=all ... > debug.log . Nel file debug.log, la riga che inizia con trustStore è: effettivamente indirizzata all’archivio cacerts trovato in [JRE_FOLDER]\lib\security\cacerts .

    Nel mio caso la soluzione era copiare il file cacerts usato da JDK (che aveva aggiunto le nuove CA) su quello usato da JRE e che risolveva il problema.

    Volevo importare il certificato per smtp.gmail.com

    Solo la soluzione ha funzionato per me è 1. Immettere il comando per visualizzare questo certificato

    D: \ openssl \ bin \ openssl.exe s_client -connect smtp.gmail.com:465

    1. Copia e salva le linee tra “—– BEGIN CERTIFICATE —–” e “—– END CERTIFICATE —–” in un file, gmail.cer

    2. Correre

      keytool -import -alias smtp.gmail.com -keystore “% JAVA_HOME% / jre / lib / security / cacerts” -file C: \ Users \ Admin \ Desktop \ gmail.cer

    3. Inserisci la password chageit

    4. Fare clic su Sì per importare il certificato

    5. Riavvia java

    ora esegui il comando e sei a posto

    1. Controlla il certificato

    Prova a caricare l’URL di destinazione nel browser e visualizza il certificato del sito (di solito è accessibile dall’icona con il segno di blocco. È sul lato sinistro o destro della barra degli indirizzi del browser) se è scaduto o non attendibile per altri motivi.

    2. Installa le ultime versioni di JRE e JDK

    Le nuove versioni di solito vengono con il set aggiornato dei certificati attendibili.

    Inoltre, se ansible, disinstallare le vecchie versioni. Ciò renderà espliciti gli errori di errata configurazione.

    3. Controlla la tua configurazione:

    • Controlla dove si trova la tua variabile d’ambiente JAVA_HOME.
    • Controlla quale versione java usi per eseguire il programma. Nel controllo IntelliJ:
      • File -> Struttura progetto … -> Impostazioni progetto -> Progetto -> SDK progetto:
      • File -> Struttura del progetto … -> Impostazioni piattaforma -> SDK

    4. Copia l’intero keystore dalla nuova versione di Java

    Se sviluppi sotto il JDK diverso dall’ultimo disponibile, prova a sostituire il file %JAVA_HOME%/jre/lib/security/cacerts con quello nuovo dell’ultimo JRE installato (fai prima una copia di backup) come @ jeremy-goodell suggerisce nella sua risposta

    5. Aggiungi certificato (i) al tuo keystore

    Se null’altro risolve il tuo problema, usa keytool per salvare i certificati sul keystore di Java:

     keytool -trustcacerts -keystore "%JAVA_HOME%jre\lib\security\cacerts" -storepass changeit -importcert -alias  -file  

    Il file con il certificato può essere ottenuto dal browser come suggerisce @MagGGG nella sua risposta .

    Nota 1: potrebbe essere necessario ripetere questo per ogni certificato della catena al certificato del sito. Inizia da quello principale.

    Nota 2: dovrebbe essere univoco tra le chiavi nell’archivio o keytool mostrerà un errore.

    Per ottenere l’elenco di tutti i certificati nello store che è ansible eseguire:

     keytool -list -trustcacerts -keystore "%JAVA_HOME%jre\lib\security\cacerts" -storepass changeit 

    Nel caso qualcosa vada storto, questo ti aiuterà a rimuovere il certificato dallo store:

     keytool -delete -alias  -keystore "%JAVA_HOME%jre\lib\security\cacerts" -storepass changeit 
     -Dmaven.wagon.http.ssl.insecure=true -Dmaven.wagon.http.ssl.allowall=true 

    È usato per saltare la convalida del certificato.

    Numero di background:

    Stavo seguendo l’errore quando provavo a eseguire mvn clean install nel mio progetto e tramite l’opzione Netbeans IDE clean e build. Questo problema è dovuto al fatto che il certificato non è disponibile quando eseguiamo il download tramite IDE di fagioli NET / tramite prompt dei comandi, ma è in grado di scaricare i file tramite il browser.

    Errore :

     Caused by: org.eclipse.aether.transfer.ArtifactTransferException: Could not transfer artifact com.java.project:product:jar:1.0.32 from/to repo-local (https://url/local-repo): sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 

    Risoluzione:

    1. Scarica il certificato dell’URL in questione:

    • Avvia IE da “run as adminstrator” (altrimenti non potremo scaricare il certificato)
    • Inserisci l’URL in IE-> https: // url / local-repo (nel mio caso questo url aveva un certificato non attendibile inserisci la descrizione dell'immagine qui .)
    • Scarica il certificato facendo clic su Errore certificato -> visualizza certificato
    • Seleziona la scheda Dettagli -> copia su file -> successivo -> seleziona “DER codificato binario X.509 (.CER)
    • salva il certificato in qualche posizione, esempio: c: /user/sheldon/desktop/product.cer
    • Congratulazioni! hai scaricato con successo il certificato per il sito

    2. Ora installa l’archivio chiavi per risolvere il problema.

    • Eseguire il comando keytool per aggiungere il keystore scaricato nel file del certificato esistente.
    • Comando: sotto il comando nella cartella bin di jdk (JAVA_HOME) .

    C: \ Programmi \ Java \ jdk1.8.0_141 \ jre \ bin> keytool -importcert -file “C: /user/sheldon/desktop/product.cer” -alias product -keystore “C: / Programmi / Java / jdk1.8.0_141 / jre / lib / security / cacerts”.

    • Ti verrà richiesto di inserire la password. Inserisci la password del keystore: inserisci nuovamente “changeit” per “Trust this certificate? [No]:”, inserisci “yes”

    Esempio di comandi da riga di comando / output:

     keytool -importcert -file "C:/Users/sheldon/Desktop/product.cer" -alias product -keystore "C:/Program iles/Java/jdk1.8.0_141/jre/lib/security/cacerts" Enter keystore password: Trust this certificate? [no]: yes Certificate was added to keystore 
    • Contgrats! ora dovresti aver eliminato l’errore “PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException” nell’IDE di Netbeans.

    Ho trovato questa domanda mentre cercavo di installare il plugin Cucumber-Eclipse in Eclipse tramite il loro sito di aggiornamento. Ho ricevuto lo stesso errore SunCertPathBuilderException:

     Unable to read repository at http://cucumber.io/cucumber-eclipse/update-site/content.xml. Unable to read repository at http://cucumber.io/cucumber-eclipse/update-site/content.xml. sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 

    Mentre alcune delle altre risposte sono appropriate e utili per la situazione data da questa domanda, sono state comunque inutili e fuorvianti per il mio problema.

    Nel mio caso, il problema era che l’URL fornito per il loro sito di aggiornamento è:

    https://cucumber.io/cucumber-eclipse/update-site

    Tuttavia, navigando su di esso tramite un browser, viene reindirizzato a (notare il ” .github ” aggiunto):

    http://cucumber.github.io/cucumber-eclipse/update-site/

    Quindi la risoluzione è semplicemente utilizzare la versione reindirizzata dell’URL del sito di aggiornamento quando si aggiunge il sito di aggiornamento in eclipse.

    L’aggiunta di cacerts non ha funzionato per me. Dopo aver abilitato il log con flag -Djavax.net.debug=all , è venuto a sapere la lettura di java da jssecacerts .

    L’importazione in jssecacerts funzionato alla fine.

    Questa non è una risposta specifica di Twitter, ma questa è la domanda che si presenta quando si cerca questo errore. Se il sistema riceve questo errore durante la connessione a un sito Web che sembra avere un certificato valido quando visualizzato in un browser Web , ciò significa probabilmente che il sito Web ha una catena di certificati incompleta .

    Per un breve riepilogo del problema: le autorità di certificazione non utilizzano il proprio certificato di origine per firmare solo i vecchi certificati. Invece (di solito) firmano i certificati intermedi che hanno anche il flag di autorità di certificazione impostato (cioè, sono autorizzati a firmare i certificati). Quindi, quando acquisti un certificato da una CA, firmano il tuo CSR con uno di questi certificati intermedi.

    Il tuo trust store Java probabilmente ha solo il CERT root, non quelli intermedi.

    Un sito mal configurato potrebbe restituire solo il certificato firmato. Problema: è stato firmato con un certificato intermedio che non è nel tuo negozio di fiducia. I browser gestiranno questo problema scaricando o utilizzando un certificato intermedio memorizzato nella cache; questo massimizza la compatibilità del sito web. Java e strumenti come OpenSSL, tuttavia, non lo faranno. E ciò causerà l’errore nella domanda.

    Puoi verificare questo sospetto utilizzando il test Qualys SSL . Se lo fai contro un sito e lo dice

    La catena di certificati di questo server è incompleta.

    allora questo lo conferma. Puoi anche vederlo osservando i percorsi di certificazione e visualizzando il testo Extra Download .

    Come risolverlo: l’amministratore del server deve configurare il server Web per restituire anche i certificati intermedi. Per Comodo, ad esempio, è qui che il file .ca-bundle è utile. Ad esempio, in una configurazione di Apache con mod_ssl, si utilizzerà l’impostazione di configurazione SSLCertificateChainFile . Per nginx, è necessario concatenare i certificati intermedi e il certificato firmato e utilizzarlo nella configurazione del certificato SSL. Puoi trovare di più ricercando la “catena di certificati incompleta” online.

    Qui normalmente questo tipo di eccezione si verifica quando c’è una mancata corrispondenza nel PERCORSO del certificato attendibile. Controllare la configurazione o il percorso in cui è richiesto questo certificato server per le comunicazioni protette.

    Ho lo stesso problema su Ubuntu 15.10. Prova a scaricare il plug-in localmente, ad es. https://github.com/lmenezes/elasticsearch-kopf/archive/master.zip e installa con questo comando:

     sudo /usr/share/elasticsearch/bin/plugin install file:/home/dev/Downloads/elasticsearch-kopf-master.zip 

    Percorso forse diverso a seconda del tuo ambiente.

    Saluti.

    Per me è saltato fuori un errore di certificato perché avevo il violinista in esecuzione in background e che non funzionava con il certificato. Agisce come un proxy così vicino che riavvia Eclipse.

    Stavo affrontando lo stesso problema e ottenerlo risolto utilizzando i seguenti semplici passaggi:

    1) Scarica InstallCert.java da google

    2) Compilalo usando javac InstallCert.java

    3) Esegui InstallCert.java utilizzando java InstallCert.java , con il nome host e la porta https, e premi “1” quando chiedi l’input. Aggiungerà il “localhost” come un keystore affidabile e genererà un file chiamato “jssecacerts” come di seguito:

    java InstallCert localhost: 443

    4) copia jssecacerts nella cartella $ JAVA_HOME / jre / lib / security

    La fonte principale per risolvere il problema qui è:

    https://ankurjain26.blogspot.in/2017/11/javaxnetsslsslhandshakeexception.html

    Saluti,

    Ankur

    È aggiunta alla risposta https://stackoverflow.com/a/36427118/1491414 . Grazie a @MagGGG

    • Assicurati di avere l’authorization dell’amministratore
    • Utilizzare le virgolette doppie per il percorso del keystore (-keystore C: \ Programmi (x86) \ Java \ jre1.6.0_22 \ lib \ security \ cacerts “) perché nel sistema operativo Windows il percorso di installazione predefinito sarà Program Files e si otterrà un errore a causa dello spazio tra i file di programma.

    Ho risolto questo problema utilizzando il metodo seguente-

    1. Copia l’URL che sta avendo problemi di connessione
    2. Vai su Android Studio-> Impostazioni-> Impostazioni Http
    3. In “Verifica connessione”, incolla l’url e premi ok
    4. Su Ok, Android Studio chiederà di importare il certificato di quell’URL, importarlo
    5. Questo è tutto. Nient’altro da fare e il mio problema era sparito. Non è necessario riavviare lo studio.

    When you have above error with atlassian software ex. jira

     2018-08-18 11:35:00,312 Caesium-1-4 WARN anonymous Default Mail Handler [camail.incoming.mailfetcherservice] Default Mail Handler[10001]: javax.mail.MessagingException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target while connecting to host 'imap.xyz.pl' as user '[email protected]' via protocol 'imaps, 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 

    you can add certs to it’s trusted keystore (change missing_ca to proper cert name):

     keytool -importcert -file missing_ca.crt -alias missing_ca -keystore /opt/atlassian/jira/jre/lib/security/cacerts 

    If asked for password put changeit and confirm y

    After that simply restart jira.

    goals:

    1. use https connections
    2. verify SSL chains
    3. do not deal with cacerts
    4. add certificate in runtime
    5. do not lose certificates from cacerts

    Come farlo:

    1. define own keystore
    2. put certificate into keystore
    3. redefine SSL default context with our custom class
    4. ???
    5. profit

    My Keystore wrapper file:

     public class CertificateManager { private final static Logger logger = Logger.getLogger(CertificateManager.class); private String keyStoreLocation; private String keyStorePassword; private X509TrustManager myTrustManager; private static KeyStore myTrustStore; public CertificateManager(String keyStoreLocation, String keyStorePassword) throws Exception { this.keyStoreLocation = keyStoreLocation; this.keyStorePassword = keyStorePassword; myTrustStore = createKeyStore(keyStoreLocation, keyStorePassword); } public void addCustomCertificate(String certFileName, String certificateAlias) throws Exception { TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); tmf.init((KeyStore) null); Certificate certificate = myTrustStore.getCertificate(certificateAlias); if (certificate == null) { logger.info("Certificate not exists"); addCertificate(certFileName, certificateAlias); } else { logger.info("Certificate exists"); } tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); tmf.init(myTrustStore); for (TrustManager tm : tmf.getTrustManagers()) { if (tm instanceof X509TrustManager) { setMytrustManager((X509TrustManager) tm); logger.info("Trust manager found"); break; } } } private InputStream fullStream(String fname) throws IOException { ClassLoader classLoader = getClass().getClassLoader(); InputStream resource = classLoader.getResourceAsStream(fname); try { if (resource != null) { DataInputStream dis = new DataInputStream(resource); byte[] bytes = new byte[dis.available()]; dis.readFully(bytes); return new ByteArrayInputStream(bytes); } else { logger.info("resource not found"); } } catch (Exception e) { logger.error("exception in certificate fetching as resource", e); } return null; } public static KeyStore createKeyStore(String keystore, String pass) throws Exception { try { InputStream in = CertificateManager.class.getClass().getResourceAsStream(keystore); KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType()); keyStore.load(in, pass.toCharArray()); logger.info("Keystore was created from resource file"); return keyStore; } catch (Exception e) { logger.info("Fail to create keystore from resource file"); } File file = new File(keystore); KeyStore keyStore = KeyStore.getInstance("JKS"); if (file.exists()) { keyStore.load(new FileInputStream(file), pass.toCharArray()); logger.info("Default keystore loaded"); } else { keyStore.load(null, null); keyStore.store(new FileOutputStream(file), pass.toCharArray()); logger.info("New keystore created"); } return keyStore; } private void addCertificate(String certFileName, String certificateAlias) throws CertificateException, IOException, KeyStoreException, NoSuchAlgorithmException { CertificateFactory cf = CertificateFactory.getInstance("X.509"); InputStream certStream = fullStream(certFileName); Certificate certs = cf.generateCertificate(certStream); myTrustStore.setCertificateEntry(certificateAlias, certs); FileOutputStream out = new FileOutputStream(getKeyStoreLocation()); myTrustStore.store(out, getKeyStorePassword().toCharArray()); out.close(); logger.info("Certificate pushed"); } public String getKeyStoreLocation() { return keyStoreLocation; } public String getKeyStorePassword() { return keyStorePassword; } public X509TrustManager getMytrustManager() { return myTrustManager; } public void setMytrustManager(X509TrustManager myTrustManager) { this.myTrustManager = myTrustManager; } } 

    This class will create keystore if necessary, and will be able to manage certificates inside of it. Now class for SSL context:

     public class CustomTrustManager implements X509TrustManager { private final static Logger logger = Logger.getLogger(CertificateManager.class); private static SSLSocketFactory socketFactory; private static CustomTrustManager instance = new CustomTrustManager(); private static List register = new ArrayList<>(); public static CustomTrustManager getInstance() { return instance; } private X509TrustManager defaultTm; public void register(CertificateManager certificateManager) { for(CertificateManager manager : register) { if(manager == certificateManager) { logger.info("Certificate manager already registered"); return; } } register.add(certificateManager); logger.info("New Certificate manager registered"); } private CustomTrustManager() { try { String algorithm = TrustManagerFactory.getDefaultAlgorithm(); TrustManagerFactory tmf = TrustManagerFactory.getInstance(algorithm); tmf.init((KeyStore) null); boolean found = false; for (TrustManager tm : tmf.getTrustManagers()) { if (tm instanceof X509TrustManager) { defaultTm = (X509TrustManager) tm; found = true; break; } } if(found) { logger.info("Default trust manager found"); } else { logger.warn("Default trust manager was not found"); } SSLContext sslContext = SSLContext.getInstance("TLS"); sslContext.init(null, new TrustManager[]{this}, null); SSLContext.setDefault(sslContext); socketFactory = sslContext.getSocketFactory(); HttpsURLConnection.setDefaultSSLSocketFactory(socketFactory); logger.info("Custom trust manager was set"); } catch (NoSuchAlgorithmException | KeyManagementException | KeyStoreException e) { logger.warn("Custom trust manager can't be set"); e.printStackTrace(); } } @Override public X509Certificate[] getAcceptedIssuers() { List out = new ArrayList<>(); if (defaultTm != null) { out.addAll(Arrays.asList(defaultTm.getAcceptedIssuers())); } int defaultCount = out.size(); logger.info("Default trust manager contain " + defaultCount + " certficates"); for(CertificateManager manager : register) { X509TrustManager customTrustManager = manager.getMytrustManager(); X509Certificate[] issuers = customTrustManager.getAcceptedIssuers(); out.addAll(Arrays.asList(issuers)); } logger.info("Custom trust managers contain " + (out.size() - defaultCount) + " certficates"); X509Certificate[] arrayOut = new X509Certificate[out.size()]; return out.toArray(arrayOut); } @Override public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { for(CertificateManager certificateManager : register) { X509TrustManager customTrustManager = certificateManager.getMytrustManager(); try { customTrustManager.checkServerTrusted(chain, authType); logger.info("Certificate chain (server) was aproved by custom trust manager"); return; } catch (Exception e) { } } if (defaultTm != null) { defaultTm.checkServerTrusted(chain, authType); logger.info("Certificate chain (server) was aproved by default trust manager"); } else { logger.info("Certificate chain (server) was rejected"); throw new CertificateException("Can't check server trusted certificate."); } } @Override public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { try { if (defaultTm != null) { defaultTm.checkClientTrusted(chain, authType); logger.info("Certificate chain (client) was aproved by default trust manager"); } else { throw new NullPointerException(); } } catch (Exception e) { for(CertificateManager certificateManager : register) { X509TrustManager customTrustManager = certificateManager.getMytrustManager(); try { customTrustManager.checkClientTrusted(chain, authType); logger.info("Certificate chain (client) was aproved by custom trust manager"); return; } catch (Exception e1) { } } logger.info("Certificate chain (client) was rejected"); throw new CertificateException("Can't check client trusted certificate."); } } public SSLSocketFactory getSocketFactory() { return socketFactory; } } 

    This class made as singleton, because only one defaultSSL context allowed. So, now usage:

      CertificateManager certificateManager = new CertificateManager("C:\\myapplication\\mykeystore.jks", "changeit"); String certificatePath = "C:\\myapplication\\public_key_for_your_ssl_service.crt"; try { certificateManager.addCustomCertificate(certificatePath, "alias_for_public_key_for_your_ssl_service"); } catch (Exception e) { log.error("Can't add custom certificate"); e.printStackTrace(); } CustomTrustManager.getInstance().register(certificateManager); 

    Possibly, it will not work with this settings, because I keep certificate file inside of resource folder, so my path is not absolute. But generally, it work perfectly.