Java: sun.sécurité.Fournisseur.certpath.SunCertPathBuilderException: impossible de trouver un chemin de certification valide pour la cible demandée

j'ai une classe qui va télécharger un fichier à partir d'un serveur https . Quand je le lance, il renvoie beaucoup d'erreurs. Il semble que j'ai un problème avec mon certificat. Est-il possible d'ignorer l'authentification client-serveur? Si oui, comment?

package com.da;

import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.CharBuffer;
import java.util.concurrent.Future;

import org.apache.http.HttpResponse;
import org.apache.http.client.utils.URIUtils;
import org.apache.http.impl.nio.client.DefaultHttpAsyncClient;
import org.apache.http.nio.IOControl;
import org.apache.http.nio.client.HttpAsyncClient;
import org.apache.http.nio.client.methods.AsyncCharConsumer;
import org.apache.http.nio.client.methods.HttpAsyncGet;
import org.apache.http.nio.client.methods.HttpAsyncPost;

public class RSDDownloadFile {
    static FileOutputStream fos;

    public void DownloadFile(String URI, String Request) throws Exception
    {
        java.net.URI uri = URIUtils.createURI("https", "176.66.3.69:6443", -1, "download.aspx",
                "Lang=EN&AuthToken=package", null);
        System.out.println("URI Query: " + uri.toString());

        HttpAsyncClient httpclient = new DefaultHttpAsyncClient();
        httpclient.start();
        try {
            Future<Boolean> future = httpclient.execute(
                    new HttpAsyncGet(uri),
                    new ResponseCallback(), null);

            Boolean result = future.get();
            if (result != null && result.booleanValue()) {
                System.out.println("nRequest successfully executed");
            } else {
                System.out.println("Request failed");
            }              
        } 
        catch(Exception e){
            System.out.println("[DownloadFile] Exception: " + e.getMessage());
        }
        finally {
            System.out.println("Shutting down");
            httpclient.shutdown();
        }
        System.out.println("Done");  

    }

    static class ResponseCallback extends AsyncCharConsumer<Boolean> {

        @Override
        protected void onResponseReceived(final HttpResponse response) {
             System.out.println("Response: " + response.getStatusLine());
             System.out.println("Header: " + response.toString());
             try {   
                 //if(response.getStatusLine().getStatusCode()==200)
                     fos = new FileOutputStream( "Response.html" );
             }catch(Exception e){
                 System.out.println("[onResponseReceived] Exception: " + e.getMessage());
             }
        }

        @Override
        protected void onCharReceived(final CharBuffer buf, final IOControl ioctrl) throws IOException {
            try
            {
                while (buf.hasRemaining()) 
                {
                    //System.out.print(buf.get());
                    fos.write(buf.get());
                }
            }catch(Exception e)
            {
                System.out.println("[onCharReceived] Exception: " + e.getMessage());
            }
        }

        @Override
        protected void onCleanup() {
            try
            {             
                if(fos!=null)
                    fos.close();
            }catch(Exception e){
                System.out.println("[onCleanup] Exception: " + e.getMessage());         
            }
             System.out.println("onCleanup()");
        }

        @Override
        protected Boolean buildResult() {
            return Boolean.TRUE;
        }

    }
}

erreurs:

URI Query: https://176.66.3.69:6443/download.aspx?Lang=EN&AuthToken=package
Aug 2, 2011 3:47:57 PM org.apache.http.impl.nio.client.NHttpClientProtocolHandler exception
SEVERE: I/O error: General SSLEngine problem
javax.net.ssl.SSLHandshakeException: General SSLEngine problem
    at com.sun.net.ssl.internal.ssl.Handshaker.checkThrown(Unknown Source)
    at com.sun.net.ssl.internal.ssl.SSLEngineImpl.checkTaskThrown(Unknown Source)
    at com.sun.net.ssl.internal.ssl.SSLEngineImpl.writeAppRecord(Unknown Source)
    at com.sun.net.ssl.internal.ssl.SSLEngineImpl.wrap(Unknown Source)
    at javax.net.ssl.SSLEngine.wrap(Unknown Source)
    at org.apache.http.impl.nio.reactor.SSLIOSession.doHandshake(SSLIOSession.java:154)
    at org.apache.http.impl.nio.reactor.SSLIOSession.isAppInputReady(SSLIOSession.java:276)
    at org.apache.http.impl.nio.client.InternalClientEventDispatch.inputReady(InternalClientEventDispatch.java:79)
    at org.apache.http.impl.nio.reactor.BaseIOReactor.readable(BaseIOReactor.java:161)
    at org.apache.http.impl.nio.reactor.AbstractIOReactor.processEvent(AbstractIOReactor.java:335)
    at org.apache.http.impl.nio.reactor.AbstractIOReactor.processEvents(AbstractIOReactor.java:315)
    at org.apache.http.impl.nio.reactor.AbstractIOReactor.execute(AbstractIOReactor.java:275)
    at org.apache.http.impl.nio.reactor.BaseIOReactor.execute(BaseIOReactor.java:104)
    at org.apache.http.impl.nio.reactor.AbstractMultiworkerIOReactor$Worker.run(AbstractMultiworkerIOReactor.java:542)
    at java.lang.Thread.run(Unknown Source)
Caused by: javax.net.ssl.SSLHandshakeException: General SSLEngine problem
    at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Unknown Source)
    at com.sun.net.ssl.internal.ssl.SSLEngineImpl.fatal(Unknown Source)
    at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Unknown Source)
    at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Unknown Source)
    at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(Unknown Source)
    at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(Unknown Source)
    at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Unknown Source)
    at com.sun.net.ssl.internal.ssl.Handshaker.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.net.ssl.internal.ssl.Handshaker$DelegatedTask.run(Unknown Source)
    at org.apache.http.impl.nio.reactor.SSLIOSession.doHandshake(SSLIOSession.java:180)
    ... 9 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 com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(Unknown Source)
    at com.sun.net.ssl.internal.ssl.JsseX509TrustManager.checkServerTrusted(Unknown Source)
    ... 16 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)
    ... 21 more
onCleanup()

[DownloadFile] Exception: javax.net.ssl.SSLHandshakeException: General SSLEngine problem
Shutting down
Done
168
demandé sur ROMANIA_engineer 0000-00-00 00:00:00

20 réponses

le problème apparaît lorsque votre serveur possède un certificat auto-signé. Pour contourner cela, vous pouvez ajouter ce certificat à la liste des certificats de confiance de votre JVM.

Dans cet article , l'auteur décrit comment récupérer le certificat à partir de votre navigateur et l'ajouter au fichier cacerts de votre JVM. Vous pouvez éditer le fichier JAVA_HOME/jre/lib/security/cacerts ou exécuter votre application avec le paramètre -Djavax.net.ssl.trustStore . Vérifiez quel JDK / JRE vous utilisez aussi car c'est souvent un source de confusion.

Voir aussi: comment les noms de serveurs de certificats SSL sont-ils résolus/puis-je ajouter des noms alternatifs en utilisant keytool? si vous rencontrez l'exception java.security.cert.CertificateException: No name matching localhost found .

158
répondu Maxim Mazin 2017-05-23 12:26:38

voici ce qui fonctionne pour moi sur macOS. Assurez-vous de remplacer example.com et 443 avec le nom d'hôte et le port réels que vous essayez de vous connecter, et donner un alias personnalisé. La première commande télécharge le certificat fourni à partir du serveur distant et le sauvegarde localement au format x509. La deuxième commande charge le certificat sauvegardé dans le magasin de confiance SSL de Java.

openssl x509 -in <(openssl s_client -connect example.com:443 -prexit 2>/dev/null) -out ~/example.crt
sudo keytool -importcert -file ~/example.crt -alias example -keystore $(/usr/libexec/java_home)/jre/lib/security/cacerts -storepass changeit
113
répondu Gabe Martin-Dempesy 2017-03-14 19:14:40

j'ai eu le même problème avec un certificat de Joker signé valide de symantec.

essayez D'abord d'exécuter votre application java avec - Djavax.net.debug=SSL pour voir ce qui se passe réellement.

j'ai fini par importation du certificat intermédiaire ce qui a causé la rupture de la chaîne cert.

j'ai téléchargé les données manquantes certificat intermédiaire de symantec (vous pouvez voir le lien de téléchargement vers le certificat manquant dans le journal des poignées de main ssl: http://svrintl-g3-aia.verisign.com/SVRIntlG3.cer dans mon cas).

et j'ai importé le cert dans le Java keystore. Après avoir importé le certificat intermédiaire, mon Joker ssl cert a finalement commencé à fonctionner:

keytool -import -keystore ../jre/lib/security/cacerts -trustcacerts -alias "VeriSign Class 3 International Server CA - G3" -file /pathto/SVRIntlG3.cer
34
répondu Stephan Oudmaijer 2014-03-14 13:51:59
  1. exporter le certificat SSL en utilisant Firefox. Vous pouvez exporter en tapant l'URL dans le navigateur, puis sélectionnez l'option exporter le certificat. Supposons que le nom du fichier cert est votre.ssl.serveur.nom.crt
  2. allez à votre JRE_HOME/bin ou JDK/JRE/bin
  3. tapez la commande
  4. keytool -keystore ..\lib\security\cacerts -import -alias your.ssl.server.name -file .\relative-path-to-cert-file\your.ssl.server.name.crt
  5. redémarrer votre processus Java
24
répondu Robin 2015-09-29 15:45:41

citation de No more "impossible de trouver un chemin de certification valide pour la cible demandée"

lorsqu'on essaie d'ouvrir une connexion SSL à un hôte en utilisant JSSE. Cela signifie généralement que le serveur utilise un certificat d'essai (éventuellement généré à l'aide de keytool) plutôt qu'un certificat d'une autorité de Certification commerciale bien connue comme Verisign ou GoDaddy. Navigateurs web afficher les dialogues d'avertissement dans ce cas, mais comme JSSE ne peut pas supposer qu'un utilisateur interactif est présent, il lance simplement une exception par défaut.

la validation du certificat est une partie très importante de la sécurité SSL, mais je n'écris pas cette entrée pour expliquer les détails. Si vous êtes intéressé, vous pouvez commencer par lire le flou Wikipédia. J'écris cette entrée pour montrer une façon simple de parler à cet hôte avec le certificat de test, si vous voulez vraiment.

en gros, vous voulez ajouter le certificat du serveur sur le KeyStore avec vos certificats de confiance

essayez le code fourni. Cela pourrait aider.

16
répondu Nishant 2011-08-02 08:09:04

la réponse de @Gabe Martin-Dempsy m'est aidée. Et j'ai écrit un petit script à ce sujet. L'utilisation est très simple.

installer un certificat de l'hôte:

> sudo ./java-cert-importer.sh example.com

supprimer le certificat déjà installé.

> sudo ./java-cert-importer.sh example.com --delete

java-cert-importer.sh

#!/usr/bin/env bash

# Exit on error
set -e

# Ensure script is running as root
if [ "$EUID" -ne 0 ]
  then echo "WARN: Please run as root (sudo)"
  exit 1
fi

# Check required commands
command -v openssl >/dev/null 2>&1 || { echo "Required command 'openssl' not installed. Aborting." >&2; exit 1; }
command -v keytool >/dev/null 2>&1 || { echo "Required command 'keytool' not installed. Aborting." >&2; exit 1; }

# Get command line args
host=; port=${2:-443}; deleteCmd=${3:-}

# Check host argument
if [ ! ${host} ]; then
cat << EOF
Please enter required parameter(s)

usage:  ./java-cert-importer.sh <host> [ <port> | default=443 ] [ -d | --delete ]

EOF
exit 1
fi;

if [ "$JAVA_HOME" ]; then
    javahome=${JAVA_HOME}
elif [[ "$OSTYPE" == "linux-gnu" ]]; then # Linux
    javahome=$(readlink -f $(which java) | sed "s:bin/java::")
elif [[ "$OSTYPE" == "darwin"* ]]; then # Mac OS X
    javahome="$(/usr/libexec/java_home)/jre"
fi

if [ ! "$javahome" ]; then
    echo "WARN: Java home cannot be found."
    exit 1
elif [ ! -d "$javahome" ]; then
    echo "WARN: Detected Java home does not exists: $javahome"
    exit 1
fi

echo "Detected Java Home: $javahome"

# Set cacerts file path
cacertspath=${javahome}/lib/security/cacerts
cacertsbackup="${cacertspath}.$$.backup"

if ( [ "$deleteCmd" == "-d" ] || [ "$deleteCmd" == "--delete" ] ); then
    sudo keytool -delete -alias ${host} -keystore ${cacertspath} -storepass changeit
    echo "Certificate is deleted for ${host}"
    exit 0
fi

# Get host info from user
#read -p "Enter server host (E.g. example.com) : " host
#read -p "Enter server port (Default 443) : " port

# create temp file
tmpfile="/tmp/${host}.$$.crt"

# Create java cacerts backup file
cp ${cacertspath} ${cacertsbackup}

echo "Java CaCerts Backup: ${cacertsbackup}"

# Get certificate from speficied host
openssl x509 -in <(openssl s_client -connect ${host}:${port} -prexit 2>/dev/null) -out ${tmpfile}

# Import certificate into java cacerts file
sudo keytool -importcert -file ${tmpfile} -alias ${host} -keystore ${cacertspath} -storepass changeit

# Remove temp certificate file
rm ${tmpfile}

# Check certificate alias name (same with host) that imported successfully
result=$(keytool -list -v -keystore ${cacertspath} -storepass changeit | grep "Alias name: ${host}")

# Show results to user
if [ "$result" ]; then
    echo "Success: Certificate is imported to java cacerts for ${host}";
else
    echo "Error: Something went wrong";
fi;
14
répondu bhdrk 2015-06-30 08:25:02

j'ai été capable de le faire fonctionner avec le code seulement, c.-à-d. pas besoin d'utiliser keytool:

import com.netflix.config.DynamicBooleanProperty;
import com.netflix.config.DynamicIntProperty;
import com.netflix.config.DynamicPropertyFactory;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.config.Registry;
import org.apache.http.config.RegistryBuilder;
import org.apache.http.conn.ssl.SSLContexts;
import org.apache.http.conn.ssl.TrustStrategy;
import org.apache.http.conn.ssl.X509HostnameVerifier;
import org.apache.http.impl.nio.client.CloseableHttpAsyncClient;
import org.apache.http.impl.nio.client.HttpAsyncClients;
import org.apache.http.impl.nio.conn.PoolingNHttpClientConnectionManager;
import org.apache.http.impl.nio.reactor.DefaultConnectingIOReactor;
import org.apache.http.impl.nio.reactor.IOReactorConfig;
import org.apache.http.nio.conn.NoopIOSessionStrategy;
import org.apache.http.nio.conn.SchemeIOSessionStrategy;
import org.apache.http.nio.conn.ssl.SSLIOSessionStrategy;

import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLException;
import javax.net.ssl.SSLSession;
import javax.net.ssl.SSLSocket;
import java.io.IOException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

public class Test
{
    private static final DynamicIntProperty MAX_TOTAL_CONNECTIONS = DynamicPropertyFactory.getInstance().getIntProperty("X.total.connections", 40);
    private static final DynamicIntProperty ROUTE_CONNECTIONS = DynamicPropertyFactory.getInstance().getIntProperty("X.total.connections", 40);
    private static final DynamicIntProperty CONNECT_TIMEOUT = DynamicPropertyFactory.getInstance().getIntProperty("X.connect.timeout", 60000);
    private static final DynamicIntProperty SOCKET_TIMEOUT = DynamicPropertyFactory.getInstance().getIntProperty("X.socket.timeout", -1);
    private static final DynamicIntProperty CONNECTION_REQUEST_TIMEOUT = DynamicPropertyFactory.getInstance().getIntProperty("X.connectionrequest.timeout", 60000);
    private static final DynamicBooleanProperty STALE_CONNECTION_CHECK = DynamicPropertyFactory.getInstance().getBooleanProperty("X.checkconnection", true);

    public static void main(String[] args) throws Exception
    {

        SSLContext sslcontext = SSLContexts.custom()
                .useTLS()
                .loadTrustMaterial(null, new TrustStrategy()
                {
                    @Override
                    public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException
                    {
                        return true;
                    }
                })
                .build();
        SSLIOSessionStrategy sslSessionStrategy = new SSLIOSessionStrategy(sslcontext, new AllowAll());

        Registry<SchemeIOSessionStrategy> sessionStrategyRegistry = RegistryBuilder.<SchemeIOSessionStrategy>create()
                .register("http", NoopIOSessionStrategy.INSTANCE)
                .register("https", sslSessionStrategy)
                .build();

        DefaultConnectingIOReactor ioReactor = new DefaultConnectingIOReactor(IOReactorConfig.DEFAULT);
        PoolingNHttpClientConnectionManager connectionManager = new PoolingNHttpClientConnectionManager(ioReactor, sessionStrategyRegistry);
        connectionManager.setMaxTotal(MAX_TOTAL_CONNECTIONS.get());
        connectionManager.setDefaultMaxPerRoute(ROUTE_CONNECTIONS.get());

        RequestConfig requestConfig = RequestConfig.custom()
                .setSocketTimeout(SOCKET_TIMEOUT.get())
                .setConnectTimeout(CONNECT_TIMEOUT.get())
                .setConnectionRequestTimeout(CONNECTION_REQUEST_TIMEOUT.get())
                .setStaleConnectionCheckEnabled(STALE_CONNECTION_CHECK.get())
                .build();

        CloseableHttpAsyncClient httpClient = HttpAsyncClients.custom()
                .setSSLStrategy(sslSessionStrategy)
                .setConnectionManager(connectionManager)
                .setDefaultRequestConfig(requestConfig)
                .build();

        httpClient.start();

        // use httpClient...
    }

    private static class AllowAll implements X509HostnameVerifier
    {
        @Override
        public void verify(String s, SSLSocket sslSocket) throws IOException
        {}

        @Override
        public void verify(String s, X509Certificate x509Certificate) throws SSLException {}

        @Override
        public void verify(String s, String[] strings, String[] strings2) throws SSLException
        {}

        @Override
        public boolean verify(String s, SSLSession sslSession)
        {
            return true;
        }
    }
}
6
répondu Jonas Bergström 2014-08-04 11:45:40

pour ceux qui aiment Debian et Java préemballé:

sudo mkdir /usr/share/ca-certificates/test/  # don't mess with other certs
sudo cp ~/tmp/test.loc.crt /usr/share/ca-certificates/test/
sudo dpkg-reconfigure --force ca-certificates  # check your cert in curses GUI!
sudo update-ca-certificates --fresh --verbose

N'oubliez pas de cocher /etc/default/cacerts pour:

# enable/disable updates of the keystore /etc/ssl/certs/java/cacerts
cacerts_updates=yes

pour supprimer cert:

sudo rm /usr/share/ca-certificates/test/test.loc.crt
sudo rm /etc/ssl/certs/java/cacerts
sudo update-ca-certificates --fresh --verbose
4
répondu gavenkoa 2014-07-18 07:29:02

la source de cette erreur sur mon instance Apache 2.4 (en utilisant un joker Comodo) était un chemin incomplet vers le certificat racine signé SHA-1. Il y avait plusieurs chaînes dans le certificat délivré, et la chaîne menant à un certificat de racine SHA-1 manquait un certificat intermédiaire . Les navigateurs modernes savent comment gérer cela, mais Java 7 ne le gère pas par défaut (bien qu'il y ait quelques façons alambiquées de le faire en code). Résultat les messages d'erreur sont-ils identiques au cas des certificats auto-signés:

Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:196)
    at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:268)
    at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:380)
    ... 22 more

dans ce cas, le message" chemin de certification Impossible à trouver valide vers la cible demandée " est produit en raison de l'absence du certificat intermédiaire. Vous pouvez vérifier quel certificat est manquant en utilisant SSL Labs test contre le serveur. Une fois que vous avez trouvé le certificat approprié, téléchargez-le et (si le serveur est sous votre contrôle) ajoutez-le ensemble de certificats. Vous pouvez aussi importer le certificat manquant localement. Résoudre ce problème sur le serveur est une solution plus générale au problème.

4
répondu vallismortis 2015-06-15 23:07:46

cela peut également être causé en utilisant GoDaddy certs avec Java 7 qui sont signés en utilisant SHA2.

Chrome et tous les autres navigateurs commencent à déprécier les certificats SSL qui sont signés en utilisant SHA1, car ce n'est pas aussi sûr.

plus d'informations sur la question peut être trouvé ici , ainsi que la façon de résoudre sur votre serveur si vous avez besoin de Maintenant.

2
répondu Brad Parks 2015-04-16 17:14:43

mise à JOUR: Qu'un redémarrage a aidé a été fortuite (j'espère donc, hourra!). La vraie cause du problème était ceci: quand Gradle est dirigé à utiliser un keystore spécifique, ce keystore doit également contenir tous les certificats officiels de racine. Sinon, il ne peut pas accéder aux bibliothèques à partir de dépôts réguliers. Ce que je devais faire était ceci:

importer le certificat auto-signé:

keytool -import -trustcacerts -alias myselfsignedcert -file /Users/me/Desktop/selfsignedcert.crt -keystore ./privateKeystore.jks

ajouter la racine officielle certificats:

keytool -importkeystore -srckeystore <java-home>/lib/security/cacerts -destkeystore ./privateKeystore.jks

peut-être que le démon Gradle s'est aussi mis en travers. Ça pourrait valoir la peine de tuer tous les démons en cours d'exécution trouvés avec ./gradlew --status si les choses commencent à sembler mornes.

ORIGINAL POSTING:

personne ne le croira, je le sais. Encore, si tout le reste échoue, essayez-le: Après un redémarrage de mon Mac le problème était parti. Grrr.

Fond: ./gradlew pot gardé de me donner "impossible de trouver le chemin de certification valide pour demandé cible" le

je suis coincé avec un certificat auto-signé, sauvé du navigateur, importé dans privateKeystore.jks. Puis il a demandé à Gradle de travailler avec privateKeystore.jks:

org.gradle.jvmargs=-Djavax.net.debug=SSL -Djavax.net.ssl.trustStore="/Users/me/IntelliJ/myproject/privateKeystore.jks"  -Djavax.net.ssl.trustStorePassword=changeit

comme mentionné, cela n'a fonctionné qu'après un redémarrage.

2
répondu StaticNoiseLog 2017-02-14 15:51:27

Pour Windows seulement, suivez ces étapes:

  1. dans Chrome aller aux paramètres.
  2. Dans les Paramètres, cliquez sur afficher les paramètres avancés.
  3. sous HTTPS/SSL cliquez sur Gérer les certificats.
  4. Exportez Votre Certificat.
  5. dans les recherches Windows (appuyer sur la touche windows sur le clavier) tapez java.
  6. sélectionnez (Configurer Java) L'Option qui ouvrira le contrôle Java Panel
  7. sélectionnez onglet Sécurité dans le Panneau de configuration Java
  8. Sélectionner Gérer Les Certificats
  9. Cliquez Sur Importer
  10. sous l'onglet (utilisateur) sélectionné et le type de certificat as (certificats de confiance)
  11. cliquez sur le bouton Importer et naviguez pour télécharger le certificat et l'importer.
2
répondu Praveen 2018-01-07 14:07:57

j'ai eu le même problème avec l'erreur de certificats et c'était à cause de SNI, et le client http que j'ai utilisé n'a pas eu SNI implémenté. Donc une mise à jour de la version a fait l'affaire

   <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpclient</artifactId>
        <version>4.3.6</version>
    </dependency>
1
répondu Radu Toader 2015-10-26 06:55:06

vous avez deux options, Importer le certificat auto-signé dans le keystore de java pour chaque jvm que le logiciel exécutera ou essayer l'usine ssl non-validante:

jdbc:postgresql://myserver.com:5432/mydatabasename?ssl=true&sslfactory=org.postgresql.ssl.NonValidatingFactory
1
répondu Pradip Das 2016-04-21 03:45:09

AVG version 18.1.3044 (avec Windows 10) interférer avec mon application locale Spring.

Solution: entrez dans la section AVG appelée" Web et courriel "et désactivez la"protection courriel". AVG bloque le certificat si le site n'est pas sécurisé.

1
répondu Insoft 2018-02-23 07:24:14

Cela a résolu mon problème,

nous avons besoin d'importer le cert sur le java local. Si ce n'est pas le cas, nous pourrions obtenir l'exception ci-dessous.

    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(Alerts.java:192)
        at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1949)
        at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:302)

SSLPOKE est un outil permettant de tester la connectivité https depuis votre machine locale.

commande pour tester la connectivité:

"%JAVA_HOME%/bin/java" SSLPoke <hostname> 443
    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(PKIXValidator.java:387)
        at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:292)
        at sun.security.validator.Validator.validate(Validator.java:260)
        at sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:324)
        at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:229)
        at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:124)
        at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1496)
        at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:216)
        at sun.security.ssl.Handshaker.processLoop(Handshaker.java:1026)
        at sun.security.ssl.Handshaker.process_record(Handshaker.java:961)
        at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1062)
        at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1375)
        at sun.security.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.java:747)
        at sun.security.ssl.AppOutputStream.write(AppOutputStream.java:123)
        at sun.security.ssl.AppOutputStream.write(AppOutputStream.java:138)
        at SSLPoke.main(SSLPoke.java:31)
    Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to 
    requested target
        at sun.security.provider.certpath.SunCertPathBuilder.build(SunCertPathBuilder.java:141)
        at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:126)
        at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:280)
        at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:382)
        ... 15 more
keytool -import -alias brinternal -keystore "%JAVA_HOME%/jre/lib/security/cacerts" -file <cert path>

ce serait d'abord invite à " entrer le mot de passe keystore:" changeit est le mot de passe par défaut. et enfin une invite "faire Confiance à ce certificat? [Non]:", fournir " Oui " pour ajouter le cert à keystore.

verification:

C:\tools>"%JAVA_HOME%/bin/java" SSLPoke <hostname> 443
Successfully connected    
0
répondu Naveen 2018-07-09 10:43:47

dans mon cas, J'exécute MacOs High Sierra avec Java 1.6. Le fichier cacert est situé à un endroit différent de celui mentionné ci-dessus dans la réponse de Gabe Martin-Dempsy. Le fichier cacert était déjà relié à un autre site (/Library/Internet Plug-Ins/JavaAppletPlugin).plugin/Contents/Home/lib/security / cacerts).

en utilisant FireFox, j'ai exporté le certificat du site Web en question vers un fichier local appelé" exportdcertfile.CRT." De là, j'ai utilisé keytool pour déplacer le certificat dans le fichier cacert. Le problème est résolu.

bash-3.2# cd /Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/lib/security/
bash-3.2# keytool -importcert -file ~/exportedCertFile.crt -alias example -keystore cacerts -storepass changeit
0
répondu Alan Curtis 2018-07-17 20:26:34

téléchargez d'abord le certificat ssl puis vous pouvez aller sur votre chemin Java bin exécuter la commande ci-dessous dans la console.

C:\java\JDK1.8.0_66-X64\bin>keytool -printcert -file C:\Users\lova\openapi.cer -keystore openapistore
0
répondu Lova Chittumuri 2018-08-21 10:28:05

assurez-vous que le https://176.66.3.69:6443 / ont un certificat valide. vous pouvez le vérifier via le navigateur d'abord https not secure s'il fonctionne dans le navigateur, il fonctionnera en java.

qui travaille pour moi

0
répondu Amr Ibrahim Almgwary 2018-09-24 09:58:02

quand j'ai ce problème, je viens d'extraire le zip android studio dans le même vieux dossier, qui a résolu mon problème

-1
répondu Jacob George 2018-08-22 07:36:37