Let's encrypt nginx

03/12/2015

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é:

  • metal3d.org
  • www.metal3d.org

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.

Ça peut vous intéresser aussi


Certificat SSL et Chrome ou Chromium

Vous devez avoir cherché pendant des lustres la manière de ...


Encrypter un fichier facilement

On discutait sur le canal fedora-fr (IRC, sur freenode.net) ...


Ubuntu et Debian, pourquoi je les évite

Debian et Ubuntu sont aujourd’hui des distributions extrêmement bien ...


KubeSpray, installer kubernetes et créer un utilisateur admin en quelques minutes

Si vous voulez vous mettre à Kubernetes, sur des machines ...

Merci de m'aider à financer mes services

Si vous avez apprécié cet article, je vous serai reconnaissant de m'aider à me payer une petite bière :)

Si vous voulez en savoir plus sur l'utilisation de flattr sur mon blog, lisez cette page: Ayez pitié de moi

Commentaires

Ajouter un commentaire

Metal3d - 29/12/2015

@spiroid ha bha y’a des gens sur le forum qui en bavent justement avec letsencrypt sur debian. Ce serait pas mal de leur donner cette précision pour que le client propose l’installation de la lib. Sachant qu’elle installe les dépendances sur centos et ubuntu. Par contre sur mon second serveur debian j’ai pas eut à l’installer… Je devais l’avoir…

spiroid - 28/12/2015

Merci pour l’article.

Du coup j’ai réussi à générer un certificat pour mon nom de domaine et à l’utiliser avec nginx. Petite précision pour les debianistes, il faut installer la librairie augeas : https://packages.debian.org/jessie/libaugeas0

Metal3d - 05/12/2015

@Nope merci :) En ce qui concerne le TL;DR (bien que je sache que la remarque n’est pas méchante ;)), et malgré le fait que je sois d’accord sur le principe du respect de notre chère langue française, je préfère utiliser ce “terme” répandu pour les documentation rapides. Et puis ça aide le référencement ;)

Nope - 04/12/2015

J’aime bien vos billets. Je ne suis pas un puriste de la langue française mais je préfère tout de même le mot “Résumé” à ce “TL;DR” :-) Et merci pour ce billet sur let’s encrypt.

Ajouter un commentaire

(*) Votre e-mail ne sera ni revendu, ni rendu public, ni utilisé pour vous proposer des mails commerciaux. Il n'est utilisé que pour vous contacter en cas de souci avec le contenu du commentaire, ou pour vous prévenir d'un nouveau commentaire si vous avez coché la case prévue à cet effet.