lid's stuff

Let's Encrypt et HAProxy

Bon, il me manquait un petit truc quand même sur ce site: du beau HTTPS bien propre.
Vu que Let's Encrypt est désormais assez fonctionnel - minus le leak récent des mails d'une bonne quantité d'utilisateurs (7200 environ) - autant en profiter. Rien de bien méchant en tout cas (l'opération + config d'HAProxy a dû me prendre en tout et pour tout 15 minutes).

Première étape: récupérer son certificat

On va installer let's encrypt à la main dans le répertoire /opt:

$ sudo git clone https://github.com/certbot/certbot /opt/letsencrypt

Puis on génère notre certificat:

# cd /opt/letsencrypt
# ./certbot-auto certonly --standalone --email michel@domaine.tld -d domaine.tld -d www.domaine.tld

Notre nouveau certificat se trouve donc dans /etc/letsencrypt/live/domaine.tld/fullchain.pem (en fait il n'y a pas que lui qui soit nécessaire pour la conf d'HAProxy)

Seconde étape: HAProxy

on va commencer par faire un peu de rangement:

# mkdir /etc/haproxy/certs
# cd /etc/letsencrypt/live/domaine.tld/
# cat privkey.pem fullchain.pem > /etc/haproxy/certs/mycert.pem

Puis ensuite, dans la configuration du frontend d'HAProxy, on ajoute les lignes:

bind *:80 #bind pour le HTTP
bind *:443 ssl crt /etc/haproxy/certs/mycert.pem strict-sni
acl is_ssl dst_port 443
reqadd X-Forwarded-Proto:\ https if is_ssl
# ligne pour le http
reqadd X-Forwarded-Proto:\ http unless is_ssl

Un petit:

systemctl reload haproxy

Et on peut tester de se connecter à notre site en HTTPS pour vérifier que tout est OK:

https://www.domaine.tld

Bon, c'est bien gentil tout ça, mais ce serait mieux si on oubliait complètement HTTP et qu'on redirigeait toujours en https, non? On va donc remodifier notre fichier /etc/haproxy/haproxy.cfg:

bind *:80
bind *:443 ssl crt /etc/haproxy/certs/mycert.pem strict-sni
redirect scheme https code 301 if !{ ssl_fc }
# on a plus besoin de l'ACL
#acl is_ssl dst_port 443
reqadd X-Forwarded-Proto:\ https
# ligne pour le http, on en a plus besoin non plus!
# reqadd X-Forwarded-Proto:\ http unless is_ssl

Les choix par défaut d'HAProxy au niveau des algorithmes de chiffrement sont plutôt bons, mais on peut énerver un peu tout ça tout en conservant quand même une bonne compatibilité avec des navigateurs plus anciens. Dans la zone [global] de la configuration d'HAProxy, on va donc modifier la ligne ssl-default-bind-ciphers:

ssl-default-bind-ciphers kEECDH+aRSA+AES:kRSA+AES:+AES256:!kEDH:!LOW:!EXP:!MD5:!aNULL:!eNULL
# Normalement par défaut, sinon *toujours* désactiver sslv3:
ssl-default-bind-options no-sslv3

Un dernier:

sudo systemctl reload haproxy

Et voilà, on est normalement bons pour notre site/blog en https via haproxy et Ghost!


Tagged under: sysadmin, web, https, haproxy, ghost