"Creazione percorso PKIX non riuscita" e "impossibile trovare un percorso di certificazione valido per la destinazione richiesta"


423

Sto cercando di ottenere tweet usando la libreria twitter4j per il mio progetto java. Alla mia prima esecuzione ho ricevuto un errore relativo al certificato sun.security.validator.ValidatorExceptione sun.security.provider.certpath.SunCertPathBuilderException. Quindi ho aggiunto il certificato 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 i tweet:

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

6
Ciao, controlla sotto l'URL. Sono sicuro che questi ti aiuteranno. java-samples.com/showtutorial.php?tutorialid=210 confluence.atlassian.com/display/JIRAKB/… . Devi aggiungere il tuo certificato ssl al certificato truststore java (Percorso: jre / lib / security / cacerts).
sus007,

Si prega di fare riferimento a questa risposta per la soluzione e confermare che si sta confezionando il software come jre in bundle? in caso affermativo, copia il tuo sistema di file cacerts e sostituisci il file jre cacerts in pacchetto.
positivecrux,

prova questo stackoverflow.com/a/9210661/4741746 potrebbe essere questa la tua risposta
sushant gosavi

2
Ho appena usato questo codice java e per https non dimenticare di specificare la porta come 443. Codice Java su github.com/escline/InstallCert/blob/master/InstallCert.java Prenderà il tuo file CACERTS e aggiungerà tutti quei vantaggi il certificato corrente per l'URL fornito come input. Nel mio caso ho codificato i valori per host = "mywebservice.uat.xyz.com"; port = 443; passphrase = "changeit" .toCharArray (); Quindi il programma crea un nuovo file chiamato "jssecacerts" che avrà tutto. Rinominalo in "cacerts" e usalo. Sarai pronto.
Reddymails,

Risposte:


574
  1. Vai all'URL nel tuo browser:
    • firefox: fare clic sulla catena di certificati HTTPS (l'icona del lucchetto proprio accanto all'indirizzo URL). Fare clic "more info" > "security" > "show certificate" > "details" > "export..". Prendi il nome e scegli il tipo di file example.cer
    • chrome - fai clic sull'icona del sito a sinistra per indirizzarlo nella barra degli indirizzi, seleziona "Certificato" -> "Dettagli" -> "Esporta" e salva nel formato "Binario decodificato, certificato singolo".
  2. Ora hai un file con keystore e devi aggiungerlo alla tua JVM. Determina la posizione dei file cacerts, ad es. C:\Program Files (x86)\Java\jre1.6.0_22\lib\security\cacerts.

  3. Quindi importare il example.cerfile 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 di default changeit

Riavvia il tuo JVM / PC.

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


27
Ho dovuto mettere il percorso tra virgolette e anche salvarlo come Base64 anziché DER
Theodore K.

3
caspita, ha funzionato come per magia in Chrome, basta fare clic sull'icona a forma di lucchetto sulla barra degli indirizzi a sinistra, quindi fare clic sui dettagli e non è necessario riavviare
aswzen

8
Si noti che le istruzioni devono essere ripetute per tutti i certificati della catena. Anche il aliasnome del certificato nella riga di comando dovrebbe essere univoco.
Lu55,

5
Se la tua casa è un JDK, assicurati di specificare che jre si trova in questo: keytool -import -alias example -keystore "C: \ Programmi \ Java \ jdk1.8.0_73 \ jre \ lib \ security \ cacerts" -file example.cer
Jack BeNimble

12
Per chiunque riceva un errore "Accesso negato", assicurati di eseguire il prompt dei comandi come amministratore.
Walker Christie,

81

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

Nota che in realtà ho copiato un file cacerts di Windows su un'installazione Linux e ha funzionato bene.

Il file si trova nelle jre/lib/security/cacertsinstallazioni jdk Java vecchie e nuove.

Spero che questo salvi qualcun altro ore di aggravamento.


4
Sto provando ad accedere a un server SSL con un certificato autofirmato, ho provato ad aggiungere il certificato usando keytool, ma senza fortuna, qualche suggerimento?
Oleg Belousov

1
Sono contento che abbia funzionato .. Ma sai qual è stata la causa principale. cosa l'ha fatto fallire con java 6 certs .. e in che modo java 7 certs ha risolto il problema
Vishwanath gowda k

Lo ha fatto, anche se sono passato da icedtea 1.6 a Oracle 1.7. :)
nperson325681

Considera anche questa soluzione: stackoverflow.com/questions/33439905/...
Piohen

10
Per chi, come me, a volte manca l'ovvio - assicurarsi che si sta andando in $JAVA_HOME/jre/lib, non $JAVA_HOME/lib- ho trascorso un po 'di tempo manca quel dettaglio.
Ryan Heathcote,

35

IL MIO approccio UI:

  1. Scarica keystore explorer da qui
  2. Apri $ JAVA_HOME / jre / lib / security / cacerts
  3. inserisci PW: changeit (può essere cambiato 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(può essere cambiato su Mac)

1
Su mac, con CMD-Line, utilizzare sudo per eseguire il comando. # sudo keytool -importcert -file jetty.crt -alias jetty -keystore $ JAVA_HOME / jre / lib / security / cacerts
malajisi

1
Su Windows, il comando che funziona:keytool -importcert -file dinardap_cert.cer –alias dinardap –keystore “%JAVA_HOME%/jre/lib/security/cacerts”
Patricio Bonilla il

da dove ottenere il file cert? Non so dire a quale URL andare. jetty.com ?
kraftydevil,

Ottengo il mio certificato esportandolo dal browser web, azione contestuale sul lucchetto
rtbf

28

Mi sono imbattuto in questo problema che ha richiesto molte ore di ricerca per essere risolto, specialmente con i certificati generati automaticamente, che a differenza di quelli ufficiali, sono piuttosto complicati e a Java non piacciono così tanto.

Controllare il seguente collegamento: Risolvi problema con i certificati in Java

Fondamentalmente devi aggiungere il certificato dal server ai certificati Java Home.

  1. Generare o ottenere il certificato e configurare Tomcat per utilizzarlo in Servers.xml
  2. Scarica il codice sorgente Java della classe InstallCerted eseguilo 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 connetterà al server e Java genererà un'eccezione, analizzerà il certificato fornito dal server e ti consentirà di creare un jssecertsfile all'interno della directory in cui hai eseguito il Programma (Se eseguito da Eclipse, assicurati di configurare il Lavoro directory in Run -> Configurations).
  4. Copia manualmente quel 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 (Sun) Oracle, l'unica pagina che ho trovato era sul link fornito, quindi lo allego 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);
        }
    }
}

2
Nota che il file creato è jssecacerts!
DeanDP,

Ho provato a utilizzare questa soluzione per Java 7 e 8. Durante l'esecuzione su Java 7, ho ottenuto protocol_version o handshake_failure per tutti gli URL di repository remoti con cui ho provato. SandeepanNath:test sandeepan.nath$ java InstallCert repo1.maven.org:443 Loading KeyStore /Library/Java/JavaVirtualMachines/jdk1.7.0_80.jdk/Contents/Home/jre/lib/security/cacerts... Opening connection to repo1.maven.org:443 ... Starting SSL handshake... javax.net.ssl.SSLException: Received fatal alert: protocol_version .. Could not obtain server certificate chain
Sandeepan Nath l'

20

1. Controllare il certificato

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

2. Installa le ultime versioni di JRE e JDK

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

Inoltre, se possibile, disinstallare le versioni precedenti. Ciò renderà espliciti errori di configurazione errata.

3. Controlla la tua configurazione:

  • Controlla dove punta la tua variabile di ambiente JAVA_HOME.
  • Controlla quale versione java usi per eseguire il programma. In IntelliJ controlla:
    • 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 JDK diverso dall'ultimo disponibile, prova a sostituire il %JAVA_HOME%/jre/lib/security/cacertsfile con quello nuovo dall'ultimo JRE installato (crea prima una copia di backup) come suggerisce @ jeremy-goodell nella sua risposta

5. Aggiungi i certificati al tuo archivio chiavi

Se nulla sopra risolve il problema, utilizzare keytoolper salvare i certificati nel keystore di Java:

keytool -trustcacerts -keystore "%JAVA_HOME%jre\lib\security\cacerts" -storepass changeit -importcert -alias <alias_name> -file <path_to_crt_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 per il certificato del tuo sito. Inizia da quello principale.

Nota 2: <alias_name>dovrebbe essere univoco tra le chiavi del negozio o keytoolmostrerà un errore.

Per ottenere un elenco di tutti i certificati nel negozio è possibile eseguire:

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

Nel caso in cui qualcosa vada storto, questo ti aiuterà a rimuovere il certificato dal negozio:

keytool -delete -alias <alias_name> -keystore "%JAVA_HOME%jre\lib\security\cacerts" -storepass changeit

Con quanto ben elaborato, dovrebbe essere la risposta accettata.
Egor Hans,

13
-Dmaven.wagon.http.ssl.insecure=true -Dmaven.wagon.http.ssl.allowall=true

Viene utilizzato per saltare la convalida del certificato.

Avvertenza Utilizzare solo a scopo di sviluppo per questo non è sicuro!


4
Viene utilizzato per saltare la convalida del certificato
gorums

2
@gorums Come installarlo in Eclipse?
malajisi,

6
NON farlo a meno che non si desideri rischiare di eseguire codice dannoso arbitrario sul proprio computer. Sottovalutato in quanto rischia di compromettere qualsiasi macchina che lo esegue.
Bryan,

1
Solo perché "funziona" non significa che sia sicuro, stai mettendo a rischio chiunque segua questo consiglio. Ho il mio voto negativo
Paradoxis,

1
@AceKing Il punto è che non è un codice attendibile se non si convalida il certificato. Detto questo, penso che questa sia ancora una risposta utile. Le persone che lo fanno devono solo capire i rischi.
Michael Mior,

12

Ho avuto una situazione leggermente diversa, quando sul mio sistema erano presenti sia JDK che JRE 1.8.0_112.

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

keytool -import -trustcacerts -keystore cacerts -alias <new_ca_alias> -file <path_to_ca_cert_file>

Tuttavia, continuavo a ricevere lo stesso errore di creazione del percorso PKIX non riuscito .

Ho aggiunto le informazioni di debug all'interfaccia della riga di comando di Java, utilizzando java -Djavax.net.debug=all ... > debug.log. Nel file debug.log, la riga che inizia con trustStore è: in realtà puntava all'archivio cacerts in cui si trova [JRE_FOLDER]\lib\security\cacerts.

Nel mio caso la soluzione era quella di copiare il file cacerts usato da JDK (a cui erano state aggiunte le nuove CA) su quello usato da JRE e che risolveva il problema.


Ho importato direttamente i certs di cui avevo bisogno in JRE / lib / security / cacerts usando keytool, ma non ha cambiato nulla per me :( continuando a ricevere lo stesso errore, li ho anche aggiunti tramite l'IDE, o anche nel classpath e ho aggiunto un bean a specifica la posizione del keystore !! È pazzesco AF!
Alex

8

Sfondo del problema:

Stavo ottenendo il seguente errore quando provavo a eseguire mvn clean install nel mio progetto e tramite l'opzione clean and build di Netbeans IDE. Questo problema è dovuto al certificato non disponibile quando scarichiamo tramite IDE NET bean / tramite prompt dei comandi, ma siamo 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 "Esegui come amministratore" (altrimenti non saremo in grado di scaricare il certificato)
  • Inserisci l'URL in IE-> https: // url / local-repo (Nel mio caso questo url aveva un certificato non attendibile inserisci qui la descrizione dell'immagine.)
  • Scarica il certificato facendo clic su Errore certificato -> visualizza certificato
  • Seleziona la scheda Dettagli -> copia su file -> successiva -> seleziona "Binario codificato DER X.509 (.CER)
  • salvare il certificato in una posizione, ad esempio: c: /user/sheldon/desktop/product.cer
  • Congratulazioni! hai scaricato correttamente 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 di 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 di nuovo "changeit" per "Confida in questo certificato? [No]:", inserisci "yes"

Comandi / output di esempio della riga di comando:

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 avresti dovuto eliminare l'errore "Creazione percorso PKIX non riuscita: sun.security.provider.certpath.SunCertPathBuilderException" nell'IDE di Netbeans.

Ciao ho seguito tutti i passaggi ma senza fortuna :(
ManishNegi

hai qualche altro certificato nel percorso diverso da Cacerts? se ne hai altri, prova ad aggiungerlo a quel certificato
Barani

Grazie @Barani r, è stato un mio errore eseguire il comando da jre e usare JDK nella mia eclissi
ManishNegi

Non è stato possibile scaricare il certificato ma dopo, "Esegui come amministratore", ha funzionato bene.
Un altro programmatore

8

Volevo importare il certificato per smtp.gmail.com

L'unica soluzione che 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 righe tra "----- INIZIA CERTIFICATO -----" e "----- FINE CERTIFICATO -----" 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


Grazie amico! Mi ha salvato la giornata. Questa era l'unica soluzione appropriata nel mio caso.
Andrew Gans,

Mi ha salvato anche la giornata. Grazie.
Kris

6

Questa non è una risposta specifica per Twitter, ma questa è la domanda che si presenta quando si cerca questo errore. Se il tuo sistema riceve questo errore quando ti connetti a un sito Web che sembra avere un certificato valido quando viene visualizzato in un browser Web , ciò probabilmente significa 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 radice per firmare solo un vecchio certificato. Al contrario, firmano (di solito) certificati intermedi che hanno anche impostato il flag Autorità di certificazione (ovvero possono firmare certificati). Quindi, quando acquisti un certificato da un'autorità di certificazione, firmano il tuo CSR con uno di questi certificati intermedi.

Molto probabilmente il tuo truststore Java ha solo il Root Cert, non quelli intermedi.

Un sito non configurato correttamente potrebbe restituire solo il certificato certificato. 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 questo causerà l'errore nella domanda.

È possibile verificare questo sospetto utilizzando il test SSL Qualys . Se lo esegui su un sito e si dice

La catena di certificati di questo server è incompleta.

allora questo lo conferma. Puoi anche vedere questo guardando i percorsi di certificazione e vedendo 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 .ca-bundlefile è utile. Ad esempio, in una configurazione Apache con mod_ssl, useresti l' SSLCertificateChainFileimpostazione di configurazione. Per nginx, è necessario concatenare i certificati intermedi e il certificato firmato e utilizzarli nella configurazione del certificato SSL. Puoi trovare altro cercando "catena di certificati incompleta" online.


Tu sei brillante. Grazie! Ho avuto un problema con il nuovo buildout del mio server Java perché ho dimenticato di rimuovere il # davanti a SSLCertificateChainFile !!! Davvero ben spiegato.
KisnardOnline

6

Il motivo, sopra l'errore è che JDK è raggruppato con molti certificati dell'autorità di certificazione (CA) attendibili in un file chiamato "cacerts" ma questo file non ha idea del nostro certificato autofirmato. In altre parole, il file cacerts non ha il nostro certificato autofirmato importato e quindi non lo considera come un'entità attendibile e quindi fornisce l'errore sopra riportato.

Come correggere l'errore sopra

Per correggere l'errore sopra, tutto ciò che serve è importare il certificato autofirmato nel file cacerts.

Innanzitutto, individua il file cacerts. Dovremo scoprire la posizione di JDK. Se stai eseguendo la tua applicazione attraverso uno degli IDE come Eclipse o IntelliJ Idea vai alle impostazioni del progetto e scopri qual è la posizione di JDK. Ad esempio, su un Mac OS, la posizione tipica del file cacerts sarebbe in questa posizione / Library / Java / JavaVirtualMachines / {{JDK_version}} / Sommario / Home / jre / lib / security su una macchina di Windows sarebbe sotto {{Installation_directory} } / {{JDK_version}} / jre / lib / security

Una volta individuato il file cacerts, ora dobbiamo importare il nostro certificato autofirmato in questo file cacerts. Controlla l'ultimo articolo, se non sai come generare correttamente il certificato autofirmato.

Se non si dispone di un file di certificato (.crt) e di un file .jks, è possibile generare un file .crt utilizzando il comando seguente. Se hai già un file .crt / .pem, puoi ignorare il comando seguente

## Per generare il certificato dal keystore (file .jks) ####

keytool -export -keystore keystore.jks -alias selfsigned -file selfsigned.crt

Il passaggio precedente genererà un file chiamato selfsigned.crt.Oow Importa il certificato in cacerts

Ora aggiungi il certificato a JRE / lib / security / cacerts (trustore)
keytool -importcert -file selfsigned.crt -alias selfsigned -keystore {{cacerts path}}

per es

keytool -importcert -file selfsigned.nextgen.crt -alias selfsigned.nextgen -keystore /Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/Contents/Home/jre/lib/security/cacerts

Questo è tutto, riavvia l'applicazione e dovrebbe funzionare correttamente. Se continua a non funzionare e ottieni un'eccezione di handshake SSL. Probabilmente significa che stai utilizzando un dominio diverso, quindi registrato nel certificato.

Il link con spiegazione dettagliata e risoluzione dettagliata è qui.


4

L'aggiunta cacertsnon ha funzionato per me. Dopo aver abilitato il registro con flag -Djavax.net.debug=all, ho imparato a leggere Java jssecacerts.

Importazione jssecacertsfinalmente funzionata.


2
La spiegazione mancante qui è che Java utilizzerà jssecacertsse presente, altrimenti cacerts.
Marchese di Lorne,

3

Questa è una soluzione ma nella mia storia con questo problema:

Ero quasi morto provando tutta la soluzione di cui sopra (per 3 giorni) e niente ha funzionato per me.

Ho perso ogni speranza.

Ho contattato il mio team di sicurezza per questo perché ero dietro un proxy e mi hanno detto che avevano recentemente aggiornato la loro politica di sicurezza.

Li ho rimproverati male per non aver informato gli sviluppatori.

Successivamente hanno rilasciato un nuovo file "cacerts" che contiene tutti i certificati.

Ho rimosso il file cacerts presente in% JAVA_HOME% / jre / lib / security e ha risolto il mio problema.

Quindi, se stai affrontando questo problema, potrebbe essere anche il tuo team di rete in questo modo.


2

Mi sono imbattuto in questa domanda durante il tentativo di installare il plug-in Cucumber-Eclipse in Eclipse tramite il 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 tuttavia 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, durante la navigazione tramite un browser, viene reindirizzato a (notare il " .github " aggiunto ):

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

Pertanto, la risoluzione consiste semplicemente nell'utilizzare la versione reindirizzata dell'URL del sito di aggiornamento quando si aggiunge il sito di aggiornamento in Eclipse.


3
Sei sicuro di rispondere alla domanda giusta? Non c'è menzione del cetriolo nella domanda originale ...
Done Data Solutions,

Sento di esserlo. Ho ricevuto lo stesso errore SunCertPathBuilderException e durante la ricerca di una soluzione ho trovato questa domanda e questa . Tuttavia, nessuno dei due aveva la soluzione adeguata alla mia situazione. Non stavo cercando di rispondere alla domanda specifica su come aggiungere il sito del plugin Cucumber-Eclipse a eclipse. Volevo fornire un contesto per il problema riscontrato (reindirizzamento URL) e spiegare come è stato risolto.
royfripple,

Ho aggiornato la mia risposta per chiarire che ho ricevuto lo stesso errore, rilevando che il problema e la soluzione sottostanti erano diversi. Ritengo che ciò sia valido poiché altri potrebbero trovare questa domanda quando cercano lo stesso errore. Ti preghiamo di considerare di cambiare il tuo voto se ritieni che abbia senso.
royfripple,

Grazie. Rende le cose molto più chiare, ha invertito il mio downvote
Done Data Solutions

Prego! E grazie per il tempo dedicato a rivederlo di nuovo.
royfripple,

2

Stavo affrontando lo stesso problema e l'ho risolto usando i semplici passaggi seguenti:

1) Scarica InstallCert.java da google

2) Compilalo usando javac InstallCert.java

3) Eseguire InstallCert.java utilizzando java InstallCert.java , con il nome host e la porta https, e premere "1" quando si richiede l'input. Aggiungerà "localhost" come archivio di chiavi attendibile e genererà un file denominato "jssecacerts" come di seguito:

java InstallCert localhost: 443

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

La fonte principale per risolvere il problema qui è:

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


1

Ho risolto questo problema su Windows Server 2016 con Java 8, importando cert dall'archivio pkcs12al cacertskeystore.

Percorso per pkcs12 store:
C:\Apps\pkcs12.pfx

Percorso per Java cacerts:
C:\Program Files\Java\jre1.8.0_151\lib\security\cacerts

Percorso per keytool:
C:\Program Files\Java\jre1.8.0_151\bin

Dopo aver posseduto una cartella con keytool nel prompt dei comandi (come amministratore), il comando per importare cert da pkcs12a cacertsè il seguente:
keytool -v -importkeystore -srckeystore C:\Apps\pkcs12.pfx -srcstoretype PKCS12 -destkeystore "C:\Program Files\Java\jre1.8.0_151\lib\security\cacerts" -deststoretype JKS

Verrà richiesto di:
1. inserire la password del keystore di destinazione (cacerts pasword, il valore predefinito è "changeit")
2. inserire la password del keystore di origine (password pkcs12)


Per rendere effettive le modifiche, riavviare la macchina server (o semplicemente riavviare JVM).


1
Ho usato questo approccio su un Mac e ha funzionato. Il mio Cert era ovviamente autofirmato e generato per importare il file .pfx che avevo generato sul mio server adfs di Windows. Utilizzo di Java 10 per la mia app Grazie
Shashikant Soni,

0

Qui normalmente questo tipo di eccezione si verifica in caso di mancata corrispondenza nel PERCORSO del certificato attendibile. Controllare la configurazione o il percorso in cui questo certificato del server è richiesto per la comunicazione protetta.


Potete per favore dirmi la configurazione esatta in cui posso installare il certificato. In realtà sto riscontrando un problema al riguardo, ho installato il certificato relativo a questo problema usando keytool , funziona per circa 20-30 minuti e quindi il server ha emesso di nuovo lo stesso errore. Mi aiuti per favore. Sono stato bloccato in questo numero per 2 giorni.
Deepak Gangore,

Penso che il certificato cambi ogni 20-30 minuti
Vishwanath gowda k

Sto affrontando un problema simile ma per il problema è: MY java seleziona la posizione predefinita per $ JAVA_HOME / lib / security / cacerts di applicazioni Java anche se ho fornito -Djavax.net.ssl.trustStore = / myapp / app.jks Qualcuno può aiutarmi su questo: stackoverflow.com/questions/33821785/…
Laxman G

0

Per me, l'errore del certificato è emerso perché avevo un violinista in esecuzione in background e questo si incasina con il certificato. Funziona come un proxy così vicino che e riavvia l'eclissi.


la stessa prob sta accadendo in eclissi, anche dopo aver chiuso tutte le applicazioni
arvindwill il

0

obiettivi:

  1. usa connessioni https
  2. verifica catene SSL
  3. non trattare con i dolci
  4. aggiungi certificato in fase di esecuzione
  5. non perdere i certificati dei dessert

Come farlo:

  1. definire il proprio keystore
  2. mettere il certificato nel keystore
  3. ridefinire il contesto predefinito SSL con la nostra classe personalizzata
  4. ???
  5. profitto

Il mio file wrapper Keystore:

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;
    }
}

Questa classe creerà il keystore, se necessario, e sarà in grado di gestire i certificati al suo interno. Ora classe per contesto SSL:

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<CertificateManager> 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<X509Certificate> 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;
    }
}

Questa classe è stata creata come singleton, poiché è consentito solo un contesto DefaultSSL. Quindi, ora utilizzo:

            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);

Probabilmente, non funzionerà con queste impostazioni, perché mantengo il file del certificato all'interno della cartella delle risorse, quindi il mio percorso non è assoluto. Ma generalmente funziona perfettamente.


1
Questo doppio uso improprio available()è espressamente messo in guardia dal proprio Javadoc.
Marchese di Lorne,

0

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

  • Assicurati di avere il permesso di 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à File di programma e si otterrà un errore a causa dello spazio tra i file di programma.

0

Ho risolto questo problema usando il metodo seguente

  1. Copia l'URL che sta riscontrando un problema di connessione
  2. Vai su Android Studio-> Impostazioni-> Impostazioni HTTP
  3. In "Test 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 anche studio.

0

Quando hai sopra l'errore con il software atlassian ex. jira

2018-08-18 11:35:00,312 Caesium-1-4 WARN anonymous    Default Mail Handler [c.a.mail.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 'jira@xyz.pl' 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

puoi aggiungere certs al suo keystore di fiducia (cambia missing_ca con il nome del certificato corretto):

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

Se viene richiesta la password, inserire changeite confermarey

Dopodiché semplicemente riavvia jira.


0

Se l'URL del repository funziona anche su HTTP e la sicurezza non è un problema, puoi andare su settings.xml (spesso, ma non sempre, situato in %USERPROFILE%/.m2) e sostituire HTTPS con HTTP per <repository>e <pluginRepository>URL.

Ad esempio, questo:

<repository>
    <snapshots>
        <enabled>false</enabled>
    </snapshots>
    <id>central</id>
    <name>libs-release</name>
    <url>https://<artifactory>/libs-release</url>
</repository>

dovrebbe essere sostituito da questo:

<repository>
    <snapshots>
        <enabled>false</enabled>
    </snapshots>
    <id>central</id>
    <name>libs-release</name>
    <url>https://<artifactory>/libs-release</url>
</repository>

0

Stavo usando il mio negozio di fiducia piuttosto che JRE uno passando arg -Djavax.net.ssl.trustStore=

Stavo ricevendo questo errore indipendentemente da certs nel truststore. Il problema per me era l'ordinamento delle proprietà passate su arg line. Quando ho messo -Djavax.net.ssl.trustStore=& -Djavax.net.ssl.trustStorePassword= before -Dspring.config.location= & -jarargs sono stato in grado di invocare con successo la mia chiamata di riposo su https.


0

Se stai usando CloudFoundry e riscontri un problema con il certificato, dovresti assicurarti di spingere di nuovo il vaso con il servizio keystore con il certificato in esso. Semplicemente separare, associare e riavviare non funzionerà.


0

Nel caso in cui l' host si trovi dietro firewall / proxy , utilizzare il comando seguente in cmd:

keytool -J-Dhttps.proxyHost=<proxy_hostname> -J-Dhttps.proxyPort=<proxy_port> -printcert -rfc -sslserver <remote_host_name:remote_ssl_port>

Sostituisci <proxy_hostname>e <proxy_port>con il server proxy HTTP configurato. Sostituire <remote_host_name:remote_ssl_port>con uno degli host remoti (sostanzialmente url) e la porta che presenta il problema di certificazione.

Prendi l'ultimo contenuto del certificato stampato e copialo (copia anche il certificato di inizio e fine). Incollalo in un file di testo e dagli l' estensione .crt . Ora importa questo certificato in cacerts usando il comando java keytool e dovrebbe funzionare.

keytool -importcert -file <filename>.crt -alias randomaliasname -keystore %JAVA_HOME%/jre/lib/security/cacerts -storepass changeit

0

Prova a copiare i java cacerts:

cp /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.172-9.b11.fc28.x86_64/jre/lib/security/cacerts $JAVA_HOME/jre/lib/security/cacerts


0

Se si riscontra questo problema in un contenitore Linux quando l'applicazione Java sta tentando di comunicare con un'altra applicazione / sito, è perché il certificato è stato importato in modo errato nel bilanciamento del carico. Esiste una sequenza di passaggi da seguire per l'importazione dei certificati e, se non eseguita correttamente, vedrai problemi simili

Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid 
certification path to requested target

Una volta importati correttamente, i certificati devono essere eseguiti. Non c'è bisogno di armeggiare con nessun certificato JDK.


0

Ho risolto per IntelliJ IDEA ho di fronte a questo problema Althouh, posso cambiare un sacco di volte a risolvere le problem.I trovato una soluzione per me .right clic con il progetto, si vedrà Maven , dopo che la stampa generare fonti e aggiornamento cartelle e reimportare inserisci qui la descrizione dell'immagine

È fatta.


0

Stavo affrontando lo stesso problema, stavo usando 8.1.0-3, ma in seguito ho usato 9.2.1-0 e il problema è stato risolto senza passaggi manuali. Il certificato autofirmato ha funzionato bene.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.