Publié le 11/18/2017, rédigé par Gaulthier LALLEMAND

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 :

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.