Comment résoudre l'erreur javax.net.ssl.SSLHandshakeException?


Je me suis connecté avec VPN pour configurer l'API d'inventaire pour obtenir la liste des produits et cela fonctionne bien. Une fois que j'obtiens le résultat du service Web et que je me lie à l'interface utilisateur. Et aussi j'ai intégré PayPal avec mon application pour faire Express checkout lorsque je fais un appel pour le paiement, je suis confronté à cette erreur. J'utilise servlet pour le processus back-end. Peut-on dire comment résoudre ce problème?

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
Author: javanna, 2011-07-12

6 answers

Vous devez d'abord obtenir le certificat public du serveur auquel vous essayez de vous connecter. Cela peut être fait de différentes manières, comme contacter l'administrateur du serveur et le demander, utiliser openssl pour le télécharger, ou, comme il semble s'agir d'un serveur HTTP, s'y connecter avec n'importe quel navigateur, afficher les informations de sécurité de la page et enregistrer une copie du certificat. (Google devrait être en mesure de vous dire exactement quoi faire pour votre navigateur.)

Maintenant que vous avez le certificat enregistré dans un fichier, vous devez l'ajouter au magasin de confiance de votre JVM. À $JAVA_HOME/jre/lib/security/ pour JREs ou $JAVA_HOME/lib/security pour JDKs, il y a un fichier nommé cacerts, qui vient avec Java et contient les certificats publics des autorités de certification bien connues. Pour importer le nouveau certificat, exécutez keytool en tant qu'utilisateur autorisé à écrire dans cacerts:

keytool -import -file <the cert file> -alias <some meaningful name> -keystore <path to cacerts file>

Il vous demandera probablement un mot de passe. Le mot de passe par défaut fourni avec java est changeit. Presque personne ne le change. Après avoir terminé ces étapes relativement simples, vous communiquerez en toute sécurité et avec l'assurance que vous parlez au bon serveur et uniquement au bon serveur (tant qu'ils ne perdent pas leur clé privée).

 117
Author: Ryan Stewart, 2015-02-12 18:47:01

Maintenant, j'ai résolu ce problème de cette façon,

import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import java.io.OutputStream; 

// Create a trust manager that does not validate certificate chains like the default 

TrustManager[] trustAllCerts = new TrustManager[]{
        new X509TrustManager() {

            public java.security.cert.X509Certificate[] getAcceptedIssuers()
            {
                return null;
            }
            public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType)
            {
                //No need to implement.
            }
            public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType)
            {
                //No need to implement.
            }
        }
};

// Install the all-trusting trust manager
try 
{
    SSLContext sc = SSLContext.getInstance("SSL");
    sc.init(null, trustAllCerts, new java.security.SecureRandom());
    HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
} 
catch (Exception e) 
{
    System.out.println(e);
}

Bien sûr, cette solution ne doit être utilisée que dans les scénarios, où il n'est pas possible d'installer les certificats requis en utilisant keytool, par exemple des tests locaux avec des certificats temporaires.

 15
Author: selladurai, 2017-10-24 08:20:38

Chaque fois que nous essayons de nous connecter à l'URL,

Si le serveur de l'autre site fonctionne sur le protocole https et exige que nous communiquions via les informations fournies dans le certificat, alors nous avons l'option suivante:

1) demandez le certificat(téléchargez le certificat), importez ce certificat dans trustore. Les utilisations par défaut de trustore java peuvent être trouvées dans \ Java \ jdk1.6. 0_29\jre \ lib \ security \ cacerts, alors si nous réessayons de nous connecter à la connexion URL serait accepter.

2) Dans des cas commerciaux normaux, nous pouvons nous connecter à des URL internes dans des organisations et nous savons qu'elles sont correctes. Dans de tels cas, vous avez confiance que c'est l'URL correcte, Dans de tels cas ci-dessus, le code peut être utilisé qui ne mandate pas de stocker le certificat pour se connecter à une URL particulière.

Pour le point n ° 2, nous devons suivre les étapes ci-dessous :

1) écrivez ci-dessous la méthode qui définit HostnameVerifier pour HttpsURLConnection qui renvoie true pour tous les cas, nous faisons confiance au trustStore.

  // trusting all certificate 
 public void doTrustToCertificates() throws Exception {
        Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
        TrustManager[] trustAllCerts = new TrustManager[]{
                new X509TrustManager() {
                    public X509Certificate[] getAcceptedIssuers() {
                        return null;
                    }

                    public void checkServerTrusted(X509Certificate[] certs, String authType) throws CertificateException {
                        return;
                    }

                    public void checkClientTrusted(X509Certificate[] certs, String authType) throws CertificateException {
                        return;
                    }
                }
        };

        SSLContext sc = SSLContext.getInstance("SSL");
        sc.init(null, trustAllCerts, new SecureRandom());
        HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
        HostnameVerifier hv = new HostnameVerifier() {
            public boolean verify(String urlHostName, SSLSession session) {
                if (!urlHostName.equalsIgnoreCase(session.getPeerHost())) {
                    System.out.println("Warning: URL host '" + urlHostName + "' is different to SSLSession host '" + session.getPeerHost() + "'.");
                }
                return true;
            }
        };
        HttpsURLConnection.setDefaultHostnameVerifier(hv);
    }

2) écrivez ci-dessous la méthode, qui appelle doTrustToCertificates avant d'essayer de se connecter à l'URL

    // connecting to URL
    public void connectToUrl(){
     doTrustToCertificates();//  
     URL url = new URL("https://www.example.com");
     HttpURLConnection conn = (HttpURLConnection)url.openConnection(); 
     System.out.println("ResponseCode ="+conn.getResponseCode());
   }

Cet appel renverra le code de réponse = 200 signifie que la connexion est réussie.

Pour plus de détails et un exemple d'exemple, vous pouvez vous référer à URL.

 10
Author: Shirishkumar Bari, 2017-08-24 12:46:52

Je crois que vous essayez de vous connecter à quelque chose en utilisant SSL mais que quelque chose fournit un certificat qui n'est pas vérifié par les autorités de certification racine telles que verisign.. En substance, par défaut, les connexions sécurisées ne peuvent être établies que si la personne essayant de se connecter connaît les clés des contreparties ou si un autre verndor tel que verisign peut intervenir et dire que la clé publique fournie est en effet correcte..

TOUS les OS font confiance à une poignée d'autorités de certification et les plus petits émetteurs de certificats doivent être certifiés par l'un des grands certificateurs faisant une chaîne de certificateurs si vous obtenez ce que je veux dire...

De toute façon revenir au point.. J'ai eu un problème similaire lors de la programmation d'une applet java et d'un serveur java (j'espère qu'un jour j'écrirai un article de blog complet sur la façon dont j'ai fait fonctionner toute la sécurité:))

En substance, ce que je devais faire était d'extraire les clés publiques du serveur et de les stocker dans un magasin de clés à l'intérieur de mon applet et quand Je me suis connecté au serveur J'ai utilisé ce magasin de clés pour créer une usine de confiance et cette usine de confiance pour créer la connexion ssl. Il existe également des procédures alterante telles que l'ajout de la clé à l'hôte de confiance de la JVM et la modification du magasin de confiance par défaut au démarrage..

Je l'ai fait il y a environ deux mois et je n'ai pas de code source sur moi en ce moment.. utiliser google et vous devriez être en mesure de résoudre ce problème. Si vous ne pouvez pas me renvoyer un message et je peux vous fournir le code source pertinent pour le projet .. Ne savez pas si cela résout votre problème puisque vous n'avez pas fourni le code qui provoque ces exceptions. De plus, je travaillais avec des applets, je ne voyais pas pourquoi cela ne fonctionnerait pas sur les Serverlets...

Ps Je ne peux pas obtenir le code source avant le week-end car le SSH externe est désactivé dans mon bureau : (

 0
Author: Osama Javed, 2011-07-14 17:53:36

SSLHandshakeException peut être résolu de 2 façons.

  1. Incorporant SSL

    • Obtenez le SSL (en demandant à l'administrateur système source, vous pouvez également être téléchargé par la commande openssl, ou tout navigateur télécharge le certificats)

    • Ajouter le certificat dans truststore (cacerts) situé à JRE / lib / sécurité

    • Fournir l'emplacement truststore dans les arguments de la machine virtuelle comme "- Djavax. net. ssl. trustStore="

  2. Ignorer SSL

    Pour ce #2, veuillez visiter mon autre réponse sur un autre site Web de stackoverflow: Comment créer une vérification SSLIgnorer les erreurs de certificat SSL avec Java

 0
Author: Amit Kaneria, 2017-05-23 12:18:20

Maintenant, j'ai résolu ce problème de cette façon,

import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import java.io.OutputStream;
// Create a trust manager that does not validate certificate chains like the 
default TrustManager[] trustAllCerts = new TrustManager[] {
    new X509TrustManager() {
        public java.security.cert.X509Certificate[] getAcceptedIssuers() {
            return null;
        }
        public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType) {
            //No need to implement. 
        }
        public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType) {
            //No need to implement. 
        }
    }
};
// Install the all-trusting trust manager
try {
    SSLContext sc = SSLContext.getInstance("SSL");
    sc.init(null, trustAllCerts, new java.security.SecureRandom());
    HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
} catch (Exception e) {
    System.out.println(e);
}
 -3
Author: Evelyn Condes, 2015-11-30 07:29:19