Haproxy Archive

Let's Encrypt avec Haproxy

Voici la documentation qui m’a permis de mettre en place Let’s Encrypt avec Haproxy.

Sources:

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