HAProxy, Let’s Encrypt et plusieurs certificats
Voici ma recette pour gérer plusieurs noms de domaine avec donc forcément plusieurs certificats SSL.
Petite présentation de mon infra :
- un serveur frontal avec HAProxy
- un serveur web pour *.wallabag.it
- un serveur web pour *.wallabag.org et wllbg.org
- un serveur MariaDB
- un serveur RabbitMQ
(ce ne sont pas des serveurs, mais des containeurs, mais dans l’idée, c’est pareil)
Je vais donc créer mes certificats sur mon frontal puis changer la configuration de HAProxy pour prendre en compte tout ça.
Installation de Let’s Encrypt sur mon frontal
git clone https://github.com/letsencrypt/letsencrypt /opt/letsencrypt
C’est tout.
Génération de mon certificat
Avant toute chose, il faut couper HAProxy (sinon, impossible de communiquer avec les serveurs de Let’s Encrypt) :
service haproxy stop
./letsencrypt-auto certonly --standalone
service haproxy start
Vous avez maintenant des fichiers générés dans /etc/letsencrypt/live/votrenomdedomaine.com/
(ce sont en fait des alias vers /etc/letsencrypt/archive/votrenomdedomaine.com/
.
Nous allons créer un fichier qui va concaténer privkey.pem
et cert.pem
cd /etc/letsencrypt/live/votrenomdedomaine.com/
cat privkey.pem >> cle.pem
cat fullchain.pem >> cle.pem
Configuration de HAProxy
Éditez /etc/haproxy/haproxy.cfg
. Voici ce que ça donne pour moi :
frontend mon-front
mode http
bind *:80
option httplog
option forwardfor
option http-server-close
option httpclose
acl host_ndd hdr(host) -i votrenomdedomaine.com www.votrenomdedomaine.com
use_backend mon-back-2 if host_ndd
redirect scheme https code 301 if !{ ssl_fc }
default_backend mon-back-1
frontend mon-front-ssl
mode http
bind *:443 ssl crt /etc/ssl/certificate-gandi.pem crt /etc/letsencrypt/live/votrenomdedomaine.com/cle.pem crt /etc/letsencrypt/live/votreautrenomdedomaine.com/cle.pem
option httplog
option forwardfor
option http-server-close
option httpclose
acl host_ndd hdr(host) -i votrenomdedomaine.com www.votrenomdedomaine.com
use_backend mon-back-2 if host_ndd
reqadd X-Forwarded-Proto:\ https
http-request add-header X-CLIENT-IP %[src]
default_backend mon-back-1
J’ai deux frontaux, un pour le port 80, un pour le port 443. Par défaut, ils renvoient tous les deux sur mon-back-1
. Dans certains cas (selon le nom de domaine, géré par le SNI), ça renvoie sur mon-back-2
.
Concernant les certificats SSL, ce qui nous intéresse est la ligne bind *:443 ssl ...
. Pour chaque nouveau certificat créé, vous ajoutez sur cette ligne le chemin vers le fichier cle.pem
qu’on a créé précédemment : crt /chemin/vers/votre/cle.pem
.
Sur cette ligne, j’ai /etc/ssl/certificate-gandi.pem
qui correspond à mon certificat wildcard de chez Gandi (à l’époque, je n’avais pas pris le temps de regarder pour Let’s Encrypt).
Conclusion
Aujourd’hui, j’ai donc tous mes NDD en *.wallabag.it qui sont gérés par le certificat certificate-gandi.pem
puis wllbg.org et wallabag.org (et static.wallabag.org, puis prochainement doc.wallabag.org) qui sont gérés par mes certificats Let’s Encrypt.
Pour wallabag.it, ça migrera dans les prochaines semaines sur du Let’s Encrypt.