Let’ s Encrypt avec IPFire/HAProxy

HAProxy est un reverse proxy. C’est un peu limiter ses fonctionnalités, mais c’est en tout cas comme ça que je l’utilise.

Let’s Encrypt, je cite Wikipedia, « est une autorité de certification qui fournit des certificats gratuits au moyen d’un processus automatisé destiné à se passer du processus complexe actuel impliquant la création manuelle, la validation, la signature, l’installation et le renouvellement des certificats pour la sécurisation des sites internet. »

Actuellement, il est compliqué (impossible?) d’installer le client officiel letsencrypt sur IPFire. Heureusement, il existe pas mal d’autres clients non-officiels qui sont disponibles: https://github.com/certbot/certbot/wiki/Links. Après plusieurs essais, j’ai choisi letsencryptshell.

Processus de création des certificats

Avant de commencer, il faut un peu comprendre le fonctionnement de Let’s Encrypt ou tout du moins, le processus de création des certificats avec cette autorité, qui est découpé en 4 étapes:

  • Acceptation de la licence de Let’s Encrypt (à faire une seule fois)
  • Envoi de la demande de création du certificat à Let’s Encrypt: il suffit d’indiquer le (sous-)domaine. Un fichier est créé sur notre serveur.
  • Let’s Encrypt vérifie que le (sous-)domaine nous appartient. Pour cela, en utilisant comme url le (sous-)domaine indiqué, il va essayer de lire le fichier précédemment créé, à partir de ses serveurs. Une fois validé, un certificat est créé sur ses serveurs.
  • Récupération du certificat créé (et du certificat racine, mais à ne faire qu’une seule fois).

Il n’y a rien de compliqué, mais il est impératif que le serveur sur lequel on souhaite installer les nouveaux certificats soit non seulement visible sur internet, mais réponde bien au (sous-)domaine indiqué.

Installation/Configuration

Il faut tout d’abord récupérer le script, le copier dans un chemin du PATH et le rendre exécutable:

wget https://mojzis.com/software/letsencryptshell/letsencryptshell.pycp letsencryptshell.py /bin/letsencryptshellchmod +x /bin/letsencryptshell

Côté HAProxy, il y a aussi du travail à faire. On édite le fichier /var/haproxy/haproxy.conf et on ajoute ce qui suit en gras:

frontend http-in
    acl app_letsencrypt  path_beg   /.well-known/acme-challenge/
    [...]
    use_backend bk-letsencrypt if app_letsencrypt

[...]
    
backend bk-letsencrypt
    log global
    mode http
    server srv_letsencrypt 127.0.0.1:81

Pour finir, il faut créer dans le serveur web d’IPFire les répertoires .well-known/acme-challenge/ qui serviront à stocker le fichier de vérification:

    mkdir /srv/web/ipfire/html/.well-known
mkdir /srv/web/ipfire/html/.well-known/acme-challenge

On va maintenant accepter la licence (ce qui permettra automatiquement de créer l’arborescence nécessaire à letsencryptshell pour stocker ses fichiers). En ligne de commande, il suffit d’appeler letsencryptshell puis d’indiquer la ligne suivante (en mettant son adresse mail):

register https://letsencrypt.org/documents/LE-SA-v1.0.1-July-27-2015.pdf  mail@mail.com

Taper exit pour sortir du shell de letsencrypt.

On va ensuite récupérer le certificat public de letsencrypt, obligatoire pour générer nos certificats:

cd ~/.letsencryptshell/certs/
wget https://letsencrypt.org/certs/lets-encrypt-x1-cross-signed.pem

Création/Renouvellement de certificats

letsencryptshell est une ligne de commande, comme on l’a vu juste avant, mais on peut l’automatiser comme avec le script ci-dessous que je vais essayer d’expliquer.

# C’est la seule partie à changer, en indiquant son domaine
domain= »mondomaine.com »
# On fait la demande pour le nouveau certificat
content=`echo domainchallenge « ${domain} » | letsencryptshell | head -1`
# En retour de la demande du certificat, on reçoit le nom d’un fichier
# et son contenu. On doit donc créer ce fichier avec le contenu reçu
dir= »/var/www/${domain}/.well-known/acme-challenge »
file=`echo « ${content} » | cut -d ‘.’ -f1 | sed « s,^,${dir}/, »`
echo « ${content} » > « /srv/web/ipfire/html/.well-known/acme-challenge/${file} »
# On demande la vérification à Let’s Encrypt
echo domainconfirm « ${domain} » | letsencryptshell
# On récupère le certificat
echo certificateget « ${domain} » | letsencryptshell
# On génère le cerfificat dans un format reconnu par HAProxy et on le stocke au bon endroit
cd ~/.letsencryptshell/certs/
cat ${domain}.crt lets-encrypt-x1-cross-signed.pem ${domain}.key > /etc/haproxy/cert//${domain}.pem

Les certificats ne sont valables que 30 jours. Il faut donc les renouveler, un utilisant la même méthode.

Laisser un commentaire