{{tag>sysadmin sécurité netadmin webadmin certificat ssl tls}}
====== Générer et tester un certificat SSL/TLS ======
Ce wiki retrace les tests de la chaîne de certification établie pour la création de certificats à usage interne( comprenant une autorité de certification racine et une autorité de certification intermédiaire) .
Pour tester les certificats émis, un serveur web minimal a été mis en service:
* VM docker-alpha.mairie.local exécutant Docker Engine;
* Création d'un conteneur à partir de l'image **traefik/whoami** : un serveur web minimaliste en Go pouvant fonctionner en HTTP ou HTTPS.
Dans un premier temps, on crée un alias DNS whoami.mairie.local sur la machine docker-alpha.mairie.local sur les serveurs DNS internes (cronos.mairie.local et rhea.mairie.local)
On vérifie que la résolution de nom fonctionne via **dig**:
dig whoami.mairie.local
Créer le conteneur Docker exécutant le serveur web minimal répondant à l'alias whoami.mairie.local
# Instanciation d'un serveur web minimaliste via Docker
docker container run -d -P --name webserver_test --publish 80:80 -e WHOAMI_NAME="whoami.mairie.local" traefik/whoami
# équivalent
docker container run -d -P --name webserver_test --publish 80:80 traefik/whoami --name whoami.mairie.local
Lancer le navigateur et consulter l'URL http://whoami.mairie.local
Maintenant qu'un serveur web est fonctionnel, on va générer le certificat et relancer le serveur avec celui-ci.
Générer le certificat depuis l’hôte CERT-MGR:
cd /usr/local/cert-mgr/intermediate_ca
# Générer la clé privée pour le client
openssl genrsa -out private/whoami.mairie.local.key 2048
chmod 400 whoami.mairie.local.key
# création et signature de la CSR
openssl req -new -config ./openssl.cnf -sha256 -key private/whoami.mairie.local.key -out csr/whoami.mairie.local.csr.pem
# affiche le détail de la CSR
openssl req -noout -text -in csr/whoami.mairie.local.csr.pem
# Création du certificat par signature de la CSR par l'autorité de certification:
# Création d'un certificat x509 (pas de suivi des certificats émis, ils peuvent être resignés)
openssl x509 -req -days 30 -in csr/whoami.mairie.local.csr.pem -CA ./certs/intermediate_ca_tnf.cert.pem -CAkey ./private/intermediate_ca_tnf.key -CAcreateserial -out certs/whoami.mairie.local.cert.pem
# vérification du certificat
openssl verify -CAfile certs/ca-chain_tnf.cert.pem certs/whoami.mairie.local.cert.pem
Le certificat et la clé privée générés sur cert-mgr.mairie.local doivent être copiés sur la VM docker-alpha.mairie.local exécutant le serveur web de test.
# Suppression du serveur web HTTP précédent
docker container stop webserver_test
docker container rm webserver_test
# Instanciation du serveur Web HTTPS
docker container run -d -p 443:80 --name webserver_test -v $PWD/certs:/certs traefik/whoami --name whoami.mairie.local --key /certs/whoami.mairie.local.key --cert /certs/whoami.mairie.local.cert.pem
Une fois le service lancé, depuis un poste client, tester la connexion au serveur web, ici via **cURL**
curl --cacert ca_tnf-chain.cert.pem --verbose "https://whoami.mairie.local"
Si un message d'avertissement apparaît sur le poste client, c'est que l'autorité de certification racine "Mairie de Tournefeuille" n'est pas encore installée sur le poste client ou dans le magasin de certificats du navigateur : voir le wiki [[infrastructure:installer_autorite_certification_mairie_de_tournefeuille | installer l'autorité de certification de la mairie de Tournefeuille]].
Depuis un poste client via le navigateur Web consulter l'URL "https://whoami.mairie.local".
Sur le poste client, on installer les certificats des autorités racine
sudo cp ca-chain_tnf.cert.pem /usr/share/ca-certificates/
sudo chmod 444 /usr/share/ca-certificates/ca-chain_tnf.cert.pem
===== Troubleshooting =====
Sous Windows avec Firefox, le certificat généré précédemment n'est pas valide, en cliquant sur le bouton **Avancé...** on obtient une erreur:
Code d’erreur : SSL_ERROR_BAD_CERT_DOMAIN
Sous Windows la résolution de l’hôte:
nslookup whoami.mairie.local
Serveur : cronos.mairie.local
Address: 192.9.200.231
Nom : docker-alpha.mairie.local
Address: 172.16.1.23
Aliases: whoami.mairie.local
On essaie de re-générer un certificat avec un CN docker-alpha.mairie.local et un champ (SAN) avec whoami.mairie.local
Éditer le fichier CSR_with_SAN.cnf, renseigner les noms d'alias dans la section **''[ alt_names ]''**
# émettre une nouvelle CSR avec un CN différent (docker-alpha.mairie.local)
openssl req -new -config CSR_with_SAN.cnf -key private/whoami.mairie.local.key -out csr/whoami.mairie.local.csr.pem
Afficher la requête et vérifier en particulier la valeur du CN, la présence de la section **''Requested Extensions''** et l'extension **''X509v3 Subject Alternative Name''** (SAN) avec pour valeur l'alias "whoami.mairie.local" pour notre exemple:
openssl req -noout -text -in csr/whoami.mairie.local.csr.pem | less
# Signature de la CSR avec ses valeurs pour les extensions x509v3
openssl x509 -req -days 30 -extfile CSR_with_SAN.cnf -extensions v3_req -in ./csr/whoami.mairie.local.csr.pem -CA ./certs/intermediate_ca_tnf.cert.pem -CAkey ./private/intermediate_ca_tnf.key -CAcreateserial -out ./certs/whoami.mairie.local.cert.pem
Afficher le certificat et vérifier les valeurs du CN, la présence des extensions x509v3 en particulier du **SAN**((**S**ubject **A**lternative **N**ame))
openssl x509 -noout -text -in certs/whoami.mairie.local.cert.pem | less
Concaténer les certificats des autorités de certification au certificat du serveur pour fournir un fichier contenant une chaîne de certification complète
cat certs/whoami.mairie.local.cert.pem certs/ca-chain_tnf.cert.pem > /tmp/whoami.mairie.local.crt
===== Fin de validité d'un certificat émis =====
Si un certificat déjà émis arrive à expiration, il peut être rapidement réémis. Dans le répertoire de l'autorité de certification intermédiaire, **la requête CSR existe encore**. Les étapes précédentes ne sont donc pas nécessaire. L'autorité de certification n'a qu'à recréer le certificat en signant de nouveau la CSR:
Attention toutefois, pour les certificats SAN, il faut ajouter le fichier de configuration associé à la CSR pour que le certificat SAN généré soit valide et comporte bien le champ Subject Alternative Name
# Test du certificat précédemment émis
openssl verify -CAfile certs/ca-chain_tnf.cert.pem certs/whoami.mairie.local.cert.pem
C = FR, ST = France, L = Haute Garonne, O = Mairie de Tournefeuille, OU = Service informatique, emailAddress = administrateur@mairie-tournefeuille.fr, CN = docker-alpha.mairie.local
error 10 at 0 depth lookup: certificate has expired
# Génération du certificat SAN par signature de la CSR préexistante et ajout explicite des extensions:
openssl x509 -req -days 30 -extensions desired_extensions -extfile csr/extensions/whoami.mairie.local.san.cnf -in ./csr/whoami.mairie.local.csr.pem -CA ./certs/intermediate_ca_tnf.cert.pem -CAkey ./private/intermediate_ca_tnf.key -CAcreateserial -out ./certs/whoami.mairie.local.cert.pem
# Test du certificat nouvellement émis
openssl verify -CAfile certs/ca-chain_tnf.cert.pem certs/whoami.mairie.local.cert.pem
certs/whoami.mairie.local.cert.pem: OK
Le certificat peut être transmis à l'utilisateur, la clé privée associée reste inchangée, la communiquer de nouveau est inutile.
===== Références =====
* https://hub.docker.com/r/traefik/whoami
* https://www.certeurope.fr/blog/guide-certificat-x509/
* https://www.golinuxcloud.com/openssl-subject-alternative-name/
* https://www.golinuxcloud.com/add-x509-extensions-to-certificate-openssl/