Partie 4: Echange en mTLS pour récupérer une ressource protégée
Dans cette partie, nous allons récupérer une ressource protégée par du mTLS, toujours avec cURL.
URL de travail
La ressource protégée se trouve à l'URL https://localhost:18802 à partir du moment ou le serveur NGINX décrit dans la partie 3 est toujours actif !
Dossier de travail
Dans cette partie du TP, nous allons travailler dans le sous-dossier /tp/partie4
Première tentative
Objectif
Dans un premier temps, essayons de récupérer le ressources protégés à l'adresse indiquée, et identifiez :
- L'erreur obtenue spécifique du mTLS
- Le nom de l'AC utilisée pour la validation du certificat client
Indice 1
Il faut mixer les outils :
- cURL pour essayer de récupérer la ressources
- OpenSSL pour pour examiner l'endpoint et regarder la configuration du mTLS
Indice 2
Qui di nouveau certificat et nouvelle AC, dit cURL pas content !
Normalement, il faudrait récupérer le certificat / l'AC signataire pour les truster dans notre commande cURL, mais pour cette fois le pramètre -k fera l'affaire 😉
Solution
Tout d'abord, on essaye de récupérer la ressource :
curl -k https://localhost:18802
Evidemment, c'est un échec, le message est clair :
400 Bad Request
Examinons donc l'endpoint :
openssl s_client -connect localhost:18802 < /dev/null
Parmis toutes les informations remontées, une section nous intéresse :
---
Acceptable client certificate CA names
CN = FB MTLS CA, C = FR, ST = France, L = Rennes, O = Capgemini
Requested Signature Algorithms: ECDSA+SHA256:ECDSA+SHA384:ECDSA+SHA512:Ed25519:Ed448:RSA-PSS+SHA256:RSA-PSS+SHA384:RSA-PSS+SHA512:RSA-PSS+SHA256:RSA-PSS+SHA384:RSA-PSS+SHA512:RSA+SHA256:RSA+SHA384:RSA+SHA512:ECDSA+SHA224:RSA+SHA224
Shared Requested Signature Algorithms: ECDSA+SHA256:ECDSA+SHA384:ECDSA+SHA512:Ed25519:Ed448:RSA-PSS+SHA256:RSA-PSS+SHA384:RSA-PSS+SHA512:RSA-PSS+SHA256:RSA-PSS+SHA384:RSA-PSS+SHA512:RSA+SHA256:RSA+SHA384:RSA+SHA512
Peer signing digest: SHA256
Peer signature type: RSA-PSS
Server Temp Key: X25519, 253 bits
---
L'endpoint est bien protégé, et pour montrer patte blanche, il nous faut un certificat client en provenance de l'AC CN = FB MTLS CA, C = FR, ST = France, L = Rennes, O = Capgemini ...
Générer un certificat client
En tant normal, il faudrait demander au pocesseur de l'AC de nous générer un certificat client, mais dans notre cas, c'est notre AC ... au boulot donc !
L'AC FB MTLS CA
L'AC peut etre téléchargée ici : Télécharger l'AC
Elle est stockée dans un store au format PKCS12 (extention de fichier .p12), chiffré avec le mot de passe suivant : pkcs124ever
Objectif
Notre objectif : générer un certificat client à partir de notre AC ! On peut suivre les opérations réalisées en partie 2 du TP, mais le store est au format pkcs12 cette fois ...
Indice 1
Il est tout à fait possible d'utiliser la commande de génération du certificat (openssl x509 -req) avec le fichier .p12.
Il est aussi possible d'extraire le certificat et la clé sur store PKCS12, à vous de voir ...
Dans les deux cas, il faut générer une clé privée, et une CSR en précisant qu'on veut un certificat client !
Indice 2
Si on choisit d'utiliser directement le PKCS12, seul le paramètre -CA sera à renseigner pour la génération du certificat.
Solution
Nous allons directement utiliser l'AC au format PKCS12 pour générer notre certificat client.
D'abord, on génère la clé privée client.keyavec un mot de passe fb2024:
openssl genrsa -aes256 -out client.key 4096
Ensuite, on créé le fichier de configuration de la csr client.config avec le contenu suivant :
[req]
distinguished_name = req_distinguished_name
req_extensions = v3_ext
prompt = no
[req_distinguished_name]
CN = FB ETAPE4 CLIENT
OU = Friday Booster
O = Capgemini
L = Rennes
ST = FRANCE
C = FR
[v3_ext]
basicConstraints = critical, CA:FALSE
keyUsage = critical, digitalSignature, keyEncipherment
extendedKeyUsage = critical, clientAuth
Puis on créé la CSR client.csravec la config et la clé :
openssl req -new -sha256 -config client.config -key client.key -out client.csr
Et enfin, on génère notre certificat client client.crt en utilisant l'AC au format PKCS12 :
openssl x509 -CA fb_mtls_ca.p12 -req -in client.csr -out client.crt -extentions v3_ext -days 1460 -extfile client.config
Note
Le mot de passe demandé est celui du store PKCS12 indiqué plus haut, pas celui de la clé privée qu'on vient de générer !
Objectif (Optionnel)
Refaire la génération, mais cette fois-ci, en extrayant le certificat et la clé privée de l'AC depuis le store PKCS12
Solution
D'abord on extrait la clé privée :
openssl pkcs12 -in fb_mtls_ca.p12 -nocerts -out ca.key
Note
Trois mots de passes seront demandés : * Le premier correspond au mot de passe du store * Le second et le troisième, au mot de passe de chiffrement de la clé privée et sa confirmation
En regardant le contenu du fichier, celui-ci ne commence pas par l'habituel -----BEGIN ENCRYPTED PRIVATE KEY-----, mais par tout un ensemble d'attributs lié au store initial.
On peut avoir un résultat propre en pipant un sed avant l'écriture du fichier :
openssl pkcs12 -in fb_mtls_ca.p12 -nocerts | sed -ne '/-BEGIN/,/-END/p' > ca.key
Ensuite, on extrait le certificat de la même manière :
openssl pkcs12 -in fb_mtls_ca.p12 -clcerts -nokeys | sed -ne '/-BEGIN/,/-END/p' > ca.crt
Enfin, on peut générer le certificat client :
openssl x509 -CAkey ca.key -CA ca.crt -req -in client.csr -out client.crt -extensions v3_ext -days 1460 -extfile client.config
Récupérer la ressource protégée avec le navigateur
Objectif
Maintenant qu'on a un certificat client, récupérez la ressource protégée en montrant patte blanche avec votre navigateur !
Il va falloir :
- Créer un fichier .p12 à partir de la clé et du certificat
- L'installer sur votre OS
- Redémarrer le navigateur pour que le store soit rechargé (possible d'utilisé un autre navigateur comme edge/chrome à côté pour ne pas avoir a fermer)
Info
On le fait dans le navigateur à cause d'un bug Windows qui bloque cURL ... Au moins ça permet de varier !
Avec cURL, pour un store PKCS12 client.p12 protégé avec un mot de passe fb2024, la commande aurait été la suivante :
curl -k --cert client.p12:fb2024 https://localhost:18802
Indice 1
La commande openssl pkcs12 -export va permettre de créer un .p12, il suffit 'ajouter des paramètres pour pointer vers le certificat et la clé ...
Indice 2
La commande complète : openssl pkcs12 -export -inkey client.key -in client.crt -name fb_client -out client.p12
Double cliquer sur le fichier devrait lancer l'invite de commande Windows installer le certificat : choisir le store "personnel"
Solution
Créer le fichier .p12 avec openssl pour combiner le certificat client et sa clé dans un store PKCS12 :
openssl pkcs12 -export -inkey client.key -in client.crt -name fb_client -out client.p12
Ensuite, double cliquer sur le fichier client.p12 pour l'installer dans le store de l'OS. Au choix du magasin, prendre les certificats personnel.
Enfin, ouvrez un autre navigateur (chrome/edge/opera) sur notre URL en mTLS (ou redemarrez le navigateur actuel). Un choix de certificat sera proposé, dont votre certificat client. Le choisir et valider, le message suivant, chiffré avec AES, devrait être retourné :
U2FsdGVkX1/9SkbBDYX+pPOjS6mhywX0D8qW6P6CA2DMkO8zatRvkUGsGd+7Y5Ore1ZUPSjhicWtSYlBcip1pw==
Warning
Pensez a nettoyer à nouveau votre store !