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

j'ai connecté avec VPN pour configurer l'API d'inventaire pour obtenir la liste des produits et cela fonctionne très bien. Une fois que je reçois le résultat du web-service et je lie à L'UI. Et aussi J'ai intégré PayPal avec mon application pour faire Express checkout quand je fais un appel pour le paiement je fais face à cette erreur. J'utilise servlet pour le 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
77
demandé sur javanna 2011-07-12 08:03:09

6 réponses

d'Abord, vous devez obtenir le certificat public du serveur auquel vous essayez de vous connecter. Cela peut être fait de différentes façons, comme contacter l'administrateur du serveur et le demander, en utilisant openssl pour le télécharger , ou, comme il semble s'agir d'un serveur HTTP, Se connecter à celui-ci avec n'importe quel navigateur, voir les informations de sécurité de la page, et sauvegarder une copie du certificat. (Google devrait être en mesure de vous dire exactement quoi faire pour votre navigateur.)

maintenant que vous avez le certificat sauvegardé dans un fichier, vous devez l'ajouter à votre magasin de confiance JVM. À $JAVA_HOME/jre/lib/security/ pour JREs ou $JAVA_HOME/lib/security pour JDKs , il y a un fichier appelé cacerts , qui vient avec Java et contient les certificats publics des Autorités de certification bien connues. Pour importer le nouveau cert, exécutez keytool comme un utilisateur qui a la permission d'écrire à cacerts:

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

il vous demandera probablement un mot de passe. Défaut le mot de passe tel que livré 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 seulement au bon serveur (tant qu'ils ne perdent pas leur clé privée).

117
répondu 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 des scénarios, où il n'est pas possible d'installer les certifications requises en utilisant keytool par exemple des tests locaux avec des certifications temporaires.

15
répondu 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 selon le protocole https et exige que nous communiquions via les informations fournies dans le certificat, alors nous avons l'option suivante:

1) demander le certificat(télécharger le certificat), importer Ce certificat dans trustore. Les utilisations par défaut de trustore java se trouvent dans \Java\jdk1.6.0_29\jre\lib\security\cacerts, puis si nous réessayons de nous connecter à la connexion URL serait acceptée.

2) dans les cas d'affaires normales, nous pourrions nous connecter à des URL internes dans les organisations et nous savons qu'ils sont corrects. 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 rendra pas obligatoire de stocker le certificat pour se connecter à une URL particulière.

pour le point n ° 2, nous devons suivre les étapes suivantes :

1) Ecrire ci-dessous la méthode qui définit HostnameVerifier pour HttpsURLConnection qui retourne true pour tous les cas ce qui signifie que nous faisons confiance à la 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) Ecrire la méthode ci-dessous, 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 retournera 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 à L'URL .

10
répondu 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.. Essentiellement, par défaut, les connexions sécurisées ne peuvent être établies que si la personne qui essaie de se connecter connaît les clés des contreparties ou un autre verndor tel que verisign peut intervenir et dire que la clé publique fournie est en effet correcte..

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

de toute façon, je reviens au point.. J'ai eu un problème similaire lors de la programmation d'un applet java et d'un serveur java ( J'espère qu'un jour j'écrirai un blogpost 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 de la serveur et le stocker dans un keystore à l'intérieur de mon applet et lorsque 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 alternatives 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..

j'ai fait ça 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 envoyez-moi un message de retour et je peux vous fournir le code source pertinent pour le projet .. Ne sait pas si cela résout votre problème puisque vous n'avez pas fourni le code qui cause ces exceptions. En outre, je travaillais avec des applets pensé que je ne peux pas voir pourquoi il ne fonctionne pas 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 :(

0
répondu Osama Javed 2011-07-14 17:53:36

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

  1. incorporant SSL

    • Obtenir le SSL (en demandant à la source de l'administrateur système peut également être téléchargé par la commande openssl, ou tous les navigateurs certificats)

    • ajouter le certificat à truststore (cacerts) situé à JRE / lib / security

    • fournir l'emplacement de la fiducie dans les arguments de vm comme suit: "- Djavax.net.ssl.truststststore= "

  2. Ignorant SSL

    pour ce #2, s'il vous plaît visitez mon autre réponse sur un autre site web stackoverflow: Comment ingore vérification SSL Ignorer Certificat SSL Erreurs avec Java

0
répondu 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
répondu Evelyn Condes 2015-11-30 07:29:19