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

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 connecte à l’interface utilisateur. Et aussi, j’ai intégré PayPal à ma demande pour effectuer un paiement express lorsque je fais un appel au paiement. Je suis confronté à cette erreur. J’utilise servlet pour le processus back-end. Quelqu’un peut-il 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 certificateion path to requested target 

Vous devez d’abord obtenir le certificate public du serveur auquel vous essayez de vous connecter. Cela peut être fait de différentes manières, par exemple en contactant l’administrateur du serveur et en le demandant, en utilisant openssl pour le télécharger ou, comme cela semble être un serveur HTTP, en s’y connectant avec n’importe quel navigateur, en visualisant les informations de sécurité de la page. et enregistrer une copie du certificate. (Google devrait pouvoir vous dire exactement quoi faire pour votre navigateur spécifique.)

Maintenant que le certificate est enregistré dans un fichier, vous devez l’append au magasin de clés de confiance de votre JVM. A $JAVA_HOME/jre/lib/security/ pour JREs ou $JAVA_HOME/lib/security pour JDK, il y a un fichier nommé cacerts , fourni avec Java et contenant les certificates publics des Autorités de certificateion bien connues. Pour importer le nouveau certificate, exécutez keytool en tant qu’utilisateur autorisé à écrire dans cacerts:

 keytool -import -file  -alias  -keystore  

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 effectué ces étapes relativement simples, vous communiquerez en toute sécurité et avec l’assurance que vous parlez au bon serveur et au bon serveur (tant qu’ils ne perdent pas leur clé privée).

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 certificatee 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, Ssortingng authType) { //No need to implement. } public void checkServerTrusted(java.security.cert.X509Certificate[] certs, Ssortingng 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 ne doit être utilisée que dans des scénarios où il n’est pas possible d’installer les certificates requirejs à l’aide de keytool par exemple des tests locaux avec des certificates temporaires.

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

Si le serveur de l’autre site fonctionne sur le protocole https et qu’il est obligatoire que nous communiquions via les informations fournies dans le certificate, nous avons l’option suivante:

1) demander le certificate (télécharger le certificate), importer ce certificate dans trustore. Les valeurs par défaut utilisées par Java peuvent se trouver dans \ Java \ jdk1.6.0_29 \ jre \ lib \ security \ cacerts. Si nous réessayons de nous connecter à l’URL, la connexion sera acceptée.

2) Dans des cas d’affaires normaux, nous pouvons nous connecter à des URL internes dans des organisations et nous soaps qu’elles sont correctes. Dans de tels cas, vous croyez qu’il s’agit de l’URL correcte. Dans de tels cas, le code peut être utilisé pour ne pas stocker le certificate 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 et qui renvoie true pour tous les cas, ce qui signifie que nous faisons confiance au trustStore.

  // trusting all certificatee 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, Ssortingng authType) throws CertificateException { return; } public void checkClientTrusted(X509Certificate[] certs, Ssortingng 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(Ssortingng 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 d’exemples, vous pouvez vous référer à l’ URL .

Je crois que vous essayez de vous connecter à SSL avec quelque chose mais que quelque chose fournit un certificate qui n’est pas vérifié par les autorités de certificateion telles que verisign. Par défaut, par défaut, les connexions sécurisées ne peuvent être établies que si la les clés des contreparties ou un autre verndor tel que verisign peut intervenir et dire que la clé publique fournie est effectivement correcte ..

La confiance de TOUS les systèmes de certificateion et de petits émetteurs de certificates doit être certifiée par l’un des grands certificateeurs qui crée une chaîne de certificateeurs si vous obtenez ce que je veux dire …

En tout cas, je reviens 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 toute la sécurité fonctionne :))

Essentiellement, je devais extraire les clés publiques du serveur et les stocker dans un magasin de clés à l’intérieur de mon applet. Lorsque je me suis connecté au serveur, j’ai utilisé cette clé stock pour créer une fabrique de confiance et créer une ssl. connexion. Il existe également d’autres procédures, telles que l’ajout de la clé à l’hôte de confiance de la machine virtuelle Java et la modification du magasin d’approbation par défaut au démarrage.

Je l’ai fait il y a environ deux mois et je n’ai pas le code source sur moi maintenant .. utilisez google et vous devriez être capable de résoudre ce problème. Si vous ne pouvez pas me renvoyer un message et que je peux vous fournir le code source pertinent pour le projet. Je ne sais pas si cela résout votre problème car vous n’avez pas fourni le code à l’origine de ces exceptions. De plus, je travaillais avec des applets qui pensaient que 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 SSH externe est désactivé dans mon bureau 🙁

SSLHandshakeException peut être résolu de deux manières.

  1. Incorporation de SSL

    • Obtenir le SSL (en demandant à l’administrateur du système source, peut également être téléchargé par la commande openssl, ou n’importe quel navigateur télécharge les certificates)

    • Ajoutez le certificate dans le fichier de clés certifiées (cacerts) situé dans JRE / lib / security

    • fournir l’emplacement du fichier de clés certifiées dans les arguments vm comme “-Djavax.net.ssl.trustStore =”

  2. Ignorer SSL

    Pour ce n ° 2, veuillez visiter mon autre réponse sur un autre site Web stackoverflow: Comment enregistrer la vérification SSL Ignorer les erreurs de certificate SSL avec Java

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 certificatee 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, Ssortingng authType) { //No need to implement. } public void checkServerTrusted(java.security.cert.X509Certificate[] certs, Ssortingng 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); }