Letsencrypt

De Wiki doc


Letsencrypt est une autorité de certification lancée le 3 décembre 2015 (Bêta Version Publique). Elle permet de générer des certificats X.509 gratuitement et sans limite de nombre.

C'est un service fourni par l'Internet Security Research Group (ISRG). Les mécènes principaux sont l'Electronic Frontier Foundation (EFF), la Fondation Mozilla, Akamai, Cisco Systems , PlanetHoster et OVH. D'autres partenaires, tels que l'autorité de certification IdenTrust, l'Université du Michigan (U-M), la Stanford Law School, la Fondation Linux, l'entreprise Free10, ainsi que Stephen Kent de Raytheon / BBN Technologies et Alex Polvi de CoreOS sont également impliqués dans le projet. Bref c'est un truc sérieux et cela représente tout de même 51,21% des certificats TLS en avril 2018 d'après NetTrack.

L'autorité de certification se base sur le protocole Automatic Certificate Management Environment (ACME ou "environnement de gestion automatique de certificat") permettant l'automatisation des échanges entre les autorités de certification et les administrateurs de serveurs, rendant ainsi possible le déploiement automatisé d’une infrastructure à clé publique à très bas coût. Plusieurs implémentations de ce protocole existent.

ACME.sh

ACME.sh est une implémentation libre (GPL v3.0) du protocole idoine écrite en langage Shell. Elle a le gros avantage d'être très légère en déploiement et en usage. Cet outil fonctionne avec un seul script (ses dépendances se trouvent dans le répertoire livré avec) et s'utilise en une seule commande sans rien installer.

Usage

Téléchargement de l'outil

export VERSION_ACME="3.0.4"
wget https://github.com/acmesh-official/acme.sh/archive/refs/tags/"${VERSION_ACME}".tar.gz -qO - | tar -xvz -C /tmp/ && cp -av /tmp/acme.sh-"${VERSION_ACME}" /opt/
ln -vs /opt/acme.sh-"${VERSION_ACME}" /opt/acme.sh

Afin de ne pas nécessiter d'intervention manuelle, il est possible de créer une clé API auprès de nombreux registres DNS. Celle-ci permet au logiciel d'ajouter automatiquement un champ TXT servant à authentifier la légitimité de la requête.

Génération d'un certificat simple

GANDI_LIVEDNS_KEY="INSEREZ_VOTRE_CLEF_API" /opt/acme.sh/acme.sh --issue --server letsencrypt --keylength ec-384 -d test.ycharbi.fr --dns dns_gandi_livedns --force

INFORMATION

Un répertoire ~/.acme.sh/ est automatiquement créé et contiendra l'ensemble des certificats et clés gérés. Pensez à y faire un ménage régulier car les certificats générés ne sont valides que 3 mois. La régénération d'un certificat pour un même FQDN remplace le précédent.

Vous pouvez afficher le contenu de vos certificats (notamment la validité) via la commande

openssl x509 -noout -text -in ~/.acme.sh/test.ycharbi.fr_ecc/fullchain.cer

Automatisation

Dans la mesure où les certificats ont une validité de 3 mois et au vu de l’importance de les maintenir à jour, il est recommandé d'automatiser leur renouvellement. Voici un script permettant de générer un certificat valide pour tous les sous-domaines (joker) de ycharbi.fr. Le résultat est mis, tant en forme qu'à disposition de HAProxy avant un rechargement de son service.

ATTENTION

La méthode pour renseigner la clé API peut varier d'un registre à un autre. référez-vous à la documentation pour adapter le script à votre fournisseur. L'exemple ci-dessous est valide pour les DNS de Gandi.

Script de génération

cat << '_EOF_' > /usr/local/sbin/genX509.sh
#!/bin/bash

CLEF_API_DNS="INSEREZ_VOTRE_CLEF_API"
DOMAINE="ycharbi.fr"
CHEMIN_DST="/root/letsencrypt/"
HAPROXY_TLS_DST="/etc/haproxy/tls/"

mkdir -p /"${CHEMIN_DST}"/"${DOMAINE}"/

GANDI_LIVEDNS_KEY="${CLEF_API_DNS}" /opt/acme.sh/acme.sh --issue --server letsencrypt --keylength ec-384 -d "*.${DOMAINE}" --dns dns_gandi_livedns --cert-file /root/letsencrypt/"${DOMAINE}"/"${DOMAINE}".crt --key-file /"${CHEMIN_DST}"/"${DOMAINE}"/"${DOMAINE}".key --fullchain-file /"${CHEMIN_DST}"/"${DOMAINE}"/"${DOMAINE}"-full.crt --force --reloadcmd "cat /"${CHEMIN_DST}"/"${DOMAINE}"/"${DOMAINE}"-full.crt /"${CHEMIN_DST}"/"${DOMAINE}"/"${DOMAINE}".key > /"${HAPROXY_TLS_DST}"/"${DOMAINE}".pem && systemctl reload haproxy.service"
_EOF_
chmod +x /usr/local/sbin/genX509.sh

INFORMATION

En précisant la destination des fichiers à générer, ceux-ci se trouveront à la fois dans le répertoire voulu ainsi que dans le ~/.acme.sh/ de d'habitude.

Automatisation de la tâche

Afin d'exécuter le script automatiquement, divers outils peuvent êtres utilisés comme Cron ou les minuteurs Systemd. Je recommande cette dernière solution pour des raisons de fiabilité et de facilité de supervision.

 mkdir -p /usr/local/etc/systemd/system
cat << _EOF_ > /usr/local/etc/systemd/system/genX509.service
[Unit]
Description=Génération du certificat joker pour les sous-domaines d'ycharbi.fr
After=network.target

[Service]
Type=oneshot
ExecStart=genX509.sh
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target
_EOF_
cat << _EOF_ > /usr/local/etc/systemd/system/genX509.timer
[Unit]
Description=Exécution mensuelle de la génération du certificat joker pour les sous-domaines d'ycharbi.fr

[Timer]
OnCalendar=monthly
Persistent=true

[Install]
WantedBy=timers.target
_EOF_
ln -s /usr/local/etc/systemd/system/genX509.service /etc/systemd/system/
ln -s /usr/local/etc/systemd/system/genX509.timer /etc/systemd/system/
systemctl daemon-reload
systemctl enable genX509.timer
systemctl start genX509.timer

Les informations sur la prochaine exécution sont visualisables avec la commande

systemctl status genX509.timer

Certbot

Cette section traite de l'outil historique bien trop lourd à mon goût. Je ne l'utilise plus car il impose trop de contraintes et peut être remplacé sans difficultés par plus simple. Ne sera abordé que la génération de certificats sans la partie automatisation.

Génération de certificats

Il existe différents modes de génération de certificats. Voici ceux que j'utilise avec l'outil certbot.

Mode autonome

Ce mode permet de récupérer un certificat signé directement sur une machine proposant un service WEB (les commande seront à effectuées sur la machine répondant au domaine).

ATTENTION

Cette méthode installe tout un tas de bordel sur la machine dont un serveur Apache. Pour ma part, je lance une machine dédiée (un Squashfs dans mon cas), qui se chargera de la génération des certificats que je récupèrent et transferts sur la machine de destination (opération lourde destinée principalement à des tests).

Installation

apt install python-certbot-apache

Génération

Il faut que le domaine à signé dirige les requêtes vers l'adresse IP de la machine certbot sinon l'erreur 503 renvoyé par celui-ci et interrompra la procédure.

ASTUCE

Il est possible d'automatiser le remplissage du nom de domaine lié au certificat à générer si le paramètre "ServerName domaine.ycharbi.fr" est ajouté dans un vHost. La procédure de création d'un vHost HTTPS par certbot sera donc automatique (sinon il demande de taper le numéro correspondant au vHost affiché dans la liste qu'il a généré en regardant dans le répertoire sites-availables).

Génération de certificat pour tube.ycharbi.fr

certbot --authenticator standalone --installer apache -d tube.ycharbi.fr --pre-hook "service apache2 stop" --post-hook "service apache2 start"

INFORMATION

Il va demander une adresse e-mail qui servira à prévenir de l'expiration imminente du certificat.

Le résultat est stocké dans ces emplacements:

  • Clé publique/certificat: /etc/letsencrypt/live/tube.ycharbi.fr/fullchain.pem
  • Clé privé: /etc/letsencrypt/live/tube.ycharbi.fr/privkey.pem

Il est bien sûr possible d'en faire un certificat chaîné pour certaines applications comme Haproxy par exemple:

cat /etc/letsencrypt/live/tube.ycharbi.fr/fullchain.pem /etc/letsencrypt/live/tube.ycharbi.fr/privkey.pem > /etc/ssl/tube.ycharbi.fr.pem

Source de la section

Mode manuel

Cette méthode permet de générer des certificat joker (wildcard). Selon moi, elle est beaucoup plus propre et n'installe pas tout un tas de paquets sur la machine. Elle peut être utilisée depuis une machine qui n'héberge aucun services (je l'utilise personnellement depuis mon proxy inverse).

Installation

apt install certbot

Génération

certbot certonly --rsa-key-size 4096 --server https://acme-v02.api.letsencrypt.org/directory --manual -d '*.ycharbi.fr'

Il va poser une chiée de question et donner le nom et la valeur d'un champ TXT DNS à entrer dans la zone du domaine à signé (il s'agit d'une clé d'authentification pour le protocole ACMEv2). Une fois ce champ renseigné et appliqué dans la zone DNS, faire <entrer> au prompte pour récupérer le certificat ainsi que sa clef privée (disponibles dans /etc/letsencrypt/archive/ycharbi.fr).

Sources de la section