114 votes

Comment résoudre javax.net.le protocole ssl.SSLHandshakeException Erreur?

Je suis connecté avec le VPN pour l'installation de l'API de l'inventaire pour obtenir la liste des produits et il fonctionne très bien. Une fois que je reçois le résultat de la web-service, et je lier à l'INTERFACE utilisateur. Et aussi, j'ai intégré PayPal avec ma demande de faire Express checkout quand je fais un appel pour un paiement que je suis confronté à cette erreur. J'utilise servlet pour les processus de 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

166voto

Ryan Stewart Points 46960

D'abord, vous devez obtenir le certificat public du serveur auquel vous essayez de vous connecter. Qui peut être fait dans une variété de façons, comme en contactant l'administrateur du serveur et d'en faire la demande à l'aide d'openssl pour le télécharger, ou, puisque cela semble être un serveur HTTP, la connexion avec n'importe quel navigateur, l'affichage de la page d'informations de sécurité et d'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 à votre JVM du magasin de confiance. À $JAVA_HOME/jre/lib/security/ pour Jdk ou $JAVA_HOME/lib/security for Jre, il y a un fichier nommé le fichier cacerts, qui est livré avec Java et contient les certificats publics de la bien connue aux Autorités de Certification. Pour importer le nouveau cert, exécutez l'utilitaire keytool en tant qu'utilisateur qui a la permission d'écrire dans le fichier cacerts:

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

Il sera plus susceptible de vous demander un mot de passe. Le mot de passe par défaut livré avec java est "changeit". Presque personne ne le change. Après avoir effectué ces étapes relativement simples, vous serez à communiquer de manière sécurisée et avec l'assurance que vous parlez vers le bon serveur et seul le bon serveur (tant qu'ils ne perdent pas de leur clé privée).

19voto

selladurai Points 2318

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; 

// Création d'une fiducie, le gestionnaire qui n'a pas de valider le certificat, des chaînes comme la valeur par défaut

            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 entendu, cette solution doit être utilisée uniquement dans des situations où il n'est pas possible d'installer le nécessaire certifcates l'aide d' keytool par exemple de test local temporaire certifcates.

11voto

Shree Points 176

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

Si le serveur à l'autre site est en cours d'exécution sur le protocole https et exige que nous devrions communiquer grâce à l'information fournie dans le certificat nous avons l'option suivante

1) demander le certificat(télécharger le certificat) ,l'importation de ce certificat dans le fichier de clés certifiées. Par défaut du fichier de clés certifiées java utilise peut être trouvé dans \Java\jdk1.6.0_29\jre\lib\security\cacerts ,alors si nous réessayer de se connecter à l'URL de connexion est acceptée.

2) Dans des conditions normales d'affaires des cas, on peut se connecter à l'URL internes dans les organisations, et nous savons qu'ils sont corrects. Dans de tels cas, vous convaincu que sa l'URL est correcte ,Dans de tels cas, le code ci-dessus peut être utilisé, qui ne sera pas mandat pour stocker le certificat pour se connecter à perticular URL

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

1) écrire ci-dessous la méthode qui définit HostnameVerifier pour HttpsURLConnection qui renvoie la valeur true pour tous les cas, ce qui signifie que nous espérons que le fichier de clés certifiées

  // 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) écrire 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.abc.com");
     HttpURLConnection conn = (HttpURLConnection)url.openConnection(); 
     System.out.println("ResponseCoede ="+conn.getResponseCode());
   }

Cet appel renvoie le code de réponse = 200 moyens de connexion est réussie.

pour plus de détails et l'exemple d'échantillon que vous pouvez consulter à l'URL

-1voto

Osama Javed Points 1039

Je crois que vous essayez de vous connecter à un quelque chose à l'aide de SSL, mais que quelque chose est de fournir un certificat qui n'est pas vérifié par les autorités de certification de racine telle que verisign.. En essence par défaut des connexions sécurisées ne peut être établie que si la personne qui tente de se connecter sait les contreparties de clés ou de certains autres verndor telle que verisign peut intervenir et dire que la clé publique fournie est en effet en droit..

TOUS les OS de la confiance à une poignée d'autorités de certification et les petits émetteurs de certificats doivent être certifiés par l'une des grandes certificateurs faire une chaîne de certificateurs si tu vois 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 java server ( j'espère que certains jours, je me écrivez un article sur le blog à propos de la façon dont j'ai obtenu tous les sécurité au travail :) )

En substance ce que j'avais à faire était d'extraire les clés publiques à partir du serveur et de le stocker dans un fichier 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 fiducie de l'usine et que la confiance en usine pour créer la connexion ssl. Il y a alterante de procédures, telles que l'ajout de la clé de la JVM hôte de confiance et de modifier la valeur par défaut de trust store sur démarrer..

Je l'ai fait environ deux mois en arrière et n'ont pas de code source sur moi en ce moment.. l'utilisation de google et vous devriez être en mesure de résoudre ce problème. Si vous ne pouvez pas me le message de retour et je peux vous fournir la corporation de code source pour le projet .. Ne sais pas si cela résout votre problème car vous n'avez pas fourni le code qui provoque ces exceptions. En outre, je travaillais avec des applets pensé que je ne peux pas voir pourquoi il l'habitude de travailler sur Serverlets...

P. S je ne peux pas obtenir le code source avant le week-end puisque externe SSH est désactivé dans mon bureau :(

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X