J'ai finalement réussi à résoudre tous les problèmes, je vais donc répondre à ma propre question. Voici les paramètres/fichiers que j'ai utilisés pour parvenir à résoudre mon ou mes problèmes particuliers ;
El keystore du client est un Format PKCS#12 contenant
- Le client public certificat (dans ce cas, signé par une autorité de certification auto-signée)
- Le client privé clé
Pour le générer, j'ai utilisé l'outil OpenSSL pkcs12
par exemple ;
openssl pkcs12 -export -in client.crt -inkey client.key -out client.p12 -name "Whatever"
Conseil : assurez-vous d'avoir la dernière version d'OpenSSL, no version 0.9.8h car elle semble souffrir d'un bug qui ne permet pas de générer correctement les fichiers PKCS#12.
Ce fichier PKCS#12 sera utilisé par le client Java pour présenter le certificat du client au serveur lorsque le serveur a explicitement demandé au client de s'authentifier. Voir le Article de Wikipedia sur TLS pour une vue d'ensemble du fonctionnement du protocole d'authentification du certificat du client (qui explique également pourquoi nous avons besoin de la clé privée du client).
El le truststore du client est un simple Format JKS contenant le Racine o certificats d'AC intermédiaires . Ces certificats d'autorité de certification détermineront les points d'extrémité avec lesquels vous serez autorisé à communiquer. Dans ce cas, votre client pourra se connecter à n'importe quel serveur présentant un certificat signé par l'une des autorités de certification du truststore.
Pour le générer, vous pouvez utiliser l'outil standard Java keytool, par exemple ;
keytool -genkey -dname "cn=CLIENT" -alias truststorekey -keyalg RSA -keystore ./client-truststore.jks -keypass whatever -storepass whatever
keytool -import -keystore ./client-truststore.jks -file myca.crt -alias myca
En utilisant ce truststore, votre client essaiera d'effectuer une poignée de main SSL complète avec tous les serveurs qui présentent un certificat signé par l'AC identifiée par myca.crt
.
Les fichiers ci-dessus sont strictement réservés au client. Si vous souhaitez également configurer un serveur, ce dernier a besoin de ses propres fichiers de clés et de confiance. Un excellent exemple de configuration d'un client et d'un serveur Java (utilisant Tomcat) peut être trouvé sur le site suivant ce site web .
Questions/Remarques/Tips
-
Authentification par certificat du client ne peut être appliquée que par le serveur.
- ( Important ! ) Lorsque le serveur demande un certificat client (dans le cadre de la poignée de main TLS), il fournit également une liste d'autorités de certification fiables dans le cadre de la demande de certificat. Lorsque le certificat client que vous souhaitez présenter pour l'authentification est no signé par l'un de ces CA, il ne sera pas présenté du tout (à mon avis, c'est un comportement bizarre, mais je suis sûr qu'il y a une raison à cela). C'était la principale cause de mes problèmes, car l'autre partie n'avait pas configuré son serveur correctement pour accepter mon certificat client auto-signé et nous avons supposé que le problème était de mon côté pour ne pas fournir correctement le certificat client dans la demande.
- Procurez-vous Wireshark. Il offre une excellente analyse des paquets SSL/HTTPS et sera d'une aide précieuse pour déboguer et trouver le problème. Il est similaire à
-Djavax.net.debug=ssl
mais il est plus structuré et (sans doute) plus facile à interpréter si vous n'êtes pas à l'aise avec la sortie de débogage Java SSL.
-
Il est parfaitement possible d'utiliser la bibliothèque Apache httpclient. Si vous souhaitez utiliser httpclient, il suffit de remplacer l'URL de destination par son équivalent HTTPS et d'ajouter les arguments JVM suivants (qui sont les mêmes pour tout autre client, quelle que soit la bibliothèque que vous souhaitez utiliser pour envoyer/recevoir des données via HTTP/HTTPS) :
-Djavax.net.debug=ssl
-Djavax.net.ssl.keyStoreType=pkcs12
-Djavax.net.ssl.keyStore=client.p12
-Djavax.net.ssl.keyStorePassword=whatever
-Djavax.net.ssl.trustStoreType=jks
-Djavax.net.ssl.trustStore=client-truststore.jks
-Djavax.net.ssl.trustStorePassword=whatever
0 votes
J'ai reçu deux certificats du client comment identifier celui qui doit être ajouté dans le keystore et le truststore pourriez-vous s'il vous plaît m'aider à identifier ce problème comme vous l'avez déjà fait dans le même genre de problème, ce problème que j'ai soulevé en fait je n'ai pas d'indice sur ce qu'il faut faire. stackoverflow.com/questions/61374276/