Table des matières

, , , , , ,

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:

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 installer l'autorité de certification de la mairie de Tournefeuille.

Depuis un poste client via le navigateur Web consulter l'URLhttps://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 SAN1)

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

1)
Subject Alternative Name