Utiliser un certificat Let's Encrypt sur Nginx

Let's encrypt, c'est cool. Non seulement cela permet d'avoir un certificat SSL gratuitement, mais ça permet également d'automatiser à moindre coût le renouvellement de ceux-cis. Aujourd'hui, on va voir comment obtenir un certificat SSL Let's Encrypt, comment le déployer sur Nginx et comment faire pour automatiser son renouvellement. Depuis Debian, naturellement.

Dans notre exemple, le domaine à valider sera example.com.

Cet article reprends le tutorial de DigitalOcean.

Installer Let's Encrypt

Tout d'abord, on va récupérer le code de Let's Encrypt. Le mieux est de le récupérer depuis Github.
En prérequis, on install git et bc.

sudo apt-get install git bc

Puis

sudo git clone https://github.com/letsencrypt/letsencrypt /opt/letsencrypt

Obtenir un certificat

Pour obtenir le certificat, les serveurs de Let's Encrypt doivent être certains que vous disposiez du domaine. Chez Gandi par exemple, cela pouvait se faire de plusieurs manières. Envoi d'un mail au domaine concerné, ajout d'une entrée dans la configuration DNS, ou encore un fichier spécial à déposer sur le serveur accessible en HTTP. C'est cette dernière méthode qui est utilisée par le plugin webroot de Let's Encrypt.

On va donc ajouter une petite section à Nginx permettant aux serveurs Let's Encrypt de faire leur vérification.

On édite la configuration du Vhost de Nginx. Ici, c'est celle par défaut :

sudo nano /etc/nginx/sites-available/default

On ajoute ce bloc dans la partie server.

location ~ /.well-known {
  allow all;
  root /tmp/well-known;
}

On créé le dossier correspondant :

sudo mkdir -p /tmp/well-known

On reload Nginx pour appliquer la configuration :

sudo service nginx reload

On requête pour obtenir le certificat. Cela va demander un certificat SSL qui couvre example.com et www.example.com. Aujourd'hui, il n'est pas (encore ?) possible d'avoir un certificat wildcard.

cd /opt/letsencrypt
./letsencrypt-auto certonly -a webroot --webroot-path=/tmp/well-known -d example.com -d www.example.com

Si c'est la première fois que vous lancer Let's Encrypt, le script va vous demander d'entrer votre email et d'accepter les ToS (Terms of Service).

Si tout se passe bien, vous obtiendrez votre certificat et ce message :

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/example.com/fullchain.pem. Your cert will
   expire on 2016-10-02. To obtain a new or tweaked version of this
   certificate in the future, simply run letsencrypt-auto again. To
   non-interactively renew *all* of your certificates, run
   "letsencrypt-auto renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

Installer le certificat

Les certificats sont installés dans /etc/letsencrypt/archive. Des liens symboliques pointant sur les dernières versions des certificats (puisqu'ils ne sont valides que 90 jours) sont disponible dans /etc/letsencrypt/live/. Cela permet de configurer statiquement Nginx sans avoir à changer le nom du fichier.

Avant de configurer Nginx, on va générer des paramètres Diffie-Hellman forts pour augmenter la sécurité. Cela peut prendre quelques minutes.

sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

Nous allons donc modifier la configuration Nginx avec les nouveaux paramètres. Editons notre fichier vhost :

sudo vi /etc/nginx/sites-enabled/default

Changez la directive listen 80; par listen 443 ssl; pour écouter sur le ports HTTPS.

Ajouter les lignes suivante pour activer ssl :

ssl on;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

Nous allons ajouter ces paramètres afin de rendre le SSL plus sûr :

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_stapling on;
ssl_stapling_verify on;
add_header Strict-Transport-Security max-age=15768000;

Reloadez nginx pour activer la nouvelle configuration :

sudo service nginx reload

Vérifier le certificat

Vous pouvez vérifier la sécurité de votre certificat (et de votre serveur Nginx) en visitant ce site : https://www.ssllabs.com/ssltest/analyze.html?d=example.com.

Vous obtiendrez un score (ndlr, A, c'est cool).

Renouveler le certificat

Pour renouveler ce certificat, il faut juste une petite commande :

sudo /opt/letsencrypt/letsencrypt-auto renew

Cela renouvellera les certificats et mettera à jour le lien symbolique.
Il suffit après de reloader Nginx :

sudo service nginx reload

Cela peut-être placé dans un cron. Letsencrypt fera une vérification avant de renouveller vos certificats, donc ce cron peut être lancé une fois par jour ou une fois par semaine.

Par exemple :

30 2 * * 1 /opt/letsencrypt/letsencrypt-auto renew >> /var/log/le-renew.log
35 2 * * 1 /etc/init.d/nginx reload

Damien Gustave

Read more posts by this author.