Je travaille sur un tutoriel pour les services web REST sur www.udemy.com (REST Java Web Services). L'exemple dans le tutoriel a dit que pour avoir SSL, nous devons avoir un dossier appelé "trust_store" dans mon projet "client" eclipse qui devrait contenir un fichier "keystore" (nous avions un projet "client" pour appeler le service, et un projet "service" qui contenait le service web REST - 2 projets dans le même espace de travail eclipse, un le client, l'autre le service). Pour simplifier les choses, ils ont dit de copier "keystore.jks" du serveur d'application glassfish (glassfish\domains\domain1\config\keystore.jks) que nous utilisons et de le mettre dans ce dossier "trust_store" qu'ils m'avaient fait créer dans le projet client. Cela semble logique : les certificats auto-signés dans le keystore du serveur correspondraient aux certificats dans le trust_store du client. En faisant cela, j'obtenais l'erreur que mentionne le message original. J'ai googlé et j'ai lu que l'erreur est due au fait que le fichier "keystore.jks" sur le client ne contient pas un certificat de confiance/signé, que le certificat qu'il trouve est auto-signé.
Pour être clair, permettez-moi de dire que, selon ma compréhension, le "keystore.jks" contient des certificats auto-signés, et le fichier "cacerts.jks" contient des certificats de CA (signés par la CA). Le "keystore.jks" est le "keystore" et le "cacerts.jks" est le "trust store". Comme "Bruno", un commentateur, le dit ci-dessus, "keystore.jks" est local, et "cacerts.jks" est pour les clients distants.
Donc, je me suis dit, hey, glassfish a aussi le fichier "cacerts.jks", qui est le fichier trust_store de glassfish. cacerts.jsk est censé contenir des certificats de CA. Et apparemment j'ai besoin que mon dossier trust_store contienne un fichier keystore qui a au moins un certificat de CA. Donc, j'ai essayé de mettre le fichier "cacerts.jks" dans le dossier "trust_store" que j'avais créé, sur mon projet client, et de changer les propriétés VM pour pointer vers "cacerts.jks" au lieu de "keystore.jks". Cela a éliminé l'erreur. Je suppose que tout ce dont il avait besoin était un certificat de CA pour fonctionner.
Cela pourrait ne pas être idéal pour la production, ou même pour le développement au-delà de simplement faire fonctionner quelque chose. Par exemple, vous pourriez probablement utiliser la commande "keytool" pour ajouter des certificats de CA au fichier "keystore.jks" sur le client. Mais de toute façon, j'espère que cela au moins restreint les scénarios possibles qui pourraient causer l'erreur.
DE PLUS: mon approche semblait être utile pour le client (certificat serveur ajouté au trust_store client), il semble que les commentaires ci-dessus pour résoudre le message original sont utiles pour le serveur (certificat client ajouté au trust_store serveur). Cheers.
Configuration du projet Eclipse :
- MonProjetClient
- src
- test
- Bibliothèque du système JRE
- ...
- trust_store
---cacerts.jks ---keystore.jks
Extrait du fichier MyProjetClient.java :
static {
// Configurer l'emplacement et le mot de passe du trustStore
System.setProperty("javax.net.ssl.trustStore","trust_store/cacerts.jks");
// commenter la ligne ci-dessous
System.setProperty("javax.net.ssl.trustStore","trust_store/keystore.jks");
System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
//System.setProperty("javax.net.debug", "all");
// pour le test en local seulement
javax.net.ssl.HttpsURLConnection.setDefaultHostnameVerifier(new javax.net.ssl.HostnameVerifier() {
public boolean verify(String hostname, javax.net.ssl.SSLSession sslSession) {
return hostname.equals("localhost");
}
});
}
2 votes
Juste pour clarifier "J'ai un client Java qui essaie d'accéder à un serveur avec un certificat auto-signé.": vous parlez d'utiliser des certificats client qui sont auto-signés, n'est-ce pas? Y a-t-il une configuration spécifique pour les paramètres de votre connecteur sur Glassfish (paramètres du magasin de confiance, en particulier)?
0 votes
"J'ai un client Java essayant d'accéder à un serveur avec un certificat auto-signé." : tu parles d'utiliser des certificats de client qui sont auto-signés, n'est-ce pas ? - oui.
1 votes
J'ai trouvé 2 paramètres dans Glassfish JVM : -Djavax.net.ssl.keyStore=${com.sun.aas.instanceRoot}/config/keystore.jks et -Djavax.net.ssl.trustStore=${com.sun.aas.instanceRoot}/config/cacerts.jks. Maintenant, je dois ajouter mon certificat à l'un d'eux. Pouvez-vous confirmer que c'est le keystore auquel je dois l'ajouter ?
8 votes
Sur le serveur, le keystore est pour le certificat du serveur et sa clé privée (le keystore est pour ce qui "appartient" à la partie locale). Le truststore est pour les certificats utilisés pour vérifier la confiance dans la partie distante. Vous devriez ajouter le certificat client à votre magasin de confiance serveur. (Voir cela aussi, bien que Glassfish ne semble pas utiliser l'emplacement par défaut de la JRE.)
0 votes
Ça a bien fonctionné Bruno. Je l'ai ajouté à mon truststore Glassfish. Merci beaucoup pour ton aide. Toi aussi, Dirk.
0 votes
Cette réponse peut également aider : stackoverflow.com/questions/4663147/…
0 votes
Possible duplicate de PKIX path building failed: impossible de trouver le chemin de certification valide vers la cible demandée
0 votes
Pour Glassfish V4, le processus a fonctionné pour moi mais comme TheCoder, j'ai ajouté à mon Glassfish cacerts.jks, pas celui de Java.
0 votes
Vérifiez ce lien erreur de construction du chemin pkix qui a résolu mon problème.
0 votes
Vérifiez votre connexion internet. Gradle pourrait avoir besoin de télécharger quelques éléments.
2 votes
Vous pouvez accepter aveuglément tous les certificats SSL comme le montre ce code d'exemple complet - Bien sûr, c'est sûr!: nakov.com/blog/2009/07/16/…