Je travaille sur un didacticiel pour les services Web REST sur www.udemy.com (REST Java Web Services). L'exemple du didacticiel disait que pour avoir SSL, nous devons avoir un dossier appelé "trust_store" dans mon projet "client" d'éclipse qui devrait contenir un fichier "magasin de clés" (nous avions un projet "client" pour appeler le service et projet "service" qui contenait le service Web REST - 2 projets dans le même espace de travail éclipse, l'un le client, l'autre le service). Pour simplifier les choses, ils ont dit de copier "keystore.jks" à partir du serveur d'application glassfish (glassfish \ domain \ domain1 \ config \ keystore.jks) que nous utilisons et de le placer dans ce dossier "trust_store" dans lequel ils m'ont fait créer le projet client. Cela semble logique: les certificats auto-signés sur le serveur » s key_store correspondrait aux certificats du client trust_store. Maintenant, ce faisant, je recevais l'erreur que le message d'origine mentionne. J'ai googlé ceci et lu que l'erreur est due au fichier "keystore.jks" sur le client ne contenant pas de certificat approuvé / signé, que le certificat qu'il trouve est auto-signé.
Pour que les choses soient claires, permettez-moi de dire que si je comprends bien, le fichier "keystore.jks" contient des certificats auto-signés et le fichier "cacerts.jks" contient des certificats CA (signés par le CA). Le "keystore.jks" est le "keystore" et le "cacerts.jks" est le "trust store". Comme "Bruno", un commentateur, l'a dit plus haut, "keystore.jks" est local et "cacerts.jks" est destiné aux clients distants.
Donc, je me suis dit, hé, glassfish a aussi le fichier "cacerts.jks", qui est le fichier trust_store de glassfish. cacerts.jsk est censé contenir des certificats CA. Et apparemment, j'ai besoin que mon dossier trust_store contienne un fichier de stockage de clés contenant au moins un certificat CA. J'ai donc essayé de placer le fichier "cacerts.jks" dans le dossier "trust_store" que j'avais créé, sur mon projet client, et de modifier les propriétés de la machine virtuelle pour pointer sur "cacerts.jks" au lieu de "keystore.jks". Cela s'est débarrassé de l'erreur. Je suppose que tout ce dont il avait besoin était d'un certificat CA pour fonctionner.
Cela peut ne pas être idéal pour la production, ni même pour le développement au-delà du simple fait de faire fonctionner quelque chose. Par exemple, vous pourriez probablement utiliser la commande "keytool" pour ajouter des certificats CA au fichier "keystore.jks" dans le client. Mais de toute façon, j'espère que cela réduit au moins les scénarios possibles qui pourraient se produire ici pour provoquer l'erreur.
AUSSI: mon approche semblait utile pour le client (certificat serveur ajouté au client trust_store), il semble que les commentaires ci-dessus pour résoudre le message d'origine soient utiles pour le serveur (certificat client ajouté au serveur trust_store). À votre santé.
Configuration du projet Eclipse:
- MyClientProject
- src
- tester
- Bibliothèque système JRE
- ...
- trust_store
--- cacerts.jks --- keystore.jks
Extrait du fichier MyClientProject.java:
static {
// Setup the trustStore location and password
System.setProperty("javax.net.ssl.trustStore","trust_store/cacerts.jks");
// comment out below line
System.setProperty("javax.net.ssl.trustStore","trust_store/keystore.jks");
System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
//System.setProperty("javax.net.debug", "all");
// for localhost testing only
javax.net.ssl.HttpsURLConnection.setDefaultHostnameVerifier(new javax.net.ssl.HostnameVerifier() {
public boolean verify(String hostname, javax.net.ssl.SSLSession sslSession) {
return hostname.equals("localhost");
}
});
}