Je suis nouveau dans JAVA , service Web consommant (.wsdl) dans le projet Web Service Client . J'importe le certificat client dans la boutique java cacerts de jrd . Mon code est le suivant:
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
Je n'ai pas réussi à établir la liaison, j'obtiens l'exception suivante:
System.setProperty("javax.net.ssl.trustStore","[PATH]/cacerts.jks"); System.setProperty("javax.net.ssl.trustStorePassword","changeit"); ServicesProxy service = new ServicesProxy(); ServiceRequest request = new ServiceRequest(1498); ServiceResponse response = service.getDetails(request);
Je n'ai aucune idée pourquoi il y a une exception. Toute aide serait appréciée.
6 Réponses :
Ce n'est pas une solution à votre problème, mais peut-être que cela aide à le trouver:
Vous pouvez démarrer votre client avec le paramètre VM -Djavax.net.debug = all
qui vous donnera beaucoup d'informations sur la connexion SSL.
Vérifiez ici pour plus de détails sur la sortie:
https://docs.oracle .com / javase / 7 / docs / technotes / guides / security / jsse / ReadDebug.html
Vous devrez probablement ajouter le porte-clés dans le certificat (format PEM).
CA Root -> Intermediate Cert -> Cert.
Ou le certificat est introuvable dans le keystore, utilisez-vous le bon alias etc.
Et je ne reconnais pas l'implémentation SOAP JAX-WS que vous utilisez.
Utilisez la propriété -Djavax.net.ssl.trustStore directement à la place.
Une autre chose que le serveur que vous utilisez dans laquelle vous devez également placer les jks pour la poignée de main.
Par exemple, le serveur est JBoss puis bin
Votre certificat n'est peut-être pas correctement installé dans votre truststore.
Vous pouvez utiliser openssl pour vérifier et installer le bon certificat dans le truststore, comme expliqué ici
Je suppose que votre cacert n'est pas correct ou que le chemin est inaccessible. J'ai suivi les instructions données ici
Utilisez SSL Poke pour vérifier la connectivité
Exécutez la classe comme suit, en modifiant l'URL et le port:
$ JAVA_HOME / bin / java SSLPoke yoururl 443
Une connexion réussie ressemblerait à ceci:
$ JAVA_HOME / bin / java SSLPoke yoururl 443
Connexion réussie
Essayez d'utiliser un autre truststore pour vous connecter
$ JAVA_HOME / bin / java -Djavax.net.ssl.trustStore = [CHEMIN] /cacerts.jks SSLPoke yoururl 443
En cas d'échec, le truststore ne contient pas les certificats appropriés.
Comment le résoudre
La solution est extraite de ici a>
Récupérez à nouveau le certificat sur le serveur:
openssl s_client -connect yoururl: 443
Vous avez besoin de openssl. Enregistrez la sortie dans un fichier appelé public.crt. Voici à quoi devrait ressembler votre fichier:
-----BEGIN CERTIFICATE----- < Bunch of lines of your certificate > -----END CERTIFICATE-----
Importez le certificat:
$ JAVA_HOME / bin / keytool -import -alias -keystore $ JAVA_HOME / jre / lib / security / cacerts -file public.crt
Entrez le mot de passe si vous y êtes invité (la valeur par défaut est changeit)
Recommandation
Dans le même message, il n'est pas recommandé d'utiliser un trustStore configuré différent du cacert JVM car java ne pouvait pas accéder aux autres certificats racine.
Salut On dirait que les certificats ne sont pas importés correctement ou que le chemin utilisé dans le code ne pointe pas vers le fichier de clés correct.
J'espère que les étapes suivantes de l'article ci-dessous vous aideront.
http://magicmonster.com/kb/prg/java/ssl /pkix_path_building_failed.html
Est-ce que cela utilise Apache CXF comme client de services Web? Il utilise ses propres paramètres SSL dans le fichier
cxf.xml
- plus de détails iciÊtes-vous sûr que le nom de votre truststore est
cacerts.jks
et pas seulementcacerts
?J'ai aussi essayé avec des cacerts.