Impossible de trouver le chemin de certification valide vers la cible demandée-erreur même après l'importation du certificat


J'ai un client Java essayant d'accéder à un serveur avec un certificat auto-signé.

Quand j'essaye de Poster sur le serveur, j'obtiens l'erreur suivante:

Impossible de trouver le chemin de certification valide vers la cible demandée

Après avoir fait quelques recherches sur la question, j'ai ensuite fait ce qui suit.

  1. A enregistré le nom de domaine de mes serveurs en tant que racine.fichier cer.
  2. Dans le JRE de mon serveur Glassfish, j'ai exécuté ceci: keytool-import -alias exemple -keystore cacerts -racine du fichier.la cer.
  3. Pour vérifier que le certificat a été ajouté à mon cacert avec succès, j'ai fait ceci: keytool-liste - v-keystore cacerts Je peux voir que le cert est présent.
  4. J'ai ensuite redémarré Glassfish et retiré le 'post'.

Je reçois toujours la même erreur.

J'ai le sentiment que c'est parce que mon Glassfish ne lit pas réellement le fichier cacert que j'ai modifié mais peut-être un autre.

N'Avez-vous eu ce problème et peut me pousser dans la bonne la direction?

Author: Cœur, 2012-02-09

9 answers

Malheureusement - cela pourrait être beaucoup de choses - et beaucoup de serveurs d'applications et d'autres "wrappers" java sont enclins à jouer avec les propriétés et leur "propre" prise sur les porte-clés et ce qui n'est pas. Donc, il peut regarder quelque chose de totalement différent.

À court de treillis-j'essaierais:

java -Djavax.net.debug=all -Djavax.net.ssl.trustStore=trustStore ...

Pour voir si cela aide. Au lieu de "tout", on peut également le définir sur "ssl", key manager et trust manager - ce qui peut vous aider dans votre cas. Le définir sur "aide" listera quelque chose comme ci-dessous sur la plupart plate.

Indépendamment - assurez - vous de bien comprendre la différence entre le magasin de clés (dans lequel vous avez la clé privée et le certificat avec lequel vous prouvez votre propre identité) et le magasin de confiance (qui détermine à qui vous avez confiance) - et le fait que votre propre identité a également une "chaîne" de confiance à la racine-qui est distincte de toute chaîne à une racine dont vous avez besoin pour déterminer " qui " vous avez confiance.

all            turn on all debugging
ssl            turn on ssl debugging

The   following can be used with ssl:
    record       enable per-record tracing
    handshake    print each handshake message
    keygen       print key generation data
    session      print session activity
    defaultctx   print default SSL initialization
    sslctx       print SSLContext tracing
    sessioncache print session cache tracing
    keymanager   print key manager tracing
    trustmanager print trust manager tracing
    pluggability print pluggability tracing

    handshake debugging can be widened with:
    data         hex dump of each handshake message
    verbose      verbose handshake message printing

    record debugging can be widened with:
    plaintext    hex dump of record plaintext
    packet       print raw SSL/TLS packets

Source: # Voir http://download.oracle.com/javase/1.5.0/docs/guide/security/jsse/JSSERefGuide.html#Debug

 113
Author: Dirk-Willem van Gulik, 2012-10-31 07:09:42

Voici la solution , suivez le lien ci-dessous étape par Étape :

Http://www.mkyong.com/webservices/jax-ws/suncertpathbuilderexception-unable-to-find-valid-certification-path-to-requested-target/

FICHIER JAVA: qui manque dans le blog

/*
 * 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.
 */



import java.io.*;
import java.net.URL;

import java.security.*;
import java.security.cert.*;

import javax.net.ssl.*;

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 <host>[: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);
    }
    }

}
 17
Author: user6258309, 2016-04-26 20:08:16

Vous devez configurer les propriétés du système JSSE, en pointant spécifiquement vers le magasin de certificats client.

Via la ligne de commande:

java -Djavax.net.ssl.trustStore=truststores/client.ts com.progress.Client

Ou via le code Java:

import java.util.Properties;
    ...
    Properties systemProps = System.getProperties();
    systemProps.put("javax.net.ssl.keyStorePassword","passwordForKeystore");
    systemProps.put("javax.net.ssl.keyStore","pathToKeystore.ks");
    systemProps.put("javax.net.ssl.trustStore", "pathToTruststore.ts");
    systemProps.put("javax.net.ssl.trustStorePassword","passwordForTrustStore");
    System.setProperties(systemProps);
    ...

Pour plus de détails, reportez-vous à RedHat site.

 11
Author: Vic, 2016-04-29 08:52:31

J'ai eu le même problème avec sbt.
Il a essayé de récupérer les dépendances de repo1.maven.org {[5] } sur ssl
mais a déclaré qu'il était "incapable de trouver le chemin de certification valide vers l'URL cible demandée".
j'ai donc suivi ce post et toujours pas de vérifier une connexion.
J'ai donc lu à ce sujet et j'ai constaté que le certificat racine ne suffisait pas, comme cela a été suggéré par le post, donc -
la chose qui a fonctionné pour moi était d'importer les certificats CA intermédiaires dans le keystore .
En fait, j'ai ajouté tous les certificats de la chaîne et cela a fonctionné comme un charme.

 3
Author: Danny Mor, 2017-04-25 07:33:28

(republier à partir de mon autre réponse )
Utilisez l'utilitaire clikeytool à partir de la distribution de logiciels java pour l'importation (et trust!) certificats nécessaires

Échantillon:

  1. De cli changer dir à jre \ bin

  2. Vérifier keystore (fichier trouvé dans le répertoire jre\bin)
    keytool-liste-keystore ..\lib \ sécurité \ cacerts
    Le mot de passe est changeit

  3. Téléchargez et enregistrez tous les certificats dans la chaîne de nécessaire serveur.

  4. Ajouter des certificats (avant de devoir supprimer l'attribut "lecture seule" sur le fichier"..\lib \ security \ cacerts"), exécuter: keytool-alias REPLACE_TO_ANY_UNIQ_NAME-import-keystore ..\lib \ security \ cacerts-fichier "r:\root.crt "

Accidentellement j'ai trouvé une astuce simple. D'autres solutions nécessitent l'utilisation d'InstallCert.Java et JDK

Source: http://www.java-samples.com/showtutorial.php?tutorialid=210

 2
Author: Алексей Присяжный, 2018-04-17 07:21:33

Mon problème était qu'un courtier en sécurité d'accès au Cloud, NetSkope, a été installé sur mon ordinateur portable de travail via une mise à jour logicielle. Cela modifiait la chaîne de certificats et je n'étais toujours pas en mesure de me connecter au serveur via mon client java après avoir importé toute la chaîne dans mon magasin de clés cacerts. J'ai désactivé NetSkope et j'ai pu me connecter avec succès.

 0
Author: gary69, 2017-10-17 01:39:50

Je travaille sur un tutoriel pour les services Web REST à www.udemy.com (REST Java Web Services). L'exemple du tutoriel dit que pour avoir SSL, nous devons avoir un dossier appelé "trust_store" dans mon projet eclipse "client" qui devrait contenir un fichier "key store" (nous avions un projet "client" pour appeler le service, et un projet "service" qui contenait le service Web REST - 2 projets dans le même espace de travail eclipse, l'un le client, l'autre le service). Pour garder les choses simples, ils ont dit pour copier " keystore.jks " du serveur d'applications glassfish (glassfish\domains\domain1\config\keystore.jsk) nous l'utilisons et le mettons dans ce dossier "trust_store" qu'ils m'ont fait faire dans le projet client. Cela semble logique: les certificats auto-signés dans le key_store du serveur correspondraient aux certificats dans le client trust_store. Maintenant, en faisant cela, je recevais l'erreur mentionnée dans le message d'origine. J'ai googlé ceci et lu que l'erreur est due au "keystore.jks" fichier sur le client ne contenant pas de certificat approuvé / signé, que le certificat qu'il trouve est auto-signé.

Pour garder les choses claires, permettez-moi de dire que si je comprends bien, le "keystore.jsk " contient des certificats auto-signés, et les "cacerts.le fichier " jks " contient des certificats CA (signés par l'autorité de certification). Le "fichier de clés.jks "est le" keystore "et les" cacerts.jks" est le "magasin de confiance". Comme "Bruno", un commentateur, dit ci-dessus, " keystore.jks "est local, et" cacerts.jks" est pour les clients distants.

Donc, j'ai dit à moi-même, hé, glassfish a aussi les " cacerts.jks", qui est le fichier trust_store de glassfish. le fichier cacerts.jsk est censé contenir des certificats CA. Et apparemment, j'ai besoin que mon dossier trust_store contienne un fichier de magasin de clés contenant au moins un certificat CA. Alors, j'ai essayé de mettre les " cacerts.fichier" jks "dans le dossier" trust_store "que j'avais créé, sur mon projet client, et en changeant les propriétés de la machine virtuelle pour pointer vers" cacerts.jks "au lieu de" keystore.jks". Que se débarrasser de l'erreur. Je suppose qu'il manquait un CA cert au travail.

Cela peut ne pas être idéal pour la production, ou même pour le développement au-delà du simple fait de faire fonctionner quelque chose. Par exemple, vous pouvez probablement utiliser la commande " keytool "pour ajouter des certificats CA au" keystore.fichier" jks " dans le client. Mais de toute façon, espérons que cela réduit au moins les scénarios possibles qui pourraient se passer ici pour provoquer l'erreur.

AUSSI: mon approche semblait être utile pour le client( certificat de serveur ajouté au client trust_store), il ressemble au les commentaires ci-dessus pour résoudre le message d'origine sont utiles pour le serveur (certificat client ajouté au serveur trust_store). Acclamation.

Configuration du projet Eclipse:

  • MyClientProject
  • src
  • test
  • Bibliothèque système JRE
  • ...
  • trust_store
    ---le fichier cacerts.jks --- keystore.jks

Extrait de MyClientProject.fichier java:

static {
  // Setup the trustStore location and password
  System.setProperty("javax.net.ssl.trustStore","trust_store/cacerts.jks");
  // comment out below line
  System.setProperty("javax.net.ssl.trustStore","trust_store/keystore.jks");
  System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
  //System.setProperty("javax.net.debug", "all");

  // for localhost testing only
  javax.net.ssl.HttpsURLConnection.setDefaultHostnameVerifier(new javax.net.ssl.HostnameVerifier() {
        public boolean verify(String hostname, javax.net.ssl.SSLSession sslSession) {
          return hostname.equals("localhost");
        }

  });
}
 0
Author: Steve T, 2017-11-19 21:16:43

Vérifier si le fichier $JAVA_HOME/lib/security/cacerts existe! Dans mon cas, ce n'était pas un fichier mais un lien vers /etc/ssl/certs/java/cacerts et c'était aussi un lien vers lui-même (QUOI???) donc, à cause de cela, JVM ne peut pas trouver le fichier.

Solution: Copiez le vrai fichier cacerts (vous pouvez le faire à partir d'un autre JDK) dans le répertoire /etc/ssl/certs/java/ et cela résoudra votre problème:)

 0
Author: 0x7E1, 2018-09-05 13:03:12

Disons si vous utilisez des variables classpath comme {{JAVA_HOME} dans pom.XML.

<target>
                    <property name="compile_classpath" refid="maven.compile.classpath"/>
                    <property name="runtime_classpath" refid="maven.runtime.classpath"/>
                    <property name="test_classpath" refid="maven.test.classpath"/>
                    <property name="plugin_classpath" refid="maven.plugin.classpath"/>
                    <property name="jaxb-api.jar" value="${maven.dependency.javax.xml.bind.jaxb-api.jar.path}"/>
                    <property name="project_home" value="${PROJECT_HOME}"/>
                    <property name="java_home" value="${JAVA_HOME}"/>
                    <property name="ant_home" value="${ANT_HOME}"/>
                    <property name="common_home" value="${COMMON_HOME}"/>
                    <property name="JAXP_HOME" value="${common_home}/lib"/>
                    <property name="ejfw_home" value="${PROJECT_HOME}/lib"/>
                    <property name="weblogic_home" value="${WL_HOME}"/>
                    <property name="fw_home" value="${FW_HOME}"/>
                    <property name="env" value="${BUILDENV}"/>
                    <property name="tokenfile" value="${BUILDENV}${BUILDENV_S2S}.properties"/>

Sur les objectifs, ajoutez les variables classpath. c'est à dire.., -DANT_HOME, - DJAVA_HOME

clean install -e -DPROJECT_HOME=..... -DANT_HOME=C:\bea1036\modules\org.apache.ant_1.7.1 -DJAVA_HOME=C:\bea1036\jdk160_31
 -3
Author: jayakar jayaraman, 2016-11-17 20:24:47