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

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

Nginx , SSL et plus encore ..

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

(8)

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

(3)

openssl req -x509 -newkey rsa:2048 -days 1825 -keyout private/cacertkey.pem -out cacert.pem

(4)

openssl req -x509 -newkey rsa:2048 -new -days 3650 -keyout private/cacert.key -out cacert.pem

(6)

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é

(1)

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

(7)

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

(2)

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é

(2)

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

(7)

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é

(1)

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é

(3)

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

(6)

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 :

  1. et Openssl – générer et signer une demande de signature(CSR) | 404Blog
  2. Autorité de certification openssl et Autorité de certification, le retour
  3. OpenSSL : création et mise en place d’une PKI – K-Tux
  4. Openssl pratique
  5. Nginx , SSL et plus encore ..
  6. Be your own Certificate Authority (CA)
  7. Créer une autorité de certification et des certificats SSL auto-signés
  8. Top 20 Nginx WebServer Best Security Practices

A voir pour les extensions de  fichier :

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)

Les commentaires sont fermés.