diff --git a/content/crypto/lets-encrypt.rst b/content/crypto/lets-encrypt.rst new file mode 100644 index 0000000..eb28bba --- /dev/null +++ b/content/crypto/lets-encrypt.rst @@ -0,0 +1,130 @@ +Let's Encrypt + HAProxy +####################### + +:date: 2016-02-11 +:headline: Comment j'ai mis en place des certificats SSL avec Let's Encrypt + derrière haproxy. + +.. epigraph:: + + 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. + + -- `Let's Encrypt `_ + +Depuis début Décembre, la nouvelle *authorité 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: + +.. image:: {filename}/static/unsecure-connection.png + :alt: Message de firefox lorsque une connexion n'est pas sécurisée. + +Maintenant, grâce à Let's Encrypt il est possible d'avoir des certificats SSL +**gratuits**, 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 sur +``http://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 ! + diff --git a/content/static/unsecure-connection.png b/content/static/unsecure-connection.png new file mode 100644 index 0000000..5e1b25b Binary files /dev/null and b/content/static/unsecure-connection.png differ