Comment j’ai mis en place des certificats SSL avec Let’s Encrypt derriĂšre haproxy.
đ
Itâs time for the Web to take a big step forward in terms of security and privacy. We want to see HTTPS become the default. Letâs Encrypt was built to enable that by making it as easy as possible to get and manage certificates.
Depuis dĂ©but DĂ©cembre, la nouvelle autoritĂ© de certification Let’s Encrypt est passĂ©e en version Beta. Les certificats SSL sont un moyen de 1. chiffrer la communication entre votre navigateur et le serveur et 2. un moyen d’ĂȘtre sur que le site Web auquel vous accĂ©dez est celui auquel vous pensez vous connecter (pour Ă©viter des attaques de l’homme du milieu).
Jusqu’Ă maintenant, il Ă©tait nĂ©cessaire de payer une entreprise pour faire en sorte d’avoir des certificats qui Ă©vitent d’avoir ce genre d’erreurs dans vos navigateurs:
Maintenant, grĂące Ă Let’s Encrypt il est possible d’avoir des certificats SSLgratuits, ce qui reprĂ©sente un grand pas en avant pour la sĂ©curitĂ© de nos communications.
Je viens de mettre en place un procĂ©dĂ© (assez simple) qui permet de configurer votre serveur pour gĂ©nĂ©rer des certificats SSL valides avec Let’s Encrypt et le rĂ©partiteur de charge HAProxy.
Je me suis basĂ© pour cet article sur d’autres articles, dont je vous recommande la lecture pour un complĂ©ment d’information.
Validation des domaines par Let’s Encrypt
Je vous passe les dĂ©tails d’installation du client de Let’s Encrypt, qui sont trĂšs bien expliquĂ©s sur leur documentation.
Une fois installé, vous allez taper une commande qui va ressembler à :
letsencrypt-auto certonly --renew-by-default --webroot -w /home/www/letsencrypt-requests/ \ -d hurl.kinto-storage.org \ -d forums.kinto-storage.org
Le webroot est l’endroit ou les preuves de dĂ©tention du domaine vont ĂȘtre dĂ©posĂ©es.
Lorsque les serveurs de Let’s Encrypt vont vouloir vĂ©rifier que vous ĂȘtes bien Ă l’origine des demandes de certificats, ils vont envoyer une requĂȘte HTTP surhttp://domaine.org/.well-known/acme-challenge, ou il voudra trouver des informations qu’il aura gĂ©nĂ©rĂ© via la commande letsencrypt-auto.
J’ai choisi de faire une rĂšgle dans haproxy pour diriger toutes les requĂȘtes avec le chemin .well-known/acme-challenge vers un backend nginx qui sert des fichiers statiques (ceux contenus dans /home/www/letsencrypt-requests/).
Voici la section de la configuration de HAProxy (et la configuration complete si ça peut ĂȘtre utile):
frontend http bind 0.0.0.0:80 mode http default_backend nginx_server acl letsencrypt_check path_beg /.well-known/acme-challenge use_backend letsencrypt_backend if letsencrypt_check redirect scheme https code 301 if !{ ssl_fc } !letsencrypt_check backend letsencrypt_backend http-request set-header Host letsencrypt.requests dispatch 127.0.0.1:8000
Et celle de NGINX:
server { listen 8000; server_name letsencrypt.requests; root /home/www/letsencrypt-requests; }
Installation des certificats dans HAProxy
Vos certificats SSL devraient ĂȘtre gĂ©nĂ©rĂ©s dans /etc/letsencrypt/live, mais ils ne sont pas au format attendu par haproxy. Rien de grave, la commande suivant convertit l’ensemble des certificats en une version compatible avec HAProxy:
cat /etc/letsencrypt/live/domaine.org/privkey.pem /etc/letsencrypt/live/domaine.org/fullchain.pem > /etc/ssl/letsencrypt/domaine.org.pem
Et ensuite dans la configuration de haproxy, pour le (nouveau) frontend https:
bind 0.0.0.0:443 ssl no-sslv3 crt /etc/ssl/letsencrypt
Faites bien attention à avoir un frontend https pour tous vos sites en HTTPS. Pour moi cela ressemble à ça.
Une fois tout ceci fait, redémarrez votre service haproxy et zou !
Automatisation
Pour automatiser un peu tout ça, j’ai choisi de faire ça comme suit:
- Un fichier domaine dans letsencrypt/domains/domain.org qui contient le script letsencrypt.
- Un fichier d’installation de certificats dans letsencrypt/install-certs.sh qui s’occupe d’installer les certificats dĂ©jĂ gĂ©nĂ©rĂ©s.
Et voila ! Le tout est dans un dépot github, si jamais ça peut vous servir, tant mieux !