{{tag>sysadmin netadmin linux certificat tls ssl csr}}
====== Options de création de la CSR ======
C'est via le CLI **openssl** qu'on va pouvoir générer la **Certificate Signing Request** abrégée **CSR**. La création de la CSR est la partie la plus critique de la génération du certificat. Si la CSR n'est pas correcte:
* La signature par l'**Autorité de Certification** (**CA**) peut échouer;
* L'authentification MTLS peut ne pas fonctionner et retourner une TCP Handshake error;
* Vous serez contraint de créer de multiples certificats, un pour chaque hôte si vous n'êtes pas familiarisé avec le champ **SAN** (**S**ubject**A**lternate**N**ame)
* Les extensions X.509 ne seront pas correctement ajoutées
* etc
===== Points notables =====
* openssl consulte par défaut le fichier de configuration ''/usr/lib/ssl/openssl.cnf'' sauf si l'option **-config** est utilisée.
* Le champ ''req_distinguished_name'' liste les attributs à renseigner lors de la génération de la CSR. Cette section peut être modifiée dans le fichier de configuration openssl.cnf avec des valeurs par défaut et des conditions de validité.
* Il y a différentes stratégies applicables lors de la signature définies dans les sections ''policy_*'' du fichier de configuration. La stratégie ''policy_anything'' est normalement utilisée pour pour l'émission de certificats auto-signés où tous les champs sont optionnels sauf le ''commonName''.
* La stratégie ''policy_match'' est utilisée pour générer des certificats **RootCA**. Si vous souhaitez utiliser le certificat de cette Autorité de Certification pour signer des certificats client/serveur, les sections notées **match** doivent être identiques entre le certificat du RootCA et les certificats clients/serveurs.
* Le champs ''commonName'' est utilisé par les communications MTLS. Le champ ''commonName'' doit correspondre à l'**HOSTNAME** ou au **FQDN** du serveur sur le certificat serveur ou bien à l'**HOSTNAME** ou **FQDN** du client sur le certificat client.
* Pour permettre la haute disponibilité ou la répartition de charge un seul FQDN peut être associé à plusieurs adresses, dans ce cas on utilisera de préférence les certificats SAN. Dasn ce cas le paramètre **-extfile** peut être utilisé avec openssl pour fournir la liste des IPs valides. Dasn ce cas on fournit le nom de domaine du serveur au champ ''commonName'' lors de la génération de la CSR.
===== Définir les valeurs par défauts de la CSR =====
On peut créer un fichier de configuration a cet effet
# Fichiers de configuration des demandes de certificats
# Certificate Signing Request (CSR)
[ req ]
# définitions des options pour openssl req
default_bits = 2048
distinguished_name = distinguished_name
string_mask = utf8only
# SHA-1 is deprecated, so use SHA-2 instead.
default_md = sha256
# Extension to add when the -x509 option is used.
#x509_extensions = v3_ca
[ distinguished_name ]
countryName = Country Name (2 letter code)
countryName_default = FR
countryName_min = 2
countryName_max = 2
stateOrProvinceName = State or Province Name
stateOrProvinceName_default = France
localityName = Locality Name
localityName_default = Haute Garonne
0.organizationName = Organization Name
0.organizationName_default = Mairie de Tournefeuille
organizationalUnitName = Organizational Unit Name
organizationalUnitName_default = Labo Informatique
emailAddress = Email Address
emailAddress_default = administrateur@mairie-tournefeuille.fr
commonName = Common Name (user name, hostname or FQDN)
commonName_max = 64
===== Création de la CSR =====
Pour créer la CSR:
openssl req -new -config CSR.cnf -key private/local.key -sha256 -out csr/local.csr
Un mot sur les options utilisées:
* L'option **req** pour qu'openssl génère une CSR;
* **-config** pour utiliser le fichier de configuration préparé précédemment;
* **-key** la clé privée à utiliser pour signer la requête CSR;
* **-out** le fichier d'enregistrement de la CSR;
===== Création du certificat =====
Pour créer le certificat, la CSR émise doit être validée/signée par l'Autorité de Certification; Dans notre cas l'autorité de certification intermédiaire telle que définie dans le wiki
Deux options openssl permettent la création d'un certificat
* openssl ca: contrôle la validité des champs en fonction de la stratégie utilisée. Base de suivi des certificats émis
* openssl x509: pas de vérification, pas de suivi
Dans l'exemple ci dessous la CSR émise contient volontairement un ''Country Name'' différent. La politique du CA intermédiaire est définie pour refuser les requêtes dont le champ ''Country Name'' n'est pas identique:
openssl ca -config openssl.cnf -extensions server_cert \
-days 365 -notext -md sha256 \
-in csr/local.csr -out certs/local.cert.pem
La commande retourne:
Using configuration from openssl.cnf
Enter pass phrase for /home/yoann/.private/intermediate_ca/private/intermediate_ca.key:
Check that the request matches the signature
Signature ok
The countryName field is different between
CA certificate (FR) and the request (BE)
Si on utilise l'option x509, la création du certificat aboutie
openssl x509 -req -days 90 -in csr/local.csr -CA certs/intermediate_ca.cert.pem -CAkey private/intermediate_ca.key -CAcreateserial -out certs_x509/local.crt
On peut vérifier le contenu du certificat via la commande:
openssl x509 -noout -text -in certs_x509/local.crt
===== Le certificat SAN =====
Un certificat **SAN** (abrégeant **S**ubject **A**lternative **N**ame) peut être utilisé sur de multiples noms de domaines par exemple abc.com ou xyz.com où les noms de domaines sont complètement différents mais pourront utiliser ce même certificat.
* De multiples noms peuvent être associés au certificat
* On définit une liste dadresse IP ou ed noms de domaines qui pourront être utilisés en lieu et place du champ ''Common Name''.
On parle parfois de certificat wilcard
Avant de pouvoir créer des certificats SAN il est nécessaire d'ajouter certaines valeurs à la configuration des listes d'extensions x509 d'openssl.
# Fichiers de configuration des demandes de certificats
# Certificate Signing Request (CSR)
[ req ]
# définitions des options de l'argument openssl req
default_bits = 2048
distinguished_name = distinguished_name
string_mask = utf8only
# SHA-1 is deprecated, so use SHA-2 instead.
default_md = sha256
req_extensions = req_ext_san
# Extension to add when the -x509 option is used.
#x509_extensions = v3_ca
[ distinguished_name ]
countryName = Country Name (2 letter code)
countryName_default = FR
countryName_min = 2
countryName_max = 2
stateOrProvinceName = State or Province Name
stateOrProvinceName_default = France
localityName = Locality Name
localityName_default = Haute Garonne
0.organizationName = Organization Name
0.organizationName_default = Mairie de Tournefeuille
organizationalUnitName = Organizational Unit Name
organizationalUnitName_default = Labo Informatique
emailAddress = Email Address
emailAddress_default = administrateur@mairie-tournefeuille.fr
commonName = Common Name (user name, hostname or FQDN)
commonName_max = 64
[ req_ext_san ]
subjectAltName = @alt_names
[alt_names]
IP.1 = 127.0.0.1
DNS.1 = fbaea6818592
DNS.2 = localhost
DNS.3 = node-7c87
La commande de signature du CSR avec SAN diffère, on spécifie le fichier avec les extensions à intégrer:
openssl x509 -req -days 90 -in csr/local.csr -CA certs/intermediate_ca.cert.pem -CAkey private/intermediate_ca.key -CAcreateserial -extfile server_san_ext.cnf -out certs_x509/local.crt
===== Références =====
* https://www.golinuxcloud.com/openssl-generate-csr/
* https://www.golinuxcloud.com/openssl-generate-csr-create-san-certificate/
* https://www.golinuxcloud.com/things-to-consider-when-creating-csr-openssl/
* https://fabianlee.org/2018/02/17/ubuntu-creating-a-self-signed-san-certificate-using-openssl/
* https://techbrahmana.blogspot.com/2013/10/creating-wildcard-self-signed.html