Let’s Encrypt !
Avec les révélations Snowden, de plus en plus de sites sont en train de migrer en SSL. Google échaudé pousse maintenant à fond à l’encryption, voir le « https as ranking signal ». Mais d’autres organisations ne sont aps en reste avec la campagne « Encrypt All the Things ». Ce qui change maintenant est la possibilité d’obtenir gratuitement des certificats SSL grâce à Let’s Encrypt depuis le début de l’année !
Ce tutoriel va donc présenter comment paramétrer Nginx sous Debian/Jessie pour obtenir et utiliser des certificats SSL avec Let’s Encrypt.
Installer le Client Certbot
Let’s Encrypt fournit un client Certbot qui permet avec Nginx (mais aussi Apache, Haproxy, etc.) de générer automatiquement les certificats SSL.
Il s’installe très simplement, vérifiez juste que vous avez bien rajouté le repo backport.
1 2 3 | root@server:~# cat /etc/apt/sources.list | grep backport deb http://ftp.debian.org/debian/ jessie-backports main root@server:~# apt-get install letsencrypt -t jessie-backports |
Configurer Nginx avec Certbot
Certbot est relativement automatisé, ici, je préfère utiliser le mode « webroot » qui permet de ne pas arrêter Nginx pendant la récupération des certificats. Il suffit juste de créer un répertoire que Certbot va utiliser pour le « acme-challenge ». En gros, Certbot va y déposer un fichier le rendant accessible depuis votre serveur web pour permettre à Let’s Encrypt de confirmer la bonne propriété du domaine.
1 | root@server:~# mkdir /var/www/certs/phil.writesthisblog.com/ -p |
On rajoute le location bloc suivant dans la configuration Nginx du serveur web.
1 2 3 4 5 6 7 | location ^~ /.well-known { auth_basic off; allow all; alias /var/www/certs/phil.writesthisblog.com/.well-known; } |
On peut maintenant lancer la création du certificat SSL :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | root@server:~# nginx -t && service nginx reload nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful root@server:~# certbot certonly --webroot -w /var/www/certs/phil.writesthisblog.com -d phil.writesthisblog.com --email xxxx@gmail.com [...] IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at /etc/letsencrypt/live/phil.writesthisblog.com/fullchain.pem. Your cert will expire on 2017-03-17. To obtain a new or tweaked version of this certificate in the future, simply run certbot again. To non-interactively renew *all* of your certificates, run "certbot 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 root@server:~# |
N’hésitez pas à déposer à la main un fichier quelconque (test.html par ex) pour manuellement vérifier son accessibilité avec l’uri suivante /.well-known/test.html
. Dans la pratique, l’erreur la plus fréquente est un retour 403 ou 404 du serveur web ! 🙁
Utiliser son Certificat avec Nginx
Il ne reste plus qu’à utiliser son nouveau certificat. Rien que du classique, notez juste qu’il faut bien conserver le bloc location correspondant à « /.well-known ».
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | server { listen 188.165.57.56:80 default_server; server_name phil.writesthisblog.com; return 301 https://phil.writesthisblog.com$request_uri; } server { listen 188.165.57.56:443 ssl http2; server_name phil.writesthisblog.com; ssl_certificate /etc/letsencrypt/live/phil.writesthisblog.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/phil.writesthisblog.com/privkey.pem; include /etc/nginx/ssl_params; location ^~ /.well-known { auth_basic off; allow all; alias /var/www/certs/phil.writesthisblog.com/.well-known; } [...] } |
Et bien sûr, n’oubliez pas de relancer nginx avec un nginx -t && service nginx reload
Automatiser le Renouvellement des Certificats
La même méthode peut-être utilisée autant de fois que souhaitées sur le même OS. Par contre les certificats ne sont valables que 3 mois.
Pour vérifier le bon fonctionnement, un essai à vide :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | root@server:~# certbot renew --dry-run Saving debug log to /var/log/letsencrypt/letsencrypt.log ------------------------------------------------------------------------------- Processing /etc/letsencrypt/renewal/phil.writesthisblog.com.conf ------------------------------------------------------------------------------- Cert not due for renewal, but simulating renewal for dry run Starting new HTTPS connection (1): acme-staging.api.letsencrypt.org Renewing an existing certificate Performing the following challenges: http-01 challenge for phil.writesthisblog.com Waiting for verification... Cleaning up challenges Generating key (2048 bits): /etc/letsencrypt/keys/0013_key-certbot.pem Creating CSR: /etc/letsencrypt/csr/0013_csr-certbot.pem |
Pour automatiser, on rajoute la ligne suivante à son crontab. La commande fonctionne quelque soit le nombre de certificats générés. Ces derniers ne seront réellement régénérés qu’à l’approche de leur expiration.
1 2 | root@server:~# cat /etc/crontab | grep certbot 0 3 * * * root /usr/bin/certbot renew -q >/dev/null 2>&1 && /usr/sbin/nginx -t && service nginx reload |
C’est fini! Encryptez-bien 🙂