Tech Blog.

Thoughts, stories, ideas.

Créer des certificats OpenSSL x509

29. June 2017

Il y a (encore) divers serveurs sur Internet qui n’ont pas ou seulement une configuration SSL/TLS inadéquate. Ce ne sont pas seulement des serveurs web (comme nginx ou Apache), mais aussi des serveurs XMPP/Jabber et des serveurs de messagerie. Les clés et certificats ainsi que les paramètres Diffie-Hellman sont requis comme base pour chaque configuration SSL/TLS. Cet article résume et explique brièvement les commandes les plus importantes d’OpenSSL.

Créer des clés et des certificats

Afin de créer des clés privées et des certificats à la main, voici quelques commandes utiles et leurs explications.

Formats

Il existe différents formats pour stocker les certificats et les clés. Dans ce qui suit, le format PEM est toujours utilisé, ce qui est mieux supporté par la plupart des outils, mais les fichiers sont plus grands que par exemple le format DER, car PEM est composé de caractères ASCII et DER est binaire. Les terminaisons typiques des certificats PEM sont .pem ou .crt. Les certificats au format DER doivent avoir la terminaison .der.

Le format PEM est facile à reconnaître car le contenu des fichiers commence par -----BEGIN CERTIFICATE----- et se termine par -----END CERTIFICATE-----. Un bon aperçu des formats et de leur conversion dans d’autres formats est expliqué sur ssl.com.

Voici une liste des formats les plus courants :

  • PEM : Terminer .pem, .crt, .cer
  • DER : Extension .der
  • PKCS#7 : Extension .p7b, .p7c
  • PKCS#12 : poste .p12.
  • PFX : Extension .pfx

Créer une demande de signature de certificat

Les demandes de signature de certificats (CSR) sont des demandes de nouveaux certificats. Ceux-ci doivent ensuite être signés par une autorité de certification (AC) ou auto-signés. Pour qu’un CSR puisse être créé, une clé privée est d’abord nécessaire. Normalement, chaque fois qu’un certificat est demandé, une nouvelle demande de signature de certificat doit être créée.

Dans un premier temps, une clé RSA de 4096 bits est créée. Ceci peut être considéré comme sûr selon les normes en vigueur. Dans la deuxième étape, le CSR est créé, qui est signé avec SHA256 (de nombreuses valeurs par défaut sont toujours SHA1, donc SHA256 doit être spécifié explicitement). Pour plus d’informations sur la création de clés RSA, consultez la page de manuel de genrsa ou req pour les demandes de signature de certificats.

$ openssl genrsa -out example.com.key 4096
$ openssl req -new -sha256 -key example.com.key -out example.com.csr

Ceci est également possible en une seule étape. Ici, une CSR est créée directement et OpenSSL est invité à créer la clé privée correspondante.

$ openssl req -new -sha256 -nodes -newkey rsa:4096 -keyout example.com.key -out example.com.csr

Créer un certificat auto-signé

Les certificats auto-signés peuvent être utilisés pour tester rapidement des configurations SSL ou sur des serveurs sur lesquels on ne vérifie jamais si un certificat a été correctement signé par une autorité de certification. Ceci peut être créé avec la commande suivante. Il crée une clé privée, génère une demande de signature de certificat à partir de celle-ci et la signe avec la clé privée. D’où le certificat, qui est stocké dans example.com.pem.

$ openssl req -x509 -sha256 -nodes -newkey rsa:4096 -keyout example.com.key -days 730 -out example.com.pem

Créez votre propre CA et signez les certificats avec.

Les certificats normaux ne devraient pas avoir l’autorisation de signer d’autres certificats, mais des certificats spéciaux devraient être utilisés, appelés Autorités de certification (AC).

Si le nombre de clients est gérable ou dans d’autres cas particuliers, une autorité de certification (AC) distincte peut être créée. Ceci est nécessaire, par exemple, pour de nombreux réseaux privés virtuels (VPN) où le certificat du serveur et de tous les clients doit être signé.

Nous créons d’abord un fichier (nom de fichier par exemple x509.ext) dans lequel les extensions x509 sont définies. Il y a deux sections pour cela, l’une pour l’AC et l’autre pour les certificats de serveur.

[ ca ]
# X509 extensions for a ca
keyUsage                = critical, cRLSign, keyCertSign
basicConstraints        = CA:TRUE, pathlen:0
subjectKeyIdentifier    = hash
authorityKeyIdentifier  = keyid:always,issuer:always

[ server ]
# X509 extensions for a server
keyUsage                = critical,digitalSignature,keyEncipherment
extendedKeyUsage        = serverAuth,clientAuth
basicConstraints        = critical,CA:FALSE
subjectKeyIdentifier    = hash
authorityKeyIdentifier  = keyid,issuer:always

Ensuite, nous créons les certificats CA et serveur.

La première étape consiste à créer une nouvelle clé privée et un certificat, qui sert ensuite d’autorité de certification. Dans cet exemple, le certificat de l’autorité de certification a une date d’expiration de 3 ans. Ce certificat ne peut être utilisé que pour signer d’autres certificats (ceci est défini dans le fichier d’extension dans la section ca).

Dans la deuxième étape, le certificat de serveur est créé et signé par l’AC. Le certificat du serveur est fixé une date d’expiration de 2 ans. Un fichier de numéros de série CA est également créé s’il n’existe pas déjà. Ceci est requis par l’AC pour que l’AC connaisse le numéro de série actuel. Pendant la signature, le certificat de serveur est limité à agir uniquement en tant que serveur ou client et à ne pas signer d’autres certificats. Pour plus d’informations, voir la page de manuel x509 et x509v3_config.

$ openssl req -new -sha256 -nodes -newkey rsa:4096 -keyout CA.key -out CA.csr
$ openssl x509 -req -sha256 -extfile x509.ext -extensions ca -in CA.csr -signkey CA.key -days 1095 -out CA.pem
$ openssl req -new -sha256 -nodes -newkey rsa:4096 -keyout www.example.com.key -out www.example.com.csr
$ openssl x509 -req -sha256 -CA CA.pem -CAkey CA.key -days 730 -CAcreateserial -CAserial CA.srl -extfile x509.ext -extensions server -in www.example.com.csr -out www.example.com.pem

Afficher les demandes de certificat et de signature de certificat

Le contenu des certificats et des demandes de signature de certificats peut être mieux affiché avec OpenSSL. En plus de l’ensemble du contenu (option “texte”), seules des parties de celui-ci peuvent être affichées, par exemple la date de création et la date d’expiration peuvent être affichées avec des “dates”. La liste correspondante se trouve dans la page de manuel (man 1 x509) sous Options d'affichage.

  • Certificat
$ openssl x509 -in exemple.com.pem -noout -texte
  • Demande de signature de certificat
$ openssl req -in exemple.com.csr -noout -text

Créer un paramètre Diffie-Hellman

Les paramètres Diffie-Hellman sont nécessaires pour le secret de transmission. La commande suivante crée des paramètres Diffie-Hellman avec 4096 bits. Il n’est pas nécessaire de créer des paramètres aussi grands, 2048 devrait suffire. Selon la machine, la création peut prendre beaucoup de temps. Il peut être utile de les créer sur une machine matérielle (car il y a plus d’entropie) et de les transférer ensuite sur la machine virtuelle.

$ openssl dhparam -out dh4096.pem 4096

Convertir

Les certificats peuvent être convertis dans d’autres formats en utilisant OpenSSL. Parfois, une étape intermédiaire est nécessaire. Les conversions les plus courantes, de DER à PEM et vice versa, peuvent être effectuées avec les commandes suivantes :

$ openssl x509 -in cert.pem -outform der -out cert.der

et

$ openssl x509 -in cert.der -inform der -outform pem -out cert.pem

Les formats PKCS#12 et PFX peuvent être convertis avec les commandes suivantes.

PFX (clé privée et certificat) à PEM (clé privée et certificat) :

$ openssl pkcs12 -in keyStore.pfx -out keyStore.pem -nodes

PEM (clé privée et certificat) à PFX (clé privée et certificat) :

$ openssl pkcs12 -export -out certificate.pfx -inkey privateKey.key -in certificate.crt -certfile CACert.crt

D’autres commandes de conversion sont disponibles sur la page mentionnée ci-dessus. (ssl.com).