Créer une CSR avec des SAN sur OpenSSL

Publié par Mickael Rigonnaux le

Bonjour à tous ! Aujourd’hui un article sur OpenSSL pour savoir comment créer une CSR avec des SAN.

CSR ?

Tout d’abord une petite explication, une CSR ou Certificate Signing Request est tout simplement une demande de certificat. Ce fichier issu de votre clé privée va contenir toutes les informations nécessaires à la signature de votre certificat, le CN, les SAN, etc. C’est ce fichier que vous devez transmettre à votre autorité de certification pour demander un certificat. Une CSR contiendra donc une clé publique et les différentes informations, la clé privée n’est heureusement pas incluse et permet juste de signer ce fichier.

Les CSR sont définies dans le standard PKCS8 et son but principal est de ne pas faire transiter les clés privées.

Ces demandes sont généralement sous cette forme :

-----BEGIN CERTIFICATE REQUEST-----
MIIBMzCB3gIBADB5MQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEW
MBQGA1UEBxMNU2FuIEZyYW5jaXNjbzEjMCEGA1UEChMaV2lraW1lZGlhIEZvdW5k
YXRpb24sIEluYy4xGDAWBgNVBAMUDyoud2lraXBlZGlhLm9yZzBcMA0GCSqGSIb3
DQEBAQUAA0sAMEgCQQC+ogxM6T9HwhzBufBTxEFKYLhaiNRUw+8+KP8V4FTO9my7
5JklrwSpa4ympAMMpTyK9cY4HIaJOXZ21om85c0vAgMBAAGgADANBgkqhkiG9w0B
AQUFAANBAAf4t0A3SQjEE4LLH1fpANv8tKV+Uz/i856ZH1KRMZZZ4Y/hmTu0iHgU
9XMnXQI0uwUgK/66Mv4gOM2NLtwx6kM=
-----END CERTIFICATE REQUEST-----

SAN ?

Un Subject Alternative Name est une extension de la norme X509, cela permet d’ajouter des informations additionnelles dans un certificat. Ca permet par exemple de créer un certificat valable pour plusieurs domaines, par exemple :

  • www.net-security.fr
  • demo.net-security.fr
  • test.net-security.fr

Un SAN peut contenir plusieurs informations comme des adresses mails, des adresses IP ou des noms de domaine.

Créer une CSR avec des SAN

Les commandes suivantes sont lancées depuis la distribution GNU/Linux Arch en utilisant OpenSSL 1.1.1g.

Tout d’abord il faut créer une clé privée :

## RSA
openssl genrsa -out exemple.key 2048

# ECC
openssl ecparam -genkey -name prime256v1 -out exemple.key

Si vous voulez créer simplement une CSR sans SAN, vous pouvez utiliser les commandes suivantes :

## RSA
openssl req -new -sha256 -key exemple.key -out exemple.csr

## ECC
openssl req -new -sha256 -key exemple.key -nodes -out exemple.csr

Pour générer une CSR avec des SANs, le plus simple est selon moi d’utiliser un fichier de configuration comme celui-ci :

[ req ]
prompt = no
distinguished_name = dn
req_extensions = req_ext

[ dn ]
CN = exemple.com
emailAddress = ssl@exemple.com
O = Societe
OU = Departement
L = Ville
ST = Etat
C = FR

[ req_ext ]
subjectAltName = DNS: www.exemple.com, DNS: mail.exemple.com, IP: 192.168.1.1

En utilisant ce fichier nous allons créer une CSR pour exemple.com, www.exemple.com, mail.exemple.com et 192.168.1.1. Dans mon cas le fichier est nommé exemple.conf.

Une fois le fichier en place il suffit de lancer la commande suivante en utilisant votre clé générée dans la partie précédente :

openssl req -new -config exemple.conf -key exemple.key -out exemple.csr

La CSR est générée automatiquement vu que l’option « prompt » est désactivée. Vous pouvez vérifier les informations de votre CSR avec la commande suivante :

openssl req -text -noout -verify -in exemple.csr

On voit bien les différentes informations présentes dans notre fichier de configuration. Il ne reste qu’à transmettre cette CSR à une autorité de certification pour signature.

Sources

J’espère que cet article vous aura plu, si vous avez des questions ou des remarques sur ce que j’ai pu écrire n’hésitez pas à réagir avec moi par mail ou en commentaire !

Merci pour votre lecture et à bientôt !

MRigonnaux


3 commentaires

jfp · 13 mai 2020 à 6 h 35 min

Sans fichier:
DOMAIN=example.com
ALTNAME=DNS:mail,DNS:web
openssl req -nodes -newkey rsa:2048 -nodes -keyout $DOMAIN.key -out $DOMAIN.csr \
-subj « /C=FR/L=Paris/O=Example Companie/CN=www.$DOMAIN/emailAddress=admin@example.com » \
-reqexts SAN -extensions SAN -config <(cat /etc/pki/tls/openssl.cnf; printf "[SAN]\nsubjectAltName=${ALTNAME}")

forzagreen · 20 octobre 2020 à 10 h 09 min

Merci beaucoup pour le tutorial.
Pour information, à partir de la version 1.1.1 d’openssl, ils ont rajouté l’option -addext :
« `
openssl req -new -subj « /C=GB/CN=foo » \
-addext « subjectAltName = DNS:www.exemple.com » \
-addext « certificatePolicies = 1.2.3.4 » \
-newkey rsa:2048 -keyout key.pem -out req.pem
« `
Ref:
https://security.stackexchange.com/a/183973/151219
https://github.com/levitte/openssl/blob/OpenSSL_1_1_1/doc/man1/req.pod

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.