Ci-dessous, les différences entre deux révisions de la page.
| Prochaine révision | Révision précédente | ||
| sysadmin:linux:gestion_certificats:generer_certificat_san_localhost [2021/10/28 10:27] – créée yoann | sysadmin:linux:gestion_certificats:generer_certificat_san_localhost [2022/08/02 15:55] (Version actuelle) – ajout d'une référence externe yoann | ||
|---|---|---|---|
| Ligne 1: | Ligne 1: | ||
| {{tag> | {{tag> | ||
| - | ====== Générer un certificat SAN pour localhost | + | ====== Générer un certificat SAN pour les services web locaux |
| <note warning> | <note warning> | ||
| - | Lors de mes différentes tentatives je n'ai pas pu générer | + | Lors de mes différentes tentatives je n'ai pas pu générer |
| + | |||
| + | Le principe est de gérer un seul certificat SSL pouvant être présenté par le reverse proxy pour l' | ||
| + | |||
| + | Après plusieurs essais il ressort que: | ||
| + | * Les certificats SAN listant des TLD sont valides s'ils n' | ||
| + | * Les certificats SAN génériques sur un domaine de deuxieme niveau sont refusés: *.localhost, | ||
| + | * Les certificats SAN utilisant | ||
| + | |||
| + | De ce que j'ai pu déduire le caractère générique (étoile ou **wilcard**) ne peut s' | ||
| + | |||
| + | Pour rappel le FQDN est formaté ainsi: server.subdomain.domain.tld. | ||
| + | |||
| + | Notons également que c'est en général une mauvaise idée de travailler directement avec .localhost ou avec un TLD: | ||
| + | * L' | ||
| + | * Certaines API incluses dans l' | ||
| + | |||
| + | |||
| + | |||
| + | Ci-dessous pour rappel les manipulations faites avec un certificat de test | ||
| + | |||
| + | <code bash> | ||
| + | # Affiche la valeur du champ SAN (Subject Alternate Name) | ||
| + | openssl x509 -noout -text -in service.localhost.crt | grep -i -A 1 " | ||
| + | X509v3 Subject Alternative Name: | ||
| + | IP Address: | ||
| + | </code> | ||
| + | |||
| + | Comme on peut le voir ci-dessus, le champ SAN contient une adresse IP 127.0.0.1, si on contacte le serveur qui a cette même IP tout se passe bien: | ||
| + | |||
| + | <code bash> | ||
| + | curl -v --cacert ca-chain.cert.pem https:// | ||
| + | ... | ||
| + | * subjectAltName: | ||
| + | </ | ||
| + | |||
| + | Le champ SAN contient deux noms localhost et any, ici encore tout se passe bien: | ||
| + | <code bash> | ||
| + | curl -v --cacert ca-chain.cert.pem https:// | ||
| + | ... | ||
| + | * subjectAltName: | ||
| + | </ | ||
| + | |||
| + | C'est pour les valeurs *.any et *.localhost du certificat que le résultat obtenu est différent de celui attendu. Le caractère générique devrait nous permettre d' | ||
| + | |||
| + | <code bash> | ||
| + | curl -v --cacert ca-chain.cert.pem https:// | ||
| + | ... | ||
| + | * subjectAltName does not match traefik.any | ||
| + | * SSL: no alternative certificate subject name matches target host name ' | ||
| + | * Closing connection 0 | ||
| + | * TLSv1.3 (OUT), TLS alert, close notify (256): | ||
| + | curl: (60) SSL: no alternative certificate subject name matches target host name ' | ||
| + | More details here: https:// | ||
| + | </ | ||
| + | |||
| + | Cette erreur ne se manifeste plus au niveau inférieur avec *.service.localhost | ||
| + | <code bash> | ||
| + | curl -v --cacert ca-chain.cert.pem https:// | ||
| + | ... | ||
| + | * subjectAltName: | ||
| + | </ | ||
| + | |||
| + | |||
| + | Pour ces raisons, il est préférable de générer un certificat SAN avec des FQDN ( c'est à dire des noms de domaine de troisième niveau comme '' | ||
| + | |||
| + | En utilisant .localhost en TLD on évite tout risque collision (La RFC 2606 le définit comme l'un des quatre domaines de premier niveau réservé). Aucun sous-domaines réels dans le système de nom de domaine (Domain Name System) d' | ||
| + | |||
| + | |||
| + | Pour que le nom de domaine évoque bien que l' | ||
| + | |||
| + | <code bash> | ||
| + | # Depuis le répertoire de l' | ||
| + | cd intermediate_ca/ | ||
| + | export dn=localhost | ||
| + | |||
| + | # Création de la clé privée | ||
| + | openssl genrsa -out private/ | ||
| + | chmod 400 private/ | ||
| + | |||
| + | # Création de la CSR | ||
| + | openssl req -new -config CSR.cnf -key private/ | ||
| + | </ | ||
| + | |||
| + | Préparer le fichier des extensions X509 en complétant la section '' | ||
| + | |||
| + | <code bash> | ||
| + | # Création du certificat | ||
| + | openssl x509 -req -extfile build_cert_with_SAN.ext -days 30 -in csr/$dn.csr -CA certs/ | ||
| + | |||
| + | # effacer la variable | ||
| + | unset $dn | ||
| + | </ | ||
| + | |||
| + | |||
| + | |||
| + | <code bash> | ||
| + | # via cURL | ||
| + | curl --verbose --cacert ca-chain.cert.pem https:// | ||
| + | |||
| + | # via openssl | ||
| + | true | openssl s_client -showcerts -CAfile ca-chain.cert.pem traefik.labinfo.mairie.local: | ||
| + | </ | ||
| + | |||
| + | Dans l' exemple ci-dessus le certificat de l' | ||
| + | |||
| + | Voir le wiki [[sysadmin: | ||
| + | |||
| + | ===== Renouveler le certificat ===== | ||
| + | |||
| + | |||
| + | ===== Références ===== | ||
| - | Pour pouvoir générer un certificat valide pour différents services sous localhost | + | * https:// |
| + | * https:// | ||
| + | * https:// | ||
| + | * https:// | ||
| + | * https:// | ||
| + | * https:// | ||
| + | * https:// | ||