Let’s Encrypt permet de déployer des certificats TLS (anciennement SSL) et ainsi assurer une connexion sécurisé à l’aide du protocole HTTPS.
Certbot est quand à lui un outil proposé par l’EFF (Electronic Frontier Foundation) qui permet d’obtenir en quelques ligne de commande un certificat Let’s Encrypt.
Attention, Let’s Encrypt délivre seulement des certificats pour les noms DNS valide. Il faut que le domaine soit résolvable sur Internet. Pour générer des certificats TLS interne (intranet etc..) il faudra utiliser OpenSSL.
Mise en place
Installation
On arrête tout serveur WEB susceptible de tourner :
service nginx stop service apache2 stop
Mis à jour des paquets et des versions :
Debian
apt update && apt full-upgrade
Arch Linux
pacman -Syyu
On récupère le dépôt et on donne les droits d’exécutions à notre nouvel outil :
cd /tmp && wget https://dl.eff.org/certbot-auto chmod a+x ./certbot-auto
Pour voir toutes les options de certbot :
./certbot-auto --help all
Configuration
Par défaut, le certificat let’s encrypt génère une clé RSA de 2048bits. Ici, on en génére une de 4096bits pour une sécurité max’ !
./certbot-auto certonly --standalone --rsa-key-size 4096
Un menu interactif apparaîtras, il faudra renseigner une adresse mail (être prévenu de l’expiration des certificats), accepter les termes et rentrer les noms de domaines avec ce format-là :
mondomaine.tld www.mondomaine.tld
Tout les paramètres demandés peuvent néanmoins être spécifiés en une seule commande du style :
./certbot-auto certonly \ --standalone \ --rsa-key-size 4096 \ --agree-tos \ --email admin@mondomaine.tld \ --domains mondomaine.tld \ --domains www.domaine.tld
Au niveau de la résolution DNS, il convient d’avoir un recorder de type A ou AAAA avec les deux adresses (impératif) qui pointent sur l’IP du serveur: www.mondomaine.tld & mondaine.tld.
A répéter pour chaque sous-domaine. L’utilitaire nslookup permet de vérifier le bonne propagation DNS.
Concernant Nginx, on améliore la configuration par défaut de Nginx en suivant les recommandations de Mozilla :
nano /etc/nginx/ssl/params_by_mozilla.conf
Et on y place :
ssl_session_timeout 1d; ssl_session_cache shared:SSL:50m; ssl_session_tickets off; ssl_ecdh_curve secp384r1; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers "ECDHE-RSA-CHACHA20-POLY1305:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES256-SHA"; ssl_prefer_server_ciphers on; add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;"; add_header X-Content-Type-Options nosniff; add_header X-Frame-Options "SAMEORIGIN"; add_header X-XSS-Protection "1; mode=block"; add_header X-Robots-Tag none; ssl_stapling on; ssl_stapling_verify on; #A ADAPTER ssl_trusted_certificate /etc/letsencrypt/live/domaine.tld/fullchain.pem; #Si on peut éviter Google et mettre OpenDNS comme resolver ;) resolver 208.67.222.222;
On inclus le params_mozilla.conf dans notre conf Nginx :
nano /etc/nginx/nginx.conf
Et on y place :
http { include /etc/nginx/ssl/params_by_mozilla.conf ; }
Il ne reste plus qu’à ajouter nos certificats/clés à notre vhost. Ici un exemple de configuration d’un vhost Nginx basique, à adapter bien sûr :
server { listen 80; server_name domaine.tld; #On redirige les requêtes HTTP vers HTTPS return 301 https://domaine.tld$request_uri; } server { #On écoute sur les ports 80 et 443 listen 80; listen 443 ssl http2; server_name domaine.tld; #Emplacement des fichiers du site root /var/www/site; index index.html index.php; charset utf-8; client_max_body_size 10M; #Certificats générés auparavant par Let’s Encrypt #On indique ici l’emplacement des certificats ssl_certificate /etc/letsencrypt/live/domaine.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/domaine.com/privkey.pem; include /etc/nginx/conf.d/ciphers.conf; error_page 500 502 503 504 /50x.html; }
Il ne reste plus ensuite qu’à redémarrer notre serveur web !
Les certificats Let’s Encrypt expire tout les trois mois (vous serez avertis par mail). Pour les renouveler :
service nginx/apache2 stop ./certbot-auto renew service nginx/apache2 start
On peut imaginer par la suite crée une tâche cron qui renouveleras automatiquements nos certificats avant les 90 jours.
SSLabs
SSLabs nous permet de vérifier la qualité de nos certificats TLS. C’est-à-dire le chiffrement, l’agorithme, la validité, HSTS, et si notre configuration TLS est faillible avec Heartbleed.
Après quelques minutes, et si tout c’est bien passé … *roulement de tambours*
Sources
https://mondedie.fr/d/7414-Tuto-Certificat-SSL-signe-gratuit-avec-Let-s-Encrypt-et-nginx
https://korben.info/securiser-facilement-gratuitement-site-https.html
https://wiki.mozilla.org/Security/Server_Side_TLS