Let's Encrypt avec Haproxy
Voici la documentation qui m’a permis de mettre en place Let’s Encrypt avec Haproxy.
Sources:
- https://coolaj86.com/articles/lets-encrypt-with-haproxy/
- https://blog.infomee.fr/p/letsencrypt-haproxy
Principe
Let’s Encrypt permet de générer un certificat valide de façon automatique. Ce certificat a une durée de validité de 3 mois. Il faut donc le renouveler très régulièrement. Pour fonctionner letsencrypt a besoin d’un serveur web, dans notre cas haproxy est juste un proxy, ce n’est pas lui qui fournit les pages, mais les serveurs web des backends. le script letsencrypt a besoin de créer un fichier pour le challenge dans le répertoire d’un serveur web. Le chemin étant facilement identifiable, nous allons créer un acl sur haproxy pour renvoyer les pages letsencrypt sur un serveur apache en particulier.
Installation de Let’s Encrypt
Il n’existe pas actuellement de packet debian de Let’s Encrypt pour les debian avant Stretch (actuellement en testing). Il est donc nécessaire de procéder à l’installation depuis les sources.
git clone https://github.com/letsencrypt/letsencrypt
cd letsencrypt
./letsencrypt-auto
Le script d’installation va créer une arborescence /root/.local/share/letsencrypt/ et y installer le logiciel. Par soucis de simplicité il faut ensuite aller dans /usr/sbin et créer un lien avec la commande :
ln -s /root/.local/share/letsencrypt/bin/letsencrypt
Configuration d’Apache
Nous avons besoin d’un serveur web pour fournir la page du challenge. Nous allons configurer Apache pour qu’il écoute sur 127.0.0.1:1080. Le documentRoot sera /var/www/letsencrypt.request/.
Fichier /etc/apache/ports.conf: Listen 127.0.0.1:1080
Fichier /etc/apache/sites-available/letsencrypt.conf:
<VirtualHost *:1080>
ServerName letsencrypt.request
DocumentRoot /var/www/letsencrypt.request
</VirtualHost>
Activer le nouveau site et désactiver le site par défaut :
a2ensite letsencrypt
/etc/init.d/apache2 restart
Configuration de Haproxy
Prenons le cas où nous n’avons qu’une seul ip et donc qu’un seul frontend haproxy pour le http et un autre pour le https:
frontend ft_http-in
option http-keep-alive
compression algo gzip
compression type text/html text/plain text/css application/x-javascript
option httplog
bind *:80
acl letsencrypt_check path_beg /.well-known/acme-challenge
# ... les autres acl
use_backend letsencrypt_backend if letsencrypt_check
# ... les autres use_backend
frontend https-in
bind *:443 ssl crt /etc/ssl/letsencrypt
tcp-request inspect-delay 5s
tcp-request content accept if { req.ssl_hello_type 1 }
acl letsencrypt_check path_beg /.well-known/acme-challenge
# ... les autres acl
use_backend letsencrypt_backend if letsencrypt_check
# ... les autres use_backend
backend letsencrypt_backend
http-request set-header Host letsencrypt.request
server apache 127.0.0.1:1080 check
Création du certificat
Création d’un seul certificat:
letsencrypt certonly --email adminsys@mondomaine.org --webroot -w /var/www/letsencrypt.request/ -d www.mondomaine.org
letsencrypt va créer une arborescence dans /etc/letsencrypt mais pour utiliser ces certificats dans haproxy il faut concaténer les fichiers dans un seul dans le répertoire /etc/ssl/letsencrypt avec le programme suivant:
#!/bin/bash
for domain in $(ls /etc/letsencrypt/live); do
cat /etc/letsencrypt/live/$domain/privkey.pem /etc/letsencrypt/live/$domain/fullchain.pem > /etc/ssl/letsencrypt/$domain.pem
done