Catégories
Sécurité

Let’s Encrypt: les certificats SSL/TLS gratuits

Let’s Encrypt est une autorité de certification 🔐(CA en anglais) qui délivre la plupart des certificats TLS / SSL dans le monde (plus de 56% des certificats, le 2ème CA étant Cloudflare avec 13% – chiffres d’Aout 2020) et est gérée par l’ISRG qui est sponsorisé par quelques mastodontes du web tel que Mozilla, Akamai, Cisco, EFF.

Certbot

Let’s Encrypt présente la particularité de fournir gratuitement 🎉 un système automatisé de délivrance de certificats SSL (ou TLS), et pour cela l’ISRG a développé le protocole ACME  que l’on peut exploiter grâce au CLI Certbot (développé par l’EFF).

Certbot (ou certbot-auto anciennement letsencrypt 💀) est l’outil qui va nous permettre de gérer (obtenir, renouveler ou révoquer) les certificats SSL Let’s Encrypt et les installer sur notre serveur Web.

Certbot n’est actuellement disponible que sur les Unix/Linux.

Installer Certbot

Pour l’installer suivre la procédure propre à chaque système, identifier notre système et versions par :

grep -wE 'ID_LIKE|VERSION' /etc/*-release

dans mon cas, mon serveur web est hébergé sur un Raspberry Pi et le système Raspbian est un dérivé de Debian Stretch, et voici donc la procédure mon mon système (Stretch):

# il faut d'abord ajouter le répo backports pour debian Stretch
sudo sh -c "echo \"deb http://ftp.debian.org/debian stretch-backports main\" > /etc/apt/sources.list.d/stretch-backports.list"
# puis installer le CLI certbot
sudo apt update && sudo apt install python-certbot-nginx -t stretch-backports

note: on utilise un repo apt spécifique aux backports debian stretch, faire abstraction des erreurs gpg ou corriger

Principe d’utilisation de Certbot

Certbot permet via la ligne de commande, d’effectuer les actions suivantes grâce à un système de plugins (qu’il est important de bien comprendre) qui sont de 2 types:

  1. les plugins authenticators
  2. les plugins installers

La commande suivante permet d’obtenir un mode interactif avec des questions réponses pour nous aider à créer les certificats pour nos sites hébergés sous un Nginx :

sudo certbot --nginx
sudo certbot –nginx (mode interactif)

Authentifier votre serveur web

Certbot va nous permettre d’authentifier le serveur web qui héberge le domaine pour lequel nous souhaitons obtenir le certificat SSL (valide pour une durée de 3 mois).

Pour cette étape, il faut utiliser les plugins de type authenticators que l’on va spécifier via la sous-commande certonly, voici un exemple d’utilisation du plugin authenticator webroot avec l’option --webroot-path (-w) et l’option --dry-run qui permet tester sa config :

sudo certbot certonly --webroot -w /var/www/example -d www.example.com -d example.com --dry-run 

Installer le certificat

La CLI peut éventuellement permettre d’installer ce certificat sur votre serveur web (Nginx, Apache etc.), pour cela il faut utiliser les plugins de type installers via la sous-commande install

Certains plugins sont des authenticators et des installers comme les plugins apache et ngnix (voir également les plugins non officiels), ils sont alors utilisable via la sous-commande run (qui est implicitement utilisée lorsqu’on ne spécifie ni certonly, ni install).
Il faudra alors utiliser des options pour spécifier les plugins --authenticator  (ou -a) et --installer (ou -i).

sudo certbot run -a webroot -i nginx -w /var/www/html -d example.com

Si on souhaite obtenir un certificat manuellement, il est possible  d’utiliser le plugin authenticator manual.

Certificats *

Si vous possédez de nombreux sous domaines et que pour des raisons de sécurité (éviter leurs énumérations par certificats) Let’s Encrypt nous offre depuis Janv 2018 des certificats joker (wildcard certificate), et pour cela il suffit de spécifier en -d *.votrenomdedomaine.fr.
Pour compléter la procédure, vous devrez avoir accès à votre registrar pour ajouter un champs DNS de type TXT.
Voici la commande pour générer le certificat manuellement sans plugins:

sudo certbot --server https://acme-v02.api.letsencrypt.org/directory -d *.behrouze.com --manual --preferred-challenges dns-01 certonly
certificats *.behrouze.com

Gestion des certificats

Lister les certificats

Certbot propose de nombreuses possibilité en matière de gestion de certificats.

sudo certbot certificates  permet d’afficher les informations concernant les certificats SSL actuellement installés sur votre serveur, leurs localisation dans le système de fichier ainsi que leurs date d’expiration.

Attention: A noter que cette sous-commande nous indique les informations concernant nos domaines ainsi que les fichiers de clés privés et certificats, par contre elle n’indique pas si notre serveur web est correctement configuré pour les exploiter.

Révoquer un certificat

En cas d’attaque du serveur web contenant les certificats, il est important de révoquer et supprimer les certificats installés (car exploitable par les hackers), puis en régénérer de nouveaux:

sudo certbot revoke --cert-path /etc/letsencrypt/live/CERTNAME/cert.pem --reason keycompromise

l’option --reason est optionnelle et peut comprendre les valeurs :
unspecified (par défaut) keycompromise affiliationchanged superseded ou cessationofoperation

sudo certbot delete --cert-name example.com

Gestion des certificats

Le renouvellement de certificat s’effectue via la commande certbot renew et il sera utile de mettre un job cron pour automatiser cette tache et ne pas se retrouver avec des certificats expirés…

Les fichiers de configuration de certbot sont situés dans le dossier suivant /etc/letsencrypt/renewal/nom_certificat. Pour annuler le renouvellement de certains certificat, il suffit de supprimer le fichier correspondant au certificat dans ce dossier.

Aller plus loin

Pour bien comprendre le fonctionnement de Certbot cad le process d’obtention et d’installation de certificats et son système de plugins lire le User Guide, un peu long 😒 mais très intéressant 👍

Le site de Let’s Encrypt comporte également beaucoup d’informations.