Let's Encrypt
Créer un certificat Let's Encrypt avec Certbot (Debian)
Prérequis : disposer d'un serveur hébergeant au minimum une Debian 8.
Let's Encrypt est une autorité de certification (CA) délivrant des certificats SSL signés. Afin de vérifier que le demandeur contrôle le(s) domaine(s) concerné(s) par ce certificat, Let's Encrypt recommande l'utilisation de l'outil Certbot, créé par l'EFF.
À noter que les clefs privées générées par Certbot restent sur mon serveur à tout instant, et ne sont jamais acheminées sur les serveurs de Let's Encrypt.
1) Ajouter les enregistrements dans le DNS
Afin d'effectuer les vérifications de contrôle du domaine, Let's Encrypt demande de créer un enregistrement A pour chaque domaine qui sera cité dans le certificat.
Dans cet article, je vais créer un certificat qui gèrera les domaines mondomaine.com et abc.mondomaine.com. Je dois donc créer deux enregistrements A dans la zone DNS liée au domaine:
mondomaine.com IN A 12.34.56.78
abc.mondomaine.com IN A 12.34.56.78
2) Ajouter les backports à la liste des dépôts accessibles
Je dois d'abord connaître la version de ma Debian.
Puis j'ajoute à mes dépôts le dépôt backports qui dépend de ma distribution:
# Pour Debian 8 (Jessie):
deb http://ftp.debian.org/debian jessie-backports main
# Pour Debian 9 (Stretch):
deb http://ftp.debian.org/debian stretch-backports main
3) Installer certbot
# Pour Debian 8 (Jessie):
sudo apt install certbot -t jessie-backports
# Pour Debian 9 (Stretch):
sudo apt install certbot -t stretch-backports
4) Ouvrir le port 80
Afin de permettre à Let's Encrypt de vérifier que je contrôle le domaine (DV, Domaine Validation), je dois ouvrir le port 80. Dans le détail, Certbot va lancer son serveur web embarqué pour servir des fichiers aux noms aléatoires, que Let's Encrypt va tenter de lire en ciblant les domaines mentionnés dans les enregistrements A.
Pour ouvrir le port 80 avec iptables :
sudo iptables -I INPUT -p tcp --dport 80 -j ACCEPT
De plus, je dois arrêter momentanément un éventuel serveur web (Apache, Nginx, ...) qui écouterait sur le port 80 :
# Exemple pour stopper le service apache2
sudo systemctl stop apache2
5) Créer le certificat
Pour créer le certificat, je lance la commande suivante :
sudo certbot certonly \
--standalone \
--preferred-challenges=http \
--email contact@mondomaine.com \
--agree-tos \
--no-eff-email \
--cert-name abc \
--rsa-key-size 4096 \
--domain mondomaine.com \
--domain abc.mondomaine.com
Explication des options :
- certonly : vérifie que je contrôle le(s) domaine(s), mais ne modifie pas les fichiers de configuration de mon serveur.
- --standalone : le mode de vérification pour la validation du contrôle du nom de domaine.
- --preferred-challenges=http : [Optionnel] effectue la vérification de contrôle des domaines via le port 80. On peut aussi choisir la valeur tls-sni pour le port 443. Si cette option est absente, c'est Certbot qui choisit le port.
- --email contact@mondomaine.com : [Optionnel] mon email de contact pour que Let's Encrypt me prévienne en cas de problème (oubli de renouvellement, problème sur leurs serveurs...). Si cette option est absente, c'est le prompt qui demandera un email.
- --agree-tos : [Optionnel] permet d'accepter les Conditions d'Utilisation (Terms Of Services). Si cette option est absente, c'est le prompt qui posera la question.
- --no-eff-email : [Optionnel] permet de refuser de partager son adresse email avec l'EFF (on peut accepter en mettant l'option --eff-email à la place). Si cette option est absente, c'est le prompt qui posera la question.
- --cert-name abc : [Optionnel] sert à donner le nom abc à mon certificat (un genre d'alias), qui permet de s'y référer sans devoir taper le nom complet (sans cette option, mon certificat prendra le nom du premier certificat mentionné avec
--domain
, soit mondomaine.com). - --rsa-key-size 4096 : [Optionnel] spécifie la taille des clefs RSA pour ce certificat. Par défaut, la taille est 2048 (le maximum étant 4096).
- --domain mondomaine.com : j'ajoute le domaine mondomaine.com au certificat.
- --domain abc.mondomaine.com : j'ajoute le domaine abc.mondomaine.com au certificat.
Attention: Let's Encrypt ne supporte pas les wildcards, c'est à dire les domaines du type *.mondomaine.com
. Il faut spécifier chaque domaine et sous-domaine géré par le certificat.
Edit (24/08/2018) : depuis quelques jours Let's Encrypt supporte les wildcards. Je ferai un article qui traite de cela bientôt.
Pour utiliser mon nouveau certificat dans une configuration quelconque (apache, nginx, ftp, ...), je vais avoir besoin de connaître son emplacement.
De plus, mon certificat n'étant valide que pour 90 jours, il faut que je mette en place son renouvellement régulier.
Pour retrouver les caractéristiques de mon certificat, je peux consulter son fichier de configuration.