Dans le but de mettre une connexion https sur certains de mes sites NGINX je me suis intéressé à la génération du certificat et de la clé nécessaire pour cette opération.
Au fil de mes lectures j’ai pu constater la puissance de la commande openssl permettant de générer ces fichiers mais aussi la difficulté à en appréhender le fonctionnement.
En effet pour réaliser une même tache il est possible de lancer x commandes différentes avec y options différentes.
De même pour passer un site en https, certains décrivent la création d’une clé et d’un certificat auto-signé directement utilisé par le serveur web et d’autres créent d’abord une autorité de certification (sous la forme d’une clé et d’un certificat auto-signé) qu’ils utilisent ensuite pour signer un autre certificat qui lui sera paramétré dans le serveur Web.
Ci-dessous les 3 types d’opérations trouvés :
- Génération d’un certificat serveur auto-signé (et de sa clé) pour utilisation directe par le serveur web.
- Création d’une autorité de certification
- Génération d’un certificat serveur et signature de ce dernier pour une autorité de certification
Pour chacune des ces opérations j’ai listés (non exhaustif) les différentes syntaxes trouvées (j’ai arrangé l’ordre des paramètres pour faciliter la comparaison)
L’objectif de cet article n’est pas de donner un mode opération pour créer un certificat et sa clé (je le ferais dans un autre article) mais il s’agit de mettre en avant la richesse et la difficulté à comprendre ce qui est fait avec la commande openssl…
(il s’agit d’un travail de débroussaillage pour choisir mon mode opératoire)
Premier point un peu en dehors du sujet, les extensions des fichiers, on trouve de tout :
- clé : key, pem
- demande de certificat : csr, pem
- certificat : crt, pem
Cela montre sans même rentrer dans le détail des commandes la difficulté à s’y retrouver….
Création d’un certificat serveur auto-signé
Solution 1 : Génération de la clé et du certificat auto-signé en 1 seule fois
nginx: serveur web complet bluffant
openssl req -x509 -nodes -days 365 -newkey rsa:1024 -out /etc/nginx/conf.d/default.pem -keyout /etc/nginx/conf.d/default.key chmod 440 /etc/nginx/conf.d/default.pem /etc/nginx/conf.d/default.key
mkdir /etc/nginx/certificats cd /etc/nginx/certificats openssl req -new -x509 -nodes -out mon-site.fr.crt -keyout mon-site.fr.key
Solution 2 : en plusieurs commandes
Génération de la clé, génération de la demande de certificat, suppression de la passphrase et auto-signature du certificat
# cd /usr/local/nginx/conf # openssl genrsa -des3 -out server.key 1024 # openssl req -new -key server.key -out server.csr # cp server.key server.key.org # openssl rsa -in server.key.org -out server.key # openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
Création d’une autorité de certification
La création de l’autorité de certification peut se faire en plus ou moins d’étapes, avec divers options voici celles trouvées de ci de là.
Solution 1 : Génération de la clé et du certificat en 1 seule fois
openssl req -x509 -newkey rsa:2048 -days 1825 -keyout private/cacertkey.pem -out cacert.pem
openssl req -x509 -newkey rsa:2048 -new -days 3650 -keyout private/cacert.key -out cacert.pem
openssl req -x509 -new -days 1825 -config openssl.my.cnf -extensions v3_ca -keyout private/myca.key -out certs/myca.crt
Quelques remarque sur ces syntaxes :
-new est optionnel lorsque -newkey rsa:xxx est spécifié (syntaxe 4) , en en effet ce dernier crée une clé et une demande de certificat tandis que -new ne crée que la demande de certificat.
Dans la syntaxe 6 la clé est générée malgré la seul présence de l’option -new qui n’est sensée ne générer que le certificat. Mais en l’absence du mot-clé -key spécifiant une clé à utiliser pour créer le certificat, une nouvelle clé est générée en utilisant les données du fichier de configuration openssl.conf (ici l’auteur précise un autre fichier de configuration à utiliser plutôt que celui standard avec l’option -config)
Enfin il ne s’agit pas d’une demande de certificat qui est généré comme indiqué ci-dessus mais directement un certificat grâce à l’adjonction de l’option -x509
Solution 2 : Création de la clé privé puis création du certificat auto-signé
openssl genrsa -des3 2048 -out /etc/ssl/CA/private/my-ca.key openssl -req x509 -key /etc/ssl/CA/private/my-ca.key -days 3650 > my-ca.crt
openssl genrsa -des3 2048 -out elao-ca.key openssl req -x509 -new -key elao-ca.key -days 3650 -out elao-ca.crt
La différence entre ces 2 sources réside dans l’utilisation de 2 commandes différentes.
- req qui permet de générer un nouveau (-new) certificat auto-signé (-x509)
- x509 utilitaire de gestion des certificats (affichage, conversion) utilisé ici pour créer un nouveau certificat (-req)
Et de la méthode sortie (option out contre redirection)
Solution 3 : Création de la clé privé, demande de certificat et signature du certificat
openssl genrsa -des3 -out ca.key 2048 openssl req -new -key ca.key -out ca.csr openssl x509 -req -days 3650 -in ca.csr -signkey ca.key -out ca.crt
Création d’un certificat serveur et signature par l’autorité de certification
Solution 1 : Création de la clé, suppression du mot de passe, demande de certificat, signature du certificat avec notre autorité
openssl genrsa -des3 -out server.key 1024 openssl rsa -in server.key -out server.key openssl req -new -key server.key -out server.csr openssl x509 -req -in server.csr -out server.crt -CA ca.crt -CAkey ca.key -CAcreateserial
openssl genrsa -des3 -out elao-server.key 1024 openssl rsa -in elao-server.key -out elao-server.key.insecure openssl req -new -key elao-server.key -out elao-server.csr openssl x509 -req -in elao-server.csr -out elao-server.crt -sha1 -CA elao-ca.crt -CAkey elao-ca.key -CAcreateserial -days 3650
L’option -CAcreateserial n’est nécessaire que lors de la signature du premier certificat par notre autorité de certification, elle peut même ne pas être nécessaire du tout si on a créé préalablement le fichier paramétré sous le nome database dans le fichier openssl.conf.
Solution 2 : Création de la clé sans mot de passe, demande de certificat, signature du certificat avec notre autorité
openssl genrsa 1024 -out www.test.net.key openssl req -new -key www.test.net.key -out www.test.net.csr openssl ca -in www.test.net.csr -out www.test.net.crt
Le fait de ne pas mettre l’option -des3 génère une clé directement sans mot de passe
La signature se fait avec la commande ca au lieu de x509, mais je ne comprends pas pas où l’on spécifie que l’on doit utiliser notre autorité de certification, son certificat et sa clé (my-ca.crt et my-ca.key, voir ci-dessus solution 2)
Pour moi avec cette méthode le certificat généré est auto-signé ce qui n’est pas le but recherché.
Solution 3 : Création de la clé et de la demande de certificat, signature du certificat avec notre autorité
openssl req -newkey rsa:2048 -keyout private/server.key -out server-req.pem openssl ca -in serveur-req.pem -out signedcerts/serveur-cert.pem -cert cacert.pem -keyfile private/cacertkey.pem -days 365
openssl req -new -keyout private/server.key -out server.csr -config openssl.my.cnf -nodes -days 365 openssl ca -infiles server.csr -out certs/server.crtc -config openssl.my.cnf -policy policy_anything
Concernant les commande de génération de al clé et de la demande de certificat :
- -new ne crée que la clé sauf si on n’utilise pas l’option -key auquel cas la clé est aussi générée
- -newkey rsa:xxx crée une clé et un certificat
- Ce sont des demandes de certificat qui sont générés (contrairement aux commandes que l’on a utilisé pour la création de l’autorité de certification solution 1) car nous n’avons pas l’option -x509
- L’option -nodes permet d’indiquer que la clé qui doit être générée ne doit pas être protégée par un mot de passe (passphrase)
Enfin les commande de signature des certificats doivent pouvoir être simplifiées comme dans la solution 2 (juste -in et -out)
Sources :
- Openssl – création d’une autorité de certification et Openssl – générer et signer une demande de signature(CSR) | 404Blog
- Autorité de certification openssl et Autorité de certification, le retour
- OpenSSL : création et mise en place d’une PKI – K-Tux
- Openssl pratique
- Nginx , SSL et plus encore ..
- Be your own Certificate Authority (CA)
- Créer une autorité de certification et des certificats SSL auto-signés
- Top 20 Nginx WebServer Best Security Practices
A voir pour les extensions de fichier :
- http://en.wikipedia.org/wiki/X.509
- http://marc.info/?l=openssl-users&m=128008468329998&w=2
- Be your own Certificate Authority (CA)
Source d’info sur les commandes les pages MAN (par contre il faut s’y retrouver avec toutes les options !!)
Image par Erik Pitti (photo de la machine Enigma utilisé par les Allemands lors de la 2de guerre mondial pour crypter leur communication)