mirror of
https://github.com/almet/notmyidea.git
synced 2025-04-28 19:42:37 +02:00
Add an article about let's encrypt
This commit is contained in:
parent
f01632061a
commit
9a474f09ba
2 changed files with 130 additions and 0 deletions
130
content/crypto/lets-encrypt.rst
Normal file
130
content/crypto/lets-encrypt.rst
Normal file
|
@ -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 <https://letsencrypt.org/>`_
|
||||||
|
|
||||||
|
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
|
||||||
|
<https://fr.wikipedia.org/wiki/Attaque_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 <http://www.haproxy.org/>`_.
|
||||||
|
|
||||||
|
Je me suis basé pour cet article sur d'`autres
|
||||||
|
<https://blog.infomee.fr/p/letsencrypt-haproxy>`_ `articles
|
||||||
|
<http://blog.victor-hery.com/article22/utiliser-let-s-encrypt-avec-haproxy>`_, 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
|
||||||
|
<https://github.com/letsencrypt/letsencrypt#installation>`_.
|
||||||
|
|
||||||
|
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
|
||||||
|
<https://github.com/almet/infra/blob/master/haproxy/haproxy.cfg#L63-L72>`_
|
||||||
|
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
|
||||||
|
<https://github.com/almet/infra/blob/master/haproxy/haproxy.cfg#L38-L60>`_.
|
||||||
|
|
||||||
|
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
|
||||||
|
<https://github.com/almet/infra/>`_, si jamais ça peut vous servir, tant mieux !
|
||||||
|
|
BIN
content/static/unsecure-connection.png
Normal file
BIN
content/static/unsecure-connection.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 11 KiB |
Loading…
Reference in a new issue