Partie 3 : Faire confiance à un certificat
Il est important de maitriser les partenaires de confiance lors de nos échanges entre systèmes d'information. Pour ça, il existe plusieurs options :
- Faire confiance à une AC : dans la requête, on fournis un chemin vers le certificat de l'AC de confiance
- Faire confiance à plusieurs AC : on génrère un store contenant toutes les AC de confiance, utilisé lors du Handshake TLS
- Faire confiance définitivement : on ajouter l'AC au store de l'OS, le store par défaut
Dans cette partie du TP, nous allons voir comment faire confiance à une AC pour accéder a une ressource publique.
Lancement du serveur NGINX local
Un serveur web NGINX est disponibles dans les ressources du tp, au chemin /nginx.
Un ensemble de commandes sont disponibles pour controler le serveur nginx :
/nginx/lancer.sh: Démarre NGINX en background/nginx/arreter.bat: A lancer pour arrêter NGINX/nginx/reload.bat: A utiliser pour recharger la configuration; ne devrait pas servir dans ce TP
Ports utilisés
Ce TP va utiliser les ports 18800 - 18810 du PC : il y a très peu de chance que ces ports soient utilisés, si c'est le cas, il faudra mettre à jour la configuration avec des ports fonctionnels (et se souvenir de l'association (ancien port) <-> (nouveau_port)
Maintenant, lancer le serveur avec le script de lancement !
En direct avec cURL
Maintenant qu'on a un serveur web, allors requêter des URL !
Certificat autosigné
Objectif
Récupérer le message caché à l'URL suivante avec cURL : https://localhost:18800
Interdiction d'utiliser le paramètre -k ou --insecure !
Indice 1
Dans la page d'introduction du TP, il y a un cheatsheet qui pourrait servir ...
Indice 2
Pour pouvoir faire confiance au certificat, il faut d'abord le télécharger en local. C'est dans la CheatSheets OpenSSL !
Ensuite, le paramètre cacert semble être le bon candidat ...
Solution
Tout d'abord, il faut télécharger le certificat distant, avec la commande suivante :
openssl s_client -connect localhost:18800 2>/dev/null </dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > cert.pem
Maintenant qu'on a un fichier cert.pem, on peut le passer en paramètre de notre commande cURL pour truster le certificat et récupérer le message :
curl -s --cacert cert.pem https://localhost:18800
Le message suivant doit être retourné : U2FsdGVkX19pJTEI4T7jou8vXGrfb9OnyCH8lGc9cZiS3e6gHIClTzNfDGIoF+v
Objectif Optionnel
Le message est chiffré avec les caractéristiques suivantes :
- Alorithme de chiffrement : AES
- Mode : ECB
- Taille de la clé de chiffrement : 128 bits
- Clé secrète : friday_booster24
Saurez-vous le déchiffrer avec Openssl ?
Solution
On créé un fichier avec le contenu :
echo "U2FsdGVkX19pJTEI4T7jou8vXGrfb9OnyCH8lGc9cZiS3e6gHIClTzNfDGIoFF+v" > content
Puis avec la commande suivante, on déchiffre :
openssl enc -d -aes-128-cbc -in content -a -k friday_booster24
On doit retrouver le message caché : C'est un bon debut !
Certificat signé par une AC
Objectif
Récupérer le message caché à l'URL suivante avec cURL : https://localhost:18801
Interdiction d'utiliser le paramètre -k ou --insecure !
Cette fois-ci, une AC a signé le certificat, et elle est fournie dans la chaine mais inconnue de notre OS. C'est elle qu'on doit truster !
Paramètre spécifique
Dans ce cadre de ce TP, l'AC générée est ... approximative, il faudra donc aider un peu cURL en lui passant le paramètre --ssl-no-revoke supplémentaire, notre AC n'exposant pas de CRLs ...
Indice 1
La commande de récupération de certificat avec OpenSSL fonctionne avec le certificat terminal, celui du serveur ... Il va faloir lui demander d'afficher toutes la chaine avec l'option -showcerts !
Indice 2
Avec l'indice 1, on récupère toute la chaine, et il faut donc extraire le certificat de l'AC, le dernier de la liste. Et chaque certificat termine par -----END CERTIFICATE-----, on veut donc tout ce qui est dernière la première occurence.
Ajoutons ça a la fin de notre première commande de récupération de la chaine :
recuperation_de_la_chaine | awk 'p>0; /-----END CERTIFICATE-----/{++p}'
Solution
Tout d'abord, il faut télécharger l'AC qui a permis de chiffrer le certificat serveur. On reprend la même commande qu'à l'étape précédente, mais on ajoute le paramètres -showcerts à notre commande OpenSSL pour avoir toute la chaîne, et on découpe en sortie pour ne garder que le dernier morceau :
openssl s_client -showcerts -connect localhost:18801 2>/dev/null </dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' | awk 'p>0; /-----END CERTIFICATE-----/{++p}' > ca.pem
Maintenant qu'on a un fichier ca.pem, on peut le passer en paramètre de notre commande cURL pour truster la CA signataire et récupérer le message :
curl -s --ssl-no-revoke --cacert ca.pem https://localhost:18801
Le message suivant doit être retourné : U2FsdGVkX19o2rYcOeCuPYYmT0VYP7SVvJ0BISTpfx0O3cTwhzTucETXF22Y6BLmzrDzukBPVNSmOZU3Ad4g7w==
A nouveau, ce message peut être déchiffré comme pour l'objectif bonus de l'étape précédente ...
Trustore windows
Dans l'étape précédente, nous avons téléchargé une AC pour l'utiliser avec cURL. Il est possible de l'ajouter dans le trustore de l'OS pour toujours lui faire confiance et ne plus avoir besoin de la renseigner a chaque fois.
Objectif
Ajouter l'AC récupérée lors du challenge précédent, et ajoutez là au Truststore Windows (magasin des AC Racine de l'utilisateur).
Ensuite, récupérez à nouveau la donnée avec curl, mais cette fois sans préciser le fichier de l'AC : laissons le regarder dans le store de l'OS !
Indice 1
Windows préfère les extentions .crt plutôt que .pem ...
Solution
- Renommer le fichier
ca.pemenca.crt, puis double-cliquez dessus - Windows va alors ouvrir un prompt avec un bouton pour
Installer un certificat, cliquer dessus - Dans le prompt, on séléctionne l'utilisateur actuel
- Ensuite, on séléctionne nous même le magasin de certificats avec la seconde option et le bouton
Parcourir ... - Ensuite, on séléctionne le magasin
Autorités de certification racines de confiance, puis on valide le tout - On accèpte le message d'avertissement au passage ...
Ensuite dans notre terminal, la commande suivante est maintenant fonctionnelle :
curl -s --ssl-no-revoke https://localhost:18801
Nettoyer son store
Pour éviter de garder une CA pas franchement propre dans votre store, un nettoyage est de mise !
- Dans le menu démarer, rechercher Gérer les certificats utilisateur, puis lancez le programme
- Dans le menu de gauche, déplacez-vous dans le store des
Autorités de certification racines de confiancepuis a droite, double-cliquez dans le dossierCertificats - Enfin, recherchez dans la liste
FB Root CAet faites click-droit + supprimer pour l'enlever du store
Acceptez les deux messages d'avertissement, et le tour est joué !