web-dev-qa-db-fra.com

"Echec de la création du chemin PKIX" et "Impossible de trouver le chemin de certification valide vers la cible demandée"

J'essaie d'obtenir des tweets en utilisant Twitter4j library pour mon projet Java. Lors de ma première exécution, j'ai eu une erreur concernant le certificat Sun.security.validator.ValidatorException et Sun.security.provider.certpath.SunCertPathBuilderException. Puis j'ai ajouté un certificat Twitter par:

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"

Mais sans succès. Voici la procédure pour obtenir des twitters:

public static void main(String[] args) throws TwitterException {
    ConfigurationBuilder cb = new ConfigurationBuilder();
    cb.setDebugEnabled(true)
        .setOAuthConsumerKey("myConsumerKey")
        .setOAuthConsumerSecret("myConsumerSecret")
        .setOAuthAccessToken("myAccessToken")
        .setOAuthAccessTokenSecret("myAccessTokenSecret");

    TwitterFactory tf = new TwitterFactory(cb.build());
    Twitter twitter = tf.getInstance();

    try {
        Query query = new Query("iphone");
        QueryResult result;
        result = Twitter.search(query);
        System.out.println("Total amount of tweets: " + result.getTweets().size());
        List<Status> tweets = result.getTweets();

        for (Status Tweet : tweets) {
            System.out.println("@" + Tweet.getUser().getScreenName() + " : " + Tweet.getText());
        }
    } catch (TwitterException te) {
        te.printStackTrace();
        System.out.println("Failed to search tweets: " + te.getMessage());
    }

Et voici l'erreur:

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
264
Dozent

Après de nombreuses heures à essayer de créer des fichiers de cert pour que mon installation de Java 6 fonctionne avec les nouveaux cert de Twitter, je suis finalement tombé sur une solution incroyablement simple, enfouie dans un commentaire dans l'un des forums de discussion. Copiez simplement le fichier cacerts à partir d’une installation Java 7 et écrasez celui de votre installation Java 6. Il est probablement préférable d’effectuer une sauvegarde du fichier cacerts d’abord, mais vous devez ensuite copier le nouveau fichier et BOOM! ça fonctionne.

Notez que j'ai en fait copié un fichier Windows cacerts sur une installation Linux et que cela fonctionnait parfaitement.

Le fichier se trouve dans jre/lib/security/cacerts dans les anciennes et les nouvelles installations Java jdk.

J'espère que cela économisera à quelqu'un d'autre des heures d'aggravation.

68
Jeremy Goodell

Je suis tombé par hasard sur ce problème qui a pris de nombreuses heures de recherche, en particulier avec les certificats générés automatiquement, qui, contrairement aux certificats officiels, sont assez délicats et que Java ne les aime pas beaucoup.

Veuillez vérifier le lien suivant: Résoudre le problème avec les certificats en Java

En gros, vous devez ajouter le certificat du serveur aux certs Java Home. 

  1. Générez ou récupérez votre certificat et configurez Tomcat pour l'utiliser dans Servers.xml
  2. Téléchargez le code source Java de la classe InstallCert et exécutez-le pendant que le serveur est en cours d'exécution, en fournissant les arguments suivants server[:port]. Aucun mot de passe n'est nécessaire, car le mot de passe d'origine fonctionne pour les certificats Java ("changeit").
  3. Le programme se connectera au serveur et Java lancera une exception, analysera le certificat fourni par le serveur et vous permettra de créer un fichier jssecerts dans le répertoire où vous avez exécuté le programme (s'il est exécuté à partir d'Eclipse, assurez-vous de configurer le fichier. Répertoire de travail dans Run -> Configurations).
  4. Copiez manuellement ce fichier dans $Java_HOME/jre/lib/security

Après avoir suivi ces étapes, les connexions avec le certificat ne généreront plus d'exceptions au sein de Java.

Le code source suivant est important et il a disparu des blogs (Sun) Oracle, la seule page que j’ai trouvée se trouvait sur le lien fourni. Je l’attache donc dans la réponse pour toute référence.

/*
 * 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);
        }
    }
}
23
will824

Mon approche de l'interface utilisateur:

  1. Télécharger http://www.keystore-Explorer.org/
  2. Ouvrez $ Java_HOME/jre/lib/security/cacerts
  3. entrez PW: changeit (peut être changé sur Mac)
  4. Importez votre fichier .crt

Ligne CMD:

  1. keytool -importcert -file jetty.crt -alias jetty -keystore $ Java_HOME/jre/lib/security/cacerts
  2. entrez PW: changeit (peut être changé sur Mac)
21
Mike Mitterer

La situation était légèrement différente lorsque JDK et JRE 1.8.0_112 étaient présents sur mon système. 

J'ai importé les nouveaux certificats de CA dans [JDK_FOLDER]\jre\lib\security\cacerts à l'aide de la commande déjà connue:

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

Néanmoins, je continuais à obtenir le même La construction du chemin PKIX a échoué error. 

J'ai ajouté des informations de débogage à la CLI Java en utilisant Java -Djavax.net.debug=all ... > debug.log. Dans le fichier debug.log, la ligne commençant par trustStore est la suivante: désigne le magasin cacerts situé dans [JRE_FOLDER]\lib\security\cacerts

Dans mon cas, la solution consistait à copier le fichier cacerts utilisé par JDK (dans lequel les nouvelles autorités de certification avaient été ajoutées) sur celui utilisé par JRE, ce qui a résolu le problème. 

11
M. F.

1. Vérifiez le certificat

Essayez de charger l'URL cible dans le navigateur et d'afficher le certificat du site (généralement accessible par l'icône avec le verrou. Il se trouve à gauche ou à droite de la barre d'adresse du navigateur), qu'il soit expiré ou non approuvé pour une autre raison.

2. Installez les dernières versions de JRE et JDK

Les nouvelles versions viennent généralement avec l'ensemble mis à jour des certificats de confiance.

Si possible, désinstallez les anciennes versions. Cela rendra explicites les erreurs de configuration.

3. Vérifiez votre configuration:

  • Vérifiez où pointe votre variable d'environnement Java_HOME.
  • Vérifiez la version de Java que vous utilisez pour exécuter le programme. Dans IntelliJ, vérifiez:
    • Fichier -> Structure du projet ... -> Paramètres du projet -> Projet -> Projet SDK:
    • Fichier -> Structure du projet ... -> Paramètres de la plate-forme -> SDK

4. Copier le magasin de clés complet à partir de la nouvelle version Java

Si vous développez sous le JDK autre que le dernier disponible - essayez de remplacer le fichier %Java_HOME%/jre/lib/security/cacerts par le nouveau du dernier JRE installé (créez d’abord une copie de sauvegarde) comme le suggère @ jeremy-goodell dans son answer

5. Ajouter un ou plusieurs certificats à votre magasin de clés

Si rien de ce qui précède ne résout votre problème, utilisez keytool pour enregistrer le (s) certificat (s) dans le magasin de clés Java:

keytool -trustcacerts -keystore "%Java_HOME%jre\lib\security\cacerts" -storepass changeit -importcert -alias <alias_name> -file <path_to_crt_file>

Le fichier avec le certificat peut être obtenu à partir du navigateur, comme le suggère @MagGGG dans son answer .

Remarque 1: vous devrez peut-être répéter cette opération pour chaque certificat de la chaîne vers le certificat de votre site. Commencez à partir de la racine.

Remarque 2: <alias_name> doit être unique parmi les clés du magasin ou keytool affichera une erreur.

Pour obtenir la liste de tous les certificats du magasin que vous pouvez exécuter:

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

En cas de problème, cela vous aidera à retirer le certificat du magasin:

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

Je voulais importer un certificat pour smtp.gmail.com

La seule solution qui a fonctionné pour moi est 1. Entrez la commande pour voir ce certificat

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

  1. Copiez et enregistrez les lignes entre "----- BEGIN CERTIFICATE -----" et "----- END CERTIFICATE -----" dans un fichier, gmail.cer.

  2. Courir

    keytool -import -alias smtp.gmail.com -keystore "Fichier% Java_HOME%/jre/lib/security/cacerts" C:\Utilisateurs\Admin\Bureau\gmail.cer

  3. Entrez le mot de passe Chageit

  4. Cliquez sur oui pour importer le certificat 

  5. Redémarrer Java

maintenant exécuter la commande et vous êtes prêt à partir

6
Sneha Shejwal

Contexte de la question: 

J'obtenais l'erreur suivante lorsque j'essaye d'exécuter mvn clean install dans mon projet et via l'option de nettoyage et de construction Netbeans IDE . Invite, mais capable de télécharger les fichiers via le navigateur. 

Erreur:

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  

Résolution:

1. Téléchargez le certificat de l'URL en question:

  • Lancez IE par "run as adminstrator" (sinon, nous ne pourrons pas télécharger le certificat)
  • Entrez l'URL dans IE-> https: // url/local-repo (Dans mon cas, cette URL avait un certificat non approuvé  enter image description here .)
  • Téléchargez le certificat en cliquant sur Erreur de certificat -> visualiser le certificat
  • Sélectionnez l'onglet Détails -> Copier dans un fichier -> Suivant -> Sélectionnez "Binaire codé DER X.509 (.CER) 
  • enregistrer le certificat dans un emplacement donné, par exemple: c: /user/sheldon/desktop/product.cer 
  • Félicitations! vous avez téléchargé avec succès le certificat pour le site

2. Installez maintenant le magasin de clés pour résoudre le problème.

  • Exécutez la commande keytool pour ajouter le fichier de clés téléchargé au fichier fichier de certificat existant.
  • Commande: Commande ci-dessous dans le dossier bin de jdk (Java_HOME)

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

  • Vous serez invité à entrer un mot de passe. Entrez le mot de passe du magasin de clés: Entrez "changeit" à nouveau pour "Faire confiance à ce certificat? [Non]:", entrez "Oui"

Exemples de commandes/sortie en ligne de commande:

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
  • Regrets! vous devriez maintenant vous débarrasser de l'erreur "Echec de la construction du chemin PKIX: erreur Sun.security.provider.certpath.SunCertPathBuilderException" dans votre environnement de développement Netbeans. 
4
Barani r

Ce n'est pas une réponse spécifique à Twitter, mais c'est la question qui se pose lorsque vous recherchez cette erreur. Si votre système reçoit cette erreur lors de la connexion à un site Web qui semble posséder un certificat valide lorsqu'il est affiché dans un navigateur Web, cela signifie probablement que ce site Web possède une chaîne de certificats incomplète

Pour résumer brièvement le problème: Les autorités de certification n'utilisent pas leur certificat racine pour signer n'importe quel ancien certificat. Au lieu de cela, ils signent (généralement) des certificats intermédiaires qui possèdent également l'indicateur d'autorité de certification (c'est-à-dire qu'ils sont autorisés à signer des certificats). Ensuite, lorsque vous achetez un certificat auprès d'une autorité de certification, celui-ci signe votre CSR avec l'un de ces certificats intermédiaires.

Votre trust store Java ne possède probablement que le certificat racine, pas les certificats intermédiaires. 

Un site mal configuré peut renvoyer seulement leur certificat signé. Problème: il a été signé avec un certificat intermédiaire qui n'est pas dans votre magasin de données de confiance. Les navigateurs gèrent ce problème en téléchargeant ou en utilisant un certificat intermédiaire mis en cache. cela maximise la compatibilité du site Web. Java et des outils comme OpenSSL, cependant, ne le seront pas. Et cela provoquera l'erreur dans la question.

Vous pouvez vérifier cette suspicion en utilisant Qualys SSL Test . Si vous exécutez cela contre un site et qu'il dit

La chaîne de certificats de ce serveur est incomplète.

alors cela le confirme. Vous pouvez également voir cela en consultant les chemins de certification et en affichant le texte Extra Download.

Comment y remédier: l'administrateur du serveur doit configurer le serveur Web pour qu'il renvoie également les certificats intermédiaires. Pour Comodo, par exemple, c'est ici que le fichier .ca-bundle est utile. Par exemple, dans une configuration Apache avec mod_ssl, vous utiliseriez le paramètre de configuration SSLCertificateChainFile. Pour nginx, vous devez concaténer les certificats intermédiaires et le certificat signé et les utiliser dans la configuration du certificat SSL. Vous pouvez trouver plus d'informations en recherchant "Chaîne de certificats incomplète" en ligne.

3
Reid
-Dmaven.wagon.http.ssl.insecure=true -Dmaven.wagon.http.ssl.allowall=true

Il est utilisé pour sauter la validation du certificat.

2
gorums

La raison pour laquelle nous obtenons l’erreur ci-dessus est que JDK contient un grand nombre de certificats d’autorité de certification de confiance dans un fichier appelé «cacerts», mais ce fichier n’a aucune idée de notre certificat auto-signé. En d’autres termes, notre certificat auto-signé n’est pas importé dans le fichier cacerts et ne le traite donc pas comme une entité de confiance. Il donne donc l’erreur ci-dessus.

Comment corriger l'erreur ci-dessus

Pour corriger l'erreur ci-dessus, il suffit d'importer le certificat auto-signé dans le fichier cacerts.

Premièrement, localisez le fichier cacerts. Nous devrons connaître l'emplacement du JDK. Si vous exécutez votre application via l'un des IDE tels qu'Eclipse ou IntelliJ Idea, accédez aux paramètres du projet et déterminez quel est l'emplacement du JDK . Par exemple, sur un Mac OS, l'emplacement typique du fichier cacerts serait situé à cet emplacement/Bibliothèque./Java/JavaVirtualMachines/{{JDK_version}}/Sommaire/Home/jre/lib/security Sur une machine Windows, il se trouverait sous {{Répertoire_Installation}}/{{JDK_version}}/jre/lib/security

Une fois que vous avez localisé le fichier cacerts, nous devons maintenant importer notre certificat auto-signé dans ce fichier cacerts. Consultez le dernier article si vous ne savez pas comment générer correctement le certificat auto-signé.

Si vous n’avez pas de fichier de certificat (.crt) et seulement un fichier .jks, vous pouvez générer un fichier .crt à l’aide de la commande ci-dessous. Si vous avez déjà un fichier .crt/.pem, vous pouvez ignorer la commande ci-dessous.

## Pour générer un certificat à partir du magasin de clés (fichier .jks) ####

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

L’étape ci-dessus générera un fichier appelé selfsigned.crt.Now Importe le certificat dans cacerts

keytool -importcert -file selfsigned.crt -alias selfsigned -keystore {{cacerts path}}

par exemple

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

C’est tout, redémarrez votre application et cela devrait fonctionner correctement. Si cela ne fonctionne toujours pas et obtenez une exception de négociation SSL. Cela signifie probablement que vous utilisez un domaine différent de celui enregistré dans le certificat.

Le lien avec une explication détaillée et une résolution étape par étape est ici.

2
Abhishek Galoda

Je suis tombé sur cette question en essayant d'installer le plug-in Cucumber-Eclipse dans Eclipse via leur site de mise à jour. J'ai reçu la même erreur 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

Certaines des autres réponses sont appropriées et utiles à la situation de cette question, mais elles ont néanmoins été inutiles et trompeuses pour mon problème. 

Dans mon cas, le problème était que l'URL fournie pour leur site de mise à jour est:

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

Cependant, lorsque vous y accédez via un navigateur, il est redirigé vers (notez le ".github" ajouté):

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

La solution consiste donc simplement à utiliser la version redirigée de l'URL du site de mise à jour lors de l'ajout du site de mise à jour dans Eclipse.

2
royfripple

L'ajout de cacerts n'a pas fonctionné pour moi . Après avoir activé le journal avec l'indicateur -Djavax.net.debug=all, nous avons appris à lire Java à partir de jssecacerts.

Importer dans jssecacerts a finalement fonctionné.

2
alk453

Pour moi, une erreur de certificat est apparue parce que le violoniste fonctionnait en arrière-plan et que le certificat était gâché Il agit comme un proxy si proche que et redémarrez Eclipse.

0
Atihska

Lorsque vous avez une erreur ci-dessus avec le logiciel 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 '[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

vous pouvez ajouter des certs à son magasin de clés approuvé (remplacez missing_ca par le nom de certificat approprié):

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

Si le mot de passe est demandé, saisissez changeit et confirmez y

Après cela, redémarrez simplement Jira.

0
Karol Murawski

Ceci est une solution mais sous la forme de mon histoire avec ce problème:

J'étais presque morte en essayant toute la solution donnée ci-dessus (pendant 3 jours) et rien ne fonctionnait pour moi.

J'ai perdu tout espoir.

J'ai contacté mon équipe de sécurité à ce sujet parce que j'étais derrière un proxy et ils m'ont dit qu'ils avaient récemment mis à jour leur politique de sécurité.

Je les ai réprimandés pour ne pas avoir informé les développeurs.

Plus tard, ils ont publié un nouveau fichier "cacerts" contenant tous les certificats.

J'ai supprimé le fichier cacerts présent dans% Java_HOME%/jre/lib/security et le problème a été résolu.

Donc, si vous êtes confronté à ce problème, il se peut que votre équipe réseau le soit également.

0
Vikash Kumar

C'est un ajout à la réponse https://stackoverflow.com/a/36427118/1491414 . Merci @MagGGG

  • S'il vous plaît assurez-vous d'avoir la permission d'administrateur
  • Veuillez utiliser des guillemets doubles pour le chemin du magasin de clés (-keystore C:\Program Files (x86)\Java\jre1.6.0_22\lib\security\cacerts ") car, sous Windows, l'emplacement d'installation par défaut est Program Files. une erreur en raison de l'espace entre Program Files. 
0
Ganesa Vijayakumar

Essayez de copier 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

J'ai corrigé ceci en utilisant la méthode ci-dessous-

  1. Copier l'URL qui a un problème de connexion
  2. Allez dans Android Studio-> Paramètres-> Paramètres HTTP.
  3. Dans 'Test Connection', collez cette URL et appuyez sur OK
  4. Sur Ok, Android Studio demande à importer le certificat de cette URL , Importez-le.
  5. C'est tout. Rien d'autre à faire et mon problème avait disparu. Pas besoin de redémarrer le studio.
0
AndroDev

Si vous utilisez CloudFoundry et rencontrez un problème de certificat, vous devez vous assurer que vous repoussez le fichier jar avec le service de stockage de clés contenant le certificat. Simplement lier, lier et redémarrer ne fonctionnera pas.

0
Smart Coder

Si votre URL de référentiel fonctionne également sur HTTP et que la sécurité n’est pas un problème, vous pouvez accéder à settings.xml (souvent, mais pas toujours, dans %USERPROFILE%/.m2) et remplacer HTTPS par HTTP pour <repository> et <pluginRepository> URL.

Par exemple, ceci:

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

devrait être remplacé par ceci:

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

J'utilisais mon propre trust store plutôt que JRE en passant arg -Djavax.net.ssl.trustStore=

Je recevais cette erreur indépendamment des certs dans le magasin de clés. La question pour moi était la commande des propriétés passées sur la ligne arg. Quand je mets -Djavax.net.ssl.trustStore= & -Djavax.net.ssl.trustStorePassword= avant -Dspring.config.location= & -jar args, j’ai pu appeler avec succès mon appel restant sur https. 

0
jasonoriordan

j'ai le même problème sur Ubuntu 15.10. Veuillez essayer de télécharger le plugin localement, par exemple. https://github.com/lmenezes/elasticsearch-kopf/archive/master.Zip et installez-le avec cette commande:

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

Le chemin peut être différent selon votre environnement. 

Cordialement. 

0
user1379218

Ici, normalement, ce genre d'exception se produit lorsqu'il y a une incompatibilité dans le PATH du certificat de confiance. Vérifiez la configuration ou le chemin où ce certificat de serveur est requis pour la communication sécurisée. 

0
ketan

Si vous rencontrez ce problème dans un conteneur Linux lorsque l'application Java tente de communiquer avec une autre application/un autre site, c'est parce que le certificat a été importé de manière incorrecte dans l'équilibreur de charge. Il y a une séquence d'étapes à suivre pour importer des certificats et si ce n'est pas fait correctement, vous verrez des problèmes comme

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

Une fois les certificats importés correctement, cela devrait être fait. Pas besoin de bricoler avec les certificats JDK.

0
vsingh

Je faisais face au même problème et je le résous en suivant les étapes simples ci-dessous:

1) Téléchargez le fichier InstallCert.Java à partir de Google.

2) Compilez-le avec javac InstallCert.Java

3) Exécutez InstallCert.Java à l’aide de Java InstallCert.Java, avec le nom d’hôte et le port https, puis appuyez sur «1» pour demander une entrée. Il ajoutera le “localhost” en tant que magasin de clés approuvé et générera un fichier nommé “jssecacerts“ comme ci-dessous:

Java InstallCert localhost: 443

4) copier le jssecacerts dans le dossier $ Java_HOME/jre/lib/security

La source principale pour résoudre le problème ici est:

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

0
Ankur jain