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