Outils pour utilisateurs

Outils du site


sysadmin:linux:gestion_certificats:generer_certificat_san_localhost

Ceci est une ancienne révision du document !


Générer un certificat SAN pour les services web locaux

Lors de mes différentes tentatives je n'ai pas pu générer de certificat valide utilisant un wilcard sous un domaine de premier niveau (TLD) comme *.localhost, *.local ou *.lan. Par contre les certificats SAN génériques utilisant un wilcard à partir d'un nom de domaine de deuxième niveau étaient valides et acceptés par les navigateurs.

Le principe est de gérer un seul certificat SSL pouvant être présenté par le reverse proxy pour l'ensemble des web services tournant localement. C'est ce que permet de faire le certificat SAN contenant un champ Subject Alternate Name pouvant contenir une liste de FQDN utilisée à la place du champ Common Name voir le wiki

Après plusieurs essais il ressort que:

  • Les certificats SAN sur un TLD sont valides s'ils n'utilisent pas le wilcard;
  • Les certificats SAN génériques sur un TLD sont refusés: *.localhost, *.local, *.any sont invalides;
  • Les certificats SAN génériques sous un nom de domaine de deuxième niveau sont valides: *.any.domain est valide

Qui qu'il en soit, c'est en général une mauvaise idée de travailler directement avec localhost ou avec un TLD:

  • L'enregistrement ou la configuration de cookies peut poser des problèmes;
  • Certaines API incluses dans l'application rejettent des URL de la forme http://localhost les services peuvent alors produire des erreurs ou se comporter différemment en local;

Pour ces raisons, il est préférable de générer un certificat sur des FQDN avec au minimum des noms de domaine deuxième niveau comme *.something.top. Pour que le nom de domaine évoque bien que l'hébergement est local j'ai fait le choix d'utiliser *.host.me

# Depuis le répertoire de l'autorité de certification intermédiaire
cd intermediate_ca/
export dn=service.localhost
 
# Création de la clé privée
openssl genrsa -out private/$dn.key 2048
chmod 400 private/$dn.key
 
# Création de la CSR
openssl req -new -config CSR.cnf -key private/$dn.key -out csr/$dn.csr

Préparer le fichier des extensions X509 en complétant la section [alt_names] avec les FQDN

# Création du certificat
openssl x509 -req -extfile build_cert_with_SAN.ext -days 30 -in csr/$dn.csr -CA certs/intermediate_ca.cert.pem -CAkey private/intermediate_ca.key -CAcreateserial -out certs_x509/$dn.crt
 
# effacer la variable
unset $dn

Tester la connexion

# via cURL
curl --verbose --cacert ca-chain.cert.pem https://server.domain
 
# via openssl
true | openssl s_client -showcerts -CAfile ca-chain.cert.pem traefik.labinfo.mairie.local:443 2>/dev/null | openssl x509 -noout -text

Dans l' exemple ci-dessus le certificat de l'autorité de confiance n'est pas installé sur le système, les options --cacert pour curl et -CAfile pour openssl permettent de fournir les certificats des autorités de confiance afin de valider la chaîne de certification dans sa globalité.

Voir le wiki installer le certificat racine d'une autorité de confiance.

Renouveler le certificat

Références

sysadmin/linux/gestion_certificats/generer_certificat_san_localhost.1635448446.txt.gz · Dernière modification : 2021/10/28 19:14 de yoann