Enfin réussi à résoudre tous les problèmes, je vais donc répondre à ma propre question. Ce sont les paramètres / fichiers que j'ai utilisés pour gérer la résolution de mes problèmes particuliers;
Le fichier de clés du client est un fichier au format PKCS # 12 contenant
- Le certificat public du client (dans ce cas, signé par une autorité de certification auto-signée)
- La clé privée du client
Pour le générer, j'ai utilisé la pkcs12
commande d'OpenSSL , par exemple;
openssl pkcs12 -export -in client.crt -inkey client.key -out client.p12 -name "Whatever"
Astuce: assurez-vous d'obtenir la dernière version d' OpenSSL, pas la version 0.9.8h car cela semble souffrir d'un bogue qui ne vous 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 client au serveur lorsque le serveur a explicitement demandé au client de s'authentifier. Voir l'article Wikipedia sur TLS pour un aperçu du fonctionnement du protocole d'authentification par certificat client (explique également pourquoi nous avons besoin de la clé privée du client ici).
Le fichier de clés certifiées du client est un fichier au format JKS simple contenant les certificats d'autorité de certification racine ou intermédiaire . Ces certificats d'autorité de certification détermineront les points de terminaison avec lesquels vous serez autorisé à communiquer, dans ce cas, ils permettront à votre client de se connecter au serveur qui présente un certificat signé par l'une des autorités de certification du magasin de clés de confiance.
Pour le générer, vous pouvez utiliser le keytool Java standard, 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
À l'aide de ce magasin de clés de confiance, votre client essaiera d'effectuer une négociation SSL complète avec tous les serveurs qui présentent un certificat signé par l'autorité de certification identifiée par myca.crt
.
Les fichiers ci-dessus sont strictement réservés au client. Lorsque vous souhaitez également configurer un serveur, le serveur a besoin de ses propres fichiers de clés et de fichiers de clés certifiées. Une grande procédure pas à pas pour configurer un exemple pleinement fonctionnel pour un client et un serveur Java (à l'aide de Tomcat) peut être trouvée sur ce site Web .
Problèmes / remarques / conseils
- L'authentification du certificat client ne peut être appliquée que par le serveur.
- ( Important! ) Lorsque le serveur demande un certificat client (dans le cadre de la négociation TLS), il fournit également une liste des autorités de certification approuvées dans le cadre de la demande de certificat. Lorsque le certificat client que vous souhaitez présenter pour l'authentification n'est pas signé par l'une de ces autorités de certification, il ne sera pas présenté du tout (à mon avis, c'est un comportement étrange, 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é correctement son serveur 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.
- Obtenez Wireshark. Il a une excellente analyse des paquets SSL / HTTPS et sera une aide considérable pour le débogage et la recherche du problème. Il est similaire
-Djavax.net.debug=ssl
mais plus structuré et (sans doute) plus facile à interpréter si vous n'êtes pas à l'aise avec la sortie de débogage SSL SSL.
Il est parfaitement possible d'utiliser la bibliothèque Apache httpclient. Si vous souhaitez utiliser httpclient, remplacez simplement l'URL de destination par l'équivalent HTTPS et ajoutez 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