{{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