«La création du chemin PKIX a échoué» et «impossible de trouver un chemin de certification valide vers la cible demandée»


423

J'essaie d'obtenir des tweets en utilisant la bibliothèque twitter4j pour mon projet java. Lors de ma première exécution, j'ai reçu une erreur concernant le certificat sun.security.validator.ValidatorExceptionet sun.security.provider.certpath.SunCertPathBuilderException. Ensuite, j'ai ajouté le 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 tweets:

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

6
Bonjour Veuillez vérifier ci-dessous l'URL. Je suis sûr que cela vous aidera. java-samples.com/showtutorial.php?tutorialid=210 confluence.atlassian.com/display/JIRAKB/… . Vous devez ajouter votre certificat ssl au certificat java truststore (Chemin: jre / lib / security / cacerts).
sus007

Veuillez vous référer à cette réponse pour la solution et confirmez que vous empaquetez votre logiciel en tant que jre fourni? si oui, copiez votre système de fichiers cacerts et remplacez ce fichier jre cacerts emballé.
positivecrux

essayez ce stackoverflow.com/a/9210661/4741746 c'est peut-être votre réponse
sushant gosavi

2
Je viens d'utiliser ce code java et pour https n'oubliez pas de spécifier le port comme 443. Code Java sur github.com/escline/InstallCert/blob/master/InstallCert.java Il prendra votre fichier CACERTS et ajoutera tous ces plus le certificat actuel pour l'URL que vous donnez en entrée. Dans mon cas, j'ai codé en dur les valeurs pour host = "mywebservice.uat.xyz.com"; port = 443; passphrase = "changeit" .toCharArray (); Ensuite, le programme crée un nouveau fichier appelé "jssecacerts" qui aura tout. Renommez cela en "cacerts" et utilisez-le. Vous serez prêt.
Reddymails

Réponses:


575
  1. Accédez à l'URL dans votre navigateur:
    • firefox - cliquez sur la chaîne de certificats HTTPS (l'icône de verrouillage juste à côté de l'adresse URL). Cliquez "more info" > "security" > "show certificate" > "details" > "export..". Choisissez le nom et choisissez le type de fichier example.cer
    • chrome - cliquez sur l'icône du site à gauche pour l'adresse dans la barre d'adresse, sélectionnez "Certificat" -> "Détails" -> "Exporter" et enregistrez au format "Binaire à codage Der, certificat unique".
  2. Vous avez maintenant un fichier avec keystore et vous devez l'ajouter à votre JVM. Déterminez l'emplacement des fichiers cacerts, par exemple. C:\Program Files (x86)\Java\jre1.6.0_22\lib\security\cacerts.

  3. example.cerImportez ensuite le fichier dans cacerts en ligne de commande:

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

Il vous sera demandé un mot de passe dont la valeur par défaut est changeit

Redémarrez votre JVM / PC.

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


27
Je devais mettre le chemin entre guillemets et l'enregistrer aussi en Base64 au lieu de DER
Theodore K.

3
wow..il a fonctionné comme par magie en passant, en chrome, vous cliquez simplement sur l'icône de verrouillage sur la barre d'adresse de gauche, puis cliquez sur détails et aucun redémarrage n'est nécessaire
aswzen

8
Notez que les instructions doivent être répétées pour tous les certificats de la chaîne. Le aliasnom du certificat en ligne de commande doit également être unique.
Lu55

5
Si votre domicile est un JDK, assurez-vous de spécifier que le jre se trouve dans ce fichier: keytool -import -alias example -keystore "C: \ Program Files \ Java \ jdk1.8.0_73 \ jre \ lib \ security \ cacerts" -file example.cer
Jack BeNimble

12
Pour toute personne obtenant une erreur «accès refusé», assurez-vous que vous exécutez l'invite de commande en tant qu'administrateur.
Walker Christie

81

Après plusieurs heures à essayer de créer des fichiers cert pour que mon installation Java 6 fonctionne avec les nouveaux certificats twitter, je suis finalement tombé sur une solution incroyablement simple enterrée dans un commentaire sur l'un des forums. Copiez simplement le fichier cacerts d'une installation Java 7 et écrasez celui de votre installation Java 6. Il est probablement préférable de faire une sauvegarde du fichier cacerts en premier, mais ensuite il vous suffit de copier le nouveau et de BOOM! ça marche juste.

Notez que j'ai en fait copié un fichier cacerts Windows sur une installation Linux et cela a très bien fonctionné.

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

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


4
J'essaie d'accéder à un serveur SSL avec un certificat auto-signé, j'ai essayé d'ajouter son certificat à l'aide de keytool, mais pas de chance, des suggestions?
Oleg Belousov

1
Heureux que cela ait fonctionné .. Mais savez-vous quelle était la cause profonde. ce qui l'a fait échouer avec java 6 certs .. et comment le java 7 certs a résolu le problème
Vishwanath gowda k

Cela a réussi, même si je suis passé de icedtea 1.6 à oracle 1.7. :)
nperson325681


10
Pour ceux qui comme moi manquent parfois de l'évidence - assurez-vous que vous y allez $JAVA_HOME/jre/lib, non $JAVA_HOME/lib- j'ai passé un peu de temps à manquer ce détail.
Ryan Heathcote

36

Mon approche de l'interface utilisateur:

  1. Téléchargez l'explorateur de magasins de clés à partir d' ici
  2. Ouvrez $ JAVA_HOME / jre / lib / security / cacerts
  3. entrez PW: changeit (peut être modifié 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 modifié sur Mac)

1
Sur mac, avec CMD-Line, vous devez utiliser sudo pour exécuter la commande. # sudo keytool -importcert -file jetty.crt -alias jetty -keystore $ JAVA_HOME / jre / lib / security / cacerts
malajisi

1
Sous Windows, la commande qui fonctionne:keytool -importcert -file dinardap_cert.cer –alias dinardap –keystore “%JAVA_HOME%/jre/lib/security/cacerts”
Patricio Bonilla

où obtenir le fichier cert? Je ne peux pas dire à quelle URL aller. jetty.com ?
kraftydevil

J'ai obtenu mon certificat en l'exportant à partir du navigateur Web, action contextuelle sur le cadenas
rtbf

28

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

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

Fondamentalement, vous devez ajouter le certificat du serveur aux certificats Java Home.

  1. Générez ou obtenez votre certificat et configurez Tomcat pour l'utiliser dans Servers.xml
  2. Téléchargez le code source Java de la classe InstallCertet 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 lèvera une exception, il analysera le certificat fourni par le serveur et vous permettra de créer un jssecertsfichier dans le répertoire où vous avez exécuté le programme (s'il est exécuté à partir d'Eclipse, assurez-vous de configurer le 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 dans Java.

Le code source suivant est important et il a disparu des blogs (Sun) Oracle, la seule page que j'ai trouvée était sur le lien fourni, donc je le joins à 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);
        }
    }
}

2
Notez que le fichier créé est jssecacerts!
DeanDP

J'ai essayé d'utiliser cette solution pour Java 7 et 8. Lors de l'exécution sur Java 7, j'ai obtenu protocol_version ou handshake_failure pour toutes les URL de référentiel distant avec lesquelles j'ai essayé. 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

20

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 signe de verrouillage. 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 sont généralement fournies avec l'ensemble mis à jour des certificats approuvés.

Aussi, si c'est 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 java que vous utilisez pour exécuter le programme. Dans IntelliJ, vérifiez:
    • Fichier -> Structure du projet ... -> Paramètres du projet -> Projet -> SDK du projet:
    • Fichier -> Structure du projet ... -> Paramètres de la plateforme -> SDK

4. Copiez le magasin de clés entier de la nouvelle version Java

Si vous développez sous le JDK autre que le dernier disponible - essayez de remplacer le %JAVA_HOME%/jre/lib/security/cacertsfichier par le nouveau du dernier JRE installé (faites d'abord une copie de sauvegarde) comme @ jeremy-goodell le suggère dans son réponse

5. Ajoutez des certificats à votre magasin de clés

Si rien ci-dessus ne résout votre problème, utilisez keytoolpour 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 @MagGGG le suggère dans sa réponse .

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 oukeytool affichera une erreur.

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

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

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

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

Compte tenu de son niveau d'élaboration, ce devrait être la réponse acceptée.
Egor Hans

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

Il est utilisé pour sauter la validation du certificat.

Avertissement Utilisez uniquement à des fins de développement pour cela n'est pas sûr!


4
Il est utilisé pour sauter la validation du certificat
gorums

2
@gorums Comment le configurer dans Eclipse?
malajisi

6
Ne le faites PAS, sauf si vous voulez risquer d'exécuter du code malveillant arbitraire sur votre machine. Voté car il risque de compromettre toute machine qui l'exécute.
Bryan

1
Ce n'est pas parce que cela «fonctionne» que c'est sûr, vous mettez en danger tous ceux qui suivent ces conseils. Ayez mon downvote
Paradoxis

1
@AceKing Le fait est que ce n'est pas un code de confiance si vous ne validez pas le certificat. Cela dit, je pense que c'est toujours une réponse utile. Les gens qui le font ont juste besoin de comprendre les risques.
Michael Mior

12

J'ai eu une situation 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 CA en [JDK_FOLDER]\jre\lib\security\cacertsutilisant la commande déjà connue:

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

Pourtant, j'ai continué à obtenir la même erreur d' échec de création du chemin PKIX .

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 qui commence par trustStore est: pointée vers le magasin cacerts trouvé dans[JRE_FOLDER]\lib\security\cacerts .

Dans mon cas, la solution était de copier le fichier cacerts utilisé par JDK (qui avait ajouté les nouvelles autorités de certification) sur celui utilisé par le JRE et cela a résolu le problème.


J'ai directement importé les certificats dont j'avais besoin dans JRE / lib / security / cacerts à l'aide de keytool, mais cela n'a rien changé pour moi :( toujours la même erreur, je les ai également ajoutés via l'IDE, ou même dans le chemin de classe et ajouté un bean à spécifier l'emplacement du magasin de clés! C'est fou AF!
Alex

8

Contexte du problème:

J'obtenais l'erreur suivante lorsque j'essaie d'exécuter mvn clean install dans mon projet et via l'option Netbeans IDE clean and build. Ce problème est dû au certificat non disponible lorsque nous téléchargeons via NET beans IDE / via l'invite de commande, 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:

  • Lancer IE par "exécuter en tant qu'administrateur" (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é entrez la description de l'image ici.)
  • Téléchargez le certificat en cliquant sur Erreur de certificat -> voir le certificat
  • Sélectionnez l'onglet Détails -> copier dans un fichier -> suivant -> sélectionnez "Binaire codé DER X.509 (.CER)
  • enregistrez le certificat à un certain endroit, par exemple: c: /user/sheldon/desktop/product.cer
  • Félicitations! vous avez téléchargé avec succès le certificat du 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é dans le 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é à saisir le mot de passe. Entrez le mot de passe du magasin de clés: entrez à nouveau "changeit" pour "Faire confiance à ce certificat? [Non]:", entrez "oui"

Exemples de commandes / sorties de 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
  • Contgrats! vous devez maintenant vous débarrasser de l'erreur "Échec de la création du chemin PKIX: sun.security.provider.certpath.SunCertPathBuilderException" dans votre IDE Netbeans.

Salut j'ai suivi toutes les étapes mais pas de chance :(
ManishNegi

avez-vous un autre certificat sur le chemin autre que des cacerts? si vous en avez d'autres, essayez de l'ajouter à ce certificat
Barani r

Merci @Barani r, c'était mon erreur que j'exécutais la commande depuis jre et que j'utilisais JDK dans mon éclipse
j'utilisais

N'a pas pu télécharger le certificat mais après, "exécuter en tant qu'administrateur", a bien fonctionné.
Un autre codeur le

8

Je voulais importer un certificat pour smtp.gmail.com

La seule solution qui a fonctionné pour moi est 1. Entrez la commande pour afficher 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 "% JAVA_HOME% / jre / lib / security / cacerts" -fichier C: \ Users \ Admin \ Desktop \ gmail.cer

  3. Entrez le mot de passe chageit

  4. Cliquez sur oui pour importer le certificat

  5. Redémarrez java

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


Merci mec! Cela m'a sauvé la journée. C'était la seule solution appropriée dans mon cas.
Andrew Gans

J'ai aussi sauvé ma journée. Je vous remercie.
Kris

6

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 avoir un certificat valide lorsqu'il est affiché dans un navigateur Web , cela signifie probablement que le site Web a une chaîne de certificats incomplète .

Pour un bref résumé du 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 intermédiaires certificats qui ont également l'indicateur Autorité de certification défini (c'est-à-dire, sont autorisés à signer des certificats). Ensuite, lorsque vous achetez un certificat auprès d'une autorité de certification, ils signent votre CSR avec l'un de ces certificats intermédiaires.

Votre magasin de confiance Java n'a probablement que le certificat racine, pas les certificats intermédiaires.

Un site mal configuré peut renvoyer uniquement son certificat signé. Problème: il a été signé avec un certificat intermédiaire qui n'est pas dans votre magasin de confiance. Les navigateurs géreront 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 feront pas. Et cela provoquera l'erreur dans la question.

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

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

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

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


Tu es brillant. Je vous remercie! J'ai eu un problème avec la nouvelle version de mon serveur Java car j'ai oublié de supprimer le # devant SSLCertificateChainFile !!! Vraiment bien expliqué.
KisnardOnline

6

La raison pour laquelle nous obtenons l'erreur ci-dessus est que JDK est fourni avec un grand nombre de certificats de l'autorité de certification (CA) de confiance dans un fichier appelé `` cacerts '', mais ce fichier n'a aucune idée de notre certificat auto-signé. En d'autres termes, le fichier cacerts n'a pas notre certificat auto-signé importé et ne le traite donc pas comme une entité de confiance et 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.

Tout d'abord, recherchez le fichier cacerts. Nous devrons trouver l'emplacement du JDK. Si vous exécutez votre application via l'un des IDE comme Eclipse ou IntelliJ Idea, accédez aux paramètres du projet et déterminez quel est l'emplacement JDK. Par exemple, sur un Mac OS, l'emplacement typique du fichier cacerts se trouverait à cet emplacement / Library / Java / JavaVirtualMachines / {{JDK_version}} / Contents / Home / jre / lib / security sur la machine d'une fenêtre, ce serait sous {{Installation_directory} } / {{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 en utilisant 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 va générer un fichier appelé selfsigned.crt.Now Importez le certificat dans cacerts

Ajoutez maintenant le certificat à JRE / lib / security / cacerts (trustore)
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, puis enregistré dans le certificat.

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


4

L'ajout cacertsn'a pas fonctionné pour moi. Après avoir activé le journal avec le drapeau -Djavax.net.debug=all, j'ai appris à lire en Java jssecacerts.

L'importation jssecacertsa finalement fonctionné.


2
L'explication manquante ici est que Java utilisera jssecacertss'il est présent, sinon cacerts.
Marquis de Lorne

3

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

J'étais presque mort en essayant toute la solution donnée ci-dessus (pendant 3 jours) et rien n'a fonctionné pour moi.

J'ai perdu tout espoir.

J'ai contacté mon équipe de sécurité à ce sujet car 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 sévèrement réprimandés pour ne pas en avoir informé les développeurs.

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

J'ai supprimé le fichier cacerts qui est présent dans% JAVA_HOME% / jre / lib / security et cela a résolu mon problème.

Donc, si vous êtes confronté à ce problème, cela pourrait provenir de votre équipe réseau également.


2

Je suis tombé sur cette question en essayant d'installer le plugin 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

Bien que certaines des autres réponses soient appropriées et utiles pour la situation donnée de cette question, elles étaient néanmoins 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 ré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.


3
Êtes-vous sûr de répondre à la bonne question? Il n'y a aucune mention de concombre dans la question d'origine ...
Done Data Solutions

Je sens que je le suis. J'ai reçu la même erreur SunCertPathBuilderException et lors de la recherche d'une résolution, j'ai trouvé cette question ainsi que celle-ci . Cependant, aucun d'eux n'avait de solution appropriée à ma situation. Je n'essayais pas de répondre à la question spécifique de savoir comment ajouter le site du plugin Cucumber-Eclipse à eclipse. Je voulais fournir un contexte au problème rencontré (redirection d'URL) et expliquer comment il a été résolu.
royfripple

J'ai mis à jour ma réponse pour indiquer clairement que j'ai reçu la même erreur, notant que le problème sous-jacent et la solution étaient différents. Je pense que cela est valable car d'autres peuvent trouver cette question lors de la recherche sur la même erreur. Veuillez envisager de modifier votre vote si vous pensez que cela a du sens.
royfripple

Je vous remercie. Rend les choses beaucoup plus claires, inversé mon downvote
Done Data Solutions

Vous êtes les bienvenus! Et merci d'avoir pris le temps de le revoir.
royfripple

2

J'étais confronté au même problème et le résoudre en utilisant les étapes simples ci-dessous:

1) Téléchargez InstallCert.java depuis google

2) Compilez-le en utilisant javac InstallCert.java

3) Exécutez InstallCert.java à l'aide de java InstallCert.java , avec le nom d'hôte et le port https, et appuyez sur «1» lorsque vous demandez une entrée. Il ajoutera «localhost» en tant que fichier de clés approuvé et générera un fichier nommé «jssecacerts» comme ci-dessous:

java InstallCert localhost: 443

4) copiez les jssecacerts dans le dossier $ JAVA_HOME / jre / lib / security

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

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


1

J'ai résolu ce problème sur Windows Server 2016 avec Java 8, en important le certificat du pkcs12magasin au magasin de cacertsclés.

Chemin d'accès au magasin pkcs12:
C:\Apps\pkcs12.pfx

Chemin d'accès aux cacerts Java:
C:\Program Files\Java\jre1.8.0_151\lib\security\cacerts

Chemin d'accès au keytool:
C:\Program Files\Java\jre1.8.0_151\bin

Après avoir possédé un dossier avec keytool dans l'invite de commande (en tant qu'administrateur), la commande pour importer le certificat de pkcs12à cacertsest la suivante:
keytool -v -importkeystore -srckeystore C:\Apps\pkcs12.pfx -srcstoretype PKCS12 -destkeystore "C:\Program Files\Java\jre1.8.0_151\lib\security\cacerts" -deststoretype JKS

Vous serez invité à:
1. entrer le mot de passe du magasin de clés de destination (mot de passe cacerts, la valeur par défaut est "changeit")
2. entrez le mot de passe du fichier de clés source (mot de passe pkcs12)


Pour que les modifications prennent effet, redémarrez la machine serveur (ou redémarrez simplement JVM).


1
J'ai utilisé cette approche sur un Mac et cela a fonctionné. Mon certificat a bien sûr été auto-signé et généré dans J'ai importé le fichier .pfx que j'avais généré sur mon serveur Windows ADFS. Utilisation de Java 10 pour mon application Merci
Shashikant Soni

0

Ici, normalement, ce type d'exception se produit en cas de non-concordance dans le CHEMIN du certificat approuvé. Vérifiez la configuration ou le chemin où ce certificat de serveur est requis pour une communication sécurisée.


Pouvez-vous s'il vous plaît me dire la configuration exacte où je peux installer le certificat. En fait, j'ai un problème à ce sujet, j'avais installé le certificat concernant ce problème en utilisant keytool , cela fonctionne pendant environ 20-30 minutes, puis le serveur émet à nouveau la même erreur. Aidez-moi, s'il vous plaît. Je suis coincé dans ce numéro depuis 2 jours.
Deepak Gangore

Je pense que le certificat change toutes les 20 à 30 minutes
Vishwanath gowda k

Je fais face à un problème similaire, mais le problème est le suivant: MON emplacement par défaut de Java pour $ JAVA_HOME / lib / security / cacerts d'applications Java bien que j'aie fourni -Djavax.net.ssl.trustStore = / myapp / app.jks Quelqu'un peut-il m'aider sur ceci: stackoverflow.com/questions/33821785/…
Laxman G

0

Pour moi, une erreur de certificat est apparue parce que j'avais un violoneux en cours d'exécution en arrière-plan et cela gâche le certificat. Il agit comme un proxy si proche et redémarre eclipse.


même problème qui se produit dans l'éclipse, même après la fermeture de toutes les applications
arvindwill

0

buts:

  1. utiliser des connexions https
  2. vérifier les chaînes SSL
  3. ne pas gérer les cacerts
  4. ajouter un certificat lors de l'exécution
  5. ne perdez pas les certificats des cacerts

Comment faire:

  1. définir son propre magasin de clés
  2. mettre le certificat dans le magasin de clés
  3. redéfinir le contexte SSL par défaut avec notre classe personnalisée
  4. ???
  5. profit

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

Cette classe créera un fichier de clés si nécessaire et pourra gérer les certificats à l'intérieur. Maintenant classe pour le contexte 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;
    }
}

Cette classe a été créée en tant que singleton, car un seul contexte SSL par défaut est autorisé. Donc, maintenant, utilisez:

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

Il est possible que cela ne fonctionne pas avec ces paramètres, car je conserve le fichier de certificat à l'intérieur du dossier de ressources, donc mon chemin n'est pas absolu. Mais en général, cela fonctionne parfaitement.


1
Cette double utilisation abusive available()est spécifiquement mise en garde dans son propre Javadoc.
Marquis de Lorne

0

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

  • Veuillez vous assurer que vous disposez des droits d'administrateur
  • Veuillez utiliser des guillemets doubles pour le chemin du fichier de clés (-keystore C: \ Program Files (x86) \ Java \ jre1.6.0_22 \ lib \ security \ cacerts ") car dans le système d'exploitation Windows, l'emplacement d'installation par défaut sera Program Files et vous obtiendrez une erreur en raison de l'espace entre les fichiers programme.

0

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

  1. Copier l'URL qui rencontre un problème de connexion
  2. Accédez à Android Studio-> Paramètres-> Paramètres Http
  3. Dans «Tester la connexion», collez cette URL et appuyez sur OK
  4. Sur OK, Android Studio vous demandera d'importer le certificat de cette URL, importez-le
  5. C'est ça. Rien d'autre à faire et mon problème avait disparu. Pas besoin de redémarrer le studio également.

0

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 '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

vous pouvez ajouter des certificats à 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é changeit, confirmez et confirmezy

Après cela, redémarrez simplement jira.


0

Si l'URL de votre 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, situé 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

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

J'obtenais cette erreur indépendamment des certificats dans le magasin de clés de confiance. Le problème pour moi était la commande des propriétés passées sur la ligne d'argument. Lorsque j'ai mis -Djavax.net.ssl.trustStore=& -Djavax.net.ssl.trustStorePassword= before -Dspring.config.location= & -jarargs, j'ai réussi à appeler mon appel de repos via https.


0

Si vous utilisez CloudFoundry et que vous rencontrez un problème de certificat, vous devez vous assurer de pousser à nouveau le pot avec le service de magasin de clés avec le certificat. Simplement dissocier, lier et redémarrer ne fonctionnera pas.


0

Si votre hôte se trouve derrière le pare-feu / proxy , utilisez la commande suivante dans cmd:

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

Remplacez <proxy_hostname>et <proxy_port>par le serveur proxy HTTP configuré. Remplacez-le <remote_host_name:remote_ssl_port>par l'un de l'hôte distant (essentiellement l'URL) et le port présentant le problème de certification.

Prenez le dernier contenu du certificat imprimé et copiez-le (copiez également le certificat de début et de fin). Collez-le dans un fichier texte et donnez- lui l' extension .crt . Maintenant, importez ce certificat dans cacerts à l' aide de la commande java keytool et cela devrait fonctionner.

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

0

Essayez de copier des cacerts java:

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

Si vous voyez ce problème dans un conteneur Linux lorsque l'application Java essaie de communiquer avec une autre application / 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 cela 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

Je l'ai résolu pour Intellij Idea Je fais face à ce problème Althouh, je change beaucoup de place pour résoudre le problème.J'ai trouvé une solution pour moi.Cliquez avec le bouton droit sur votre projet, vous verrez Maven , après cela, appuyez sur Générer les sources et mettre à jour les dossiers et réimporter entrez la description de l'image ici

C'est fait.


0

J'étais confronté au même problème, j'utilisais 8.1.0-3, mais plus tard j'ai utilisé 9.2.1-0 et le problème a été résolu sans aucune étape manuelle. Le certificat auto-signé a bien fonctionné.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.