0

[HTTPS] Génération d’un certificat TLS avec Let’s Encrypt

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.

SSLabs, c’est par ici !

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

Supras

Supras

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *