Générer un certificat SSL

ssl 5 déc. 2023

Sur le web, il est depuis fort longtemps impensable de naviguer sur un site sans que ce dernier ne propose une connexion sécurisée, donc en https.

Nous allons donc voir comment, sur votre serveur, générer et installer un certificat SSL, permettant à vos visiteurs de naviguer en https.

Toujours en restant sur une installation Alma Linux 9, il existe plusieurs possibilités pour générer un certificat, notamment via certbot et Let's Encrypt.

Nous utiliserons plutôt un script appelé acme.sh, qui évite d'installer certbot car ce dernier dépend de Python et il peut arriver de rencontrer des problèmes de dépendances de paquets.

Commençons par nous rendre dans le dossier /root/ et lancer le script d'installation, en précisant une adresse mail qui servira à vous avertir si tel certificat arrive à expiration :

curl https://get.acme.sh | sh -s [email protected]

Un dossier /root/.acme.sh/ sera alors créé avec le script et tous les fichiers nécessaires, ainsi qu'une tâche cron permettant principalement de renouveler les certificats installés.

Commençons par éditer le fichier /root/.acme.sh/account.conf :

#LOG_FILE="/root/.acme.sh/acme.sh.log"
#LOG_LEVEL=1

#AUTO_UPGRADE="1"

#NO_TIMESTAMP=1

ACCOUNT_EMAIL='[email protected]'
UPGRADE_HASH='0f573f8d562798a08cc2cbb3c87e1013a08cc2cb'

Ici vous pouvez décommenter (enlever le #) la ligne commençant par LOG_FILE, ce qui permettra d'avoir un fichier log, utile en cas d'erreurs.

Idem pour la ligne commençant par AUTO_UPGRADE, pour que le script se mette à jour automatiquement.

Dans le dossier dnsapi, vous trouverez plusieurs fichiers correspondants aux configurations propres à tel hébergeur, nécessaires pour générer des certificats wildcard, donc valides pour le domaine et tous les sous-domaines :

Nous y reviendrons plus bas.

Commençons par générer un certificat simple, la commande étant à lancer depuis le dossier du script, donc /root/.acme.sh/ dans cet article :

./acme.sh --issue -d domaine.fr -w /var/www/html

Le paramètre -w indique à quel dossier sur le serveur est rattaché domaine.fr car le script va créer un fichier temporaire et si l'autorité qui délivre le certificat arrive à accéder à ce fichier via le domaine, il sera considéré comme valide et le certificat sera généré.

Si le domaine ou sous-domaine indiqué avec le paramètre -d est bien connecté au dossier précisé par -w, le certificat sera généré :

Certaines informations ont volontairement été floutées.

Plusieurs fichiers seront générés dans le dossier /root/.acme.sh/domaine.fr_ecc/ :
- le certificat SSL au format .cer (valide 90 jours)
- la clé privée au format .key
- le certificat intermédiaire ca.cer qui indique que le certificat SSL a bien été délivré par un CA (Certificate Authority) reconnu et approuvé
- la "full chain" qui combine le certificat SSL du domaine et le ca.cer

Il ne reste plus qu'à indiquer l'emplacement de ces différents fichiers dans la configuration de votre serveur web, ce qui sera abordé dans un prochain article pour le cas d'Apache.

Grâce à la tâche cron créée par l'installation du script acme.sh, ce certificat sera renouvelé automatiquement avant qu'il n'expire.

Passons maintenant à la création de certificats wildcard, valides pour le domaine mais aussi tous ses sous-domaines, bien plus pratique lorsque l'on commence à avoir beaucoup de services et applications sur son serveur.

De plus, la méthode de validation de ces certificats wildcard ne nécessite pas d'avoir un dossier accessible en écriture (le paramètre -w de la commande ./acme.sh --issue), car tout se passe au niveau des DNS du domaine, ce qui est nécessaire dans le cas d'une application installée via Docker.

Vérifiez d'abord que vos hébergeur est bien dans la liste des fichiers du dossier dnsapi indiqué en début d'article.

Je prendrai comme exemple mon domaine webzila.fr qui est hébergé chez Gandi, et comme le fichier dns_gandi_livedns.sh est bien présent, je vais pouvoir générer un certificat SSL wildcard.

Rendez-vous d'abord dans le tableau de bord (ou le cPanel) de votre hébergeur pour générer une clé API.
Je vous laisse trouver la méthode en fonction de votre hébergeur, l'endroit et les manipulations nécessaires étant différentes de l'un à l'autre.

Une fois cette clé générée, renseignez-la dans le fichier account.conf :

GANDI_LIVEDNS_KEY='XXXXXXXXXXXXXXXXXXXXXXXX'

Je suis resté sur l'exemple de mon hébergeur.

Cette clé API va servir au script acme.sh à créer un enregistrement dans les DNS de votre hébergeur, ce qui va confirmer au CA que vous êtes bien le titulaire du domaine et donc va valider la création du certificat wildcard :

./acme.sh --issue -d domaine.fr -d '*.domaine.fr' --dns dns_gandi_livedns

La valeur à rajouter après le paramètre --dns est tout simplement le nom du fichier correspondant à votre hébergeur, dans le dossier dnsapi et en enlevant l'extension .sh .

Il est également nécessaire de préciser, avec le paramètre -d, à la fois le domaine et le wildcard, symbolisé par "*", pour que le certificat SSL soit valide pour le domaine et tous ses sous-domaines.

Après la vérification de l'enregistrement DNS généré de façon temporaire, les fichiers créés seront identiques à l'installation d'un certificat pour un domaine unique.

Petite remarque : si vous obtenez une erreur lors de la création de l'enregistrement DNS, vous pouvez changer le CA avec la commande suivante :

./acme.sh --set-default-ca --server letsencrypt

En effet, il y a certaines limitations avec le CA par défaut, à savoir ZeroSSL.

Vous pouvez vérifier la liste des certificats SSL générés par acme.sh via la commande suivante :

./acme.sh --list

Il existe beaucoup d'autres paramètres pour le script, que vous pouvez afficher via cette commande :

./acme.sh --help

Nous avons couvert l'utilité principale de acme.sh, à savoir générer des certificats SSL, afin que vos sites puissent s'afficher de façon sécurisée.

Mots clés

Samuel

Passionné par le web et les serveurs, je vous fais découvrir toutes sortes de news, de tutos, de scripts et autres points relatifs à cet univers sans limite !