Skip to content

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.pem en ca.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 confiance puis a droite, double-cliquez dans le dossier Certificats
  • Enfin, recherchez dans la liste FB Root CA et faites click-droit + supprimer pour l'enlever du store

Acceptez les deux messages d'avertissement, et le tour est joué !