Patrice Ferlet
Patrice Ferlet
Créateur de ce blog.
Publié le déc. 3, 2015 Temps de lecture: 5 min

Me suivre sur Mastodon

Let's encrypt nginx

C’est enfin le grand jour, Let’s encrypt passe enfin en version “beta publique”, ce qui signifie qu’il n’est plus nécessaire de passer par une phase de demande pour tester ce nouveau service gratuit de certification SSL/TLS. Le petit bémole, c’est que pour nginx, le mode est expérimental. Alors voici comment procéder pour avoir un certificat SSL gratuit avec ce superbe outil.

TL;DR

Notez bien: dans cette solution il faut couper le serveur web le temps de lancer le mode “standalone”, mais il existe d’autres méthodes dont une “expérimentale” pour nginx qui permet de se passer de cette coupure. Je ne l’ai pas testé. Il existe aussi une manière de faire en mode “manuel” où le client vous donne des instructions pour déposer un fichier texte contenant un code qui doit être accessible par les serveurs letsencrypt. Pour ma part, la coupure n’était pas un souci majeur, mais pour ceux qui ont la contrainte de ne surtout pas couper le serveur web, je vous invite à lire la documentation

Sur votre serveur Web:

git clone https://github.com/letsencrypt/letsencrypt
cd letsencrypt
# cela va paramétrer virtualenv 
# et récuperer les dépendances
./letsencrypt-auto --help

# coupez nginx, c'est nécessaire, désolé
systemctl stop nginx
# ou 
service nginx stop

# puis lancez la procédure de certification
./letstencrypt-auto certonly --standalone \
    --agree-tos \
    --email VOTREMAIL -d VOTREDOMAINE.TLD \
    -d AUTRE...

Les certificats sont maintenant dans /etc/letsencrypt/live/VOTREDOMAINE/..., vous n’avez plus qu’à utiliser les certificats fullchain.pem et privkey1.pem dans votre configuration nginx.

EDIT, virer le SSLv3 en activant seulement les protocols TLS, merci à Matthieu

server {
    //...
    listen 443 ssl;
	ssl on;
	server_name VOTREDOMAINE;
	ssl_certificate /etc/letsencrypt/live/VOTREDOMAINE/fullchain.pem;
	ssl_certificate_key /etc/letsencrypt/live/VOTREDOMAINE/privkey1.pem;
	# stop sslV3 and poodle attack
	# see https://www.linode.com/docs/security/security-patches/disabling-sslv3-for-poodle
	# thanks to Matthieu L.
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
}

Puis redémarrer nginx:

service nginx start
# ou pour systemctl
systemctl start nginx

Explications

Le client

Le client letsencrypt ne gérant pas (pour le moment) la configuration automatique de nginx, à moins d’activer le mode expériemental, le mode “standalone” va lui même faire office de service Web le temps de la certification. C’est pour cela qu’il faut couper le service nginx le temps de faire la manipulation.

Donc en appelant letsencrypt-auto --help avant de couper nginx, je m’assure de ne pas couper trop longtemps le serveur avant de lancer la véritable phase de certification. Car le client va installer un certain nombre de dépendances et initialiser un virtualenv.

Ensuite, il suffit de couper le serveur web, et appeler la commande:

letsencrypt-auto certonly --standalone ...

Si vous ne mettez pas les options “–email” et “–agree-tos”, alors le client va vous demander d’entrer un email, et d’accèpter les “terms of service”. Or, il va s’avérer très intéressant d’utiliser les options --email et --agree-tos pour vous permettre de faire le renouvellement dans 90 jours de manuère automatique (un petit script bash).

Ensuite suivent les options “-d” à la chaine pour chaque domaines et sous domaines. Dans mon cas, j’ai certifié:

Ce qui donne:

./letsencrypt-auto --email secret@...com --agree-tos \
    -d www.metal3d.org  \
    -d metal3d.org

En à peine une seconde la séquence a été effectuée. Les certificats sont générés dans le répertoire /etc/letsencrypt/live/metal3d.org et je n’ai eut qu’à modifier la configuration de nginx.

Et ça marche ?

Oui ! Regardez par vous-même le “https” en vert dans la barre d’url de mon site.

Mais comment ils font ça ?

Let’s encrypt est un projet lancé par la “linux fundation” il y a plus d’un an afin de permettre de faire “passer le web en mode chiffré pour tous” et ce gratuitement. Je dois bien avouer que l’offre alléchante m’avait donné une impréssion de “on va se faire avoir quelque part” et pourtant… il y a 1 mois, j’ai accédé à une beta privée qui a fonctionné sur mon service gitlab.

Comment ils font pour certifier comme ça plus de 11.000 domaines lors de la beta privée sans demander un sou ? Et bien tout se passe coté “sponsors”. Sur la page des sponsors apparaissent Mozilla, Cisco, Akamai et EFF, mais on compte aussi Faceboock, ou encore IdentTrust qui est justement l’autorité de confiance qui a permis de faire fonctionner le projet.

Et aujourd’hui, on y est ! Vous allez enfin pouvoir certifier vos serveurs de manière simple, rapide et gratuite.

Mais où est le vice caché ? et bien il n’y en a pas.

La seule chose que vous devez comprendre c’est que “let’s encrypt” permet de certifier votre connexion SSL/TLS et rien de plus. Enfin “rien de plus” est peu dire, car c’est déjà énorme, c’est ce dont 90% des services ont besoin.

Seuls les systèmes bancaires ou les services dont les données qui transitent entre clients et serveur sont très sensibles ne vont *certainement pas utiliser letsencrypt.

Donc ne vous y trompez pas, “let’s encrypt” est un formidable outil pour avoir accès à des connexions client/serveur sécurisées (tels qu’un site web, un registre docker privé ou des clients particuliers) mais il n’est pas conseillé, à mon humble avis, de l’utiliser pour sécuriser un service de paiement en ligne.

Petit edit de Matthieu L., un ex-collègue, dont le commentaire arrive à générer une erreur 500 (?!), le voici:

Après avoir fait tout cela il est préférable d’avoir une config SSL correct de son serveur. Pour cela on peu se rendre sur un site de Mozilla : https://mozilla.github.io/server-side-tls/ssl-config-generator/

Et après aller sur un autre site pour vérifier que tout est en ordre : https://www.ssllabs.com/ssltest

Par exemple tu as une note «C» seulement https://www.ssllabs.com/ssltest/analyze.html?d=metal3d.org

Effectivement j’ai une note “C” à cause d’une vulnérabilité SSL v3. Je vais mettre en place la configuration générée par l’outil Mozilla proposé par Matthieu et voir si ça bouge :) Merci à Matthieu pour ce commentaire !

Et me voilà en grade B, en virant le sslv3, voir la conf nginx modifiée plus haut.

comments powered by Disqus