Let's Encrypt est une autorité de certification gratuite, automatisée et ouverte développée par l'Internet Security Research Group (ISRG) qui fournit des certificats SSL gratuits.
Les certificats émis par Let's Encrypt sont approuvés par tous les principaux navigateurs et valides pendant 90 jours à compter de la date d'émission.
Ce tutoriel montre comment installer un certificat SSL Let's Encrypt gratuit sur Debian 10, Buster exécutant Nginx en tant que serveur Web. Nous montrerons également comment configurer Nginx pour utiliser le certificat SSL et activer HTTP/2.
Prérequis #
Assurez-vous que les conditions préalables suivantes sont remplies avant de poursuivre avec le guide :
- Connecté en tant qu'utilisateur root ou utilisateur avec des privilèges sudo.
- Le domaine pour lequel vous souhaitez obtenir le certificat SSL doit pointer vers l'IP de votre serveur public. Nous utiliserons
example.com
. - Nginx installé.
Installation de Certbot #
Nous utiliserons l'outil certbot pour obtenir et renouveler les certificats.
Certbot est un outil complet et facile à utiliser qui automatise les tâches d'obtention et de renouvellement des certificats SSL Let's Encrypt et de configuration des serveurs Web pour utiliser les certificats.
Le paquet certbot est inclus dans les référentiels Debian par défaut. Exécutez les commandes suivantes pour installer certbot :
sudo apt update
sudo apt install certbot
Génération du groupe Dh (Diffie-Hellman) #
L'échange de clés Diffie-Hellman (DH) est une méthode d'échange sécurisé de clés cryptographiques sur un canal de communication non sécurisé.
Nous allons générer un nouveau jeu de paramètres DH 2048 bits pour renforcer la sécurité :
sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
Vous pouvez également modifier la taille jusqu'à 4096 bits, mais la génération peut prendre plus de 30 minutes selon l'entropie du système.
Obtention d'un certificat SSL Let's Encrypt #
Pour obtenir un certificat SSL pour le domaine, nous allons utiliser le plugin Webroot. Cela fonctionne en créant un fichier temporaire pour valider le domaine demandé dans le ${webroot-path}/.well-known/acme-challenge
annuaire. Le serveur Let's Encrypt envoie des requêtes HTTP au fichier temporaire pour valider que le domaine demandé correspond au serveur sur lequel le certbot s'exécute.
Nous allons mapper toutes les requêtes HTTP pour .well-known/acme-challenge
dans un seul répertoire, /var/lib/letsencrypt
.
Exécutez les commandes suivantes pour créer le répertoire et le rendre accessible en écriture pour le serveur Nginx :
sudo mkdir -p /var/lib/letsencrypt/.well-known
sudo chgrp www-data /var/lib/letsencrypt
sudo chmod g+s /var/lib/letsencrypt
Pour éviter la duplication de code, nous allons créer deux extraits qui seront inclus dans tous les fichiers de blocage du serveur Nginx.
Ouvrez votre éditeur de texte et créez le premier extrait, letsencrypt.conf
:
sudo nano /etc/nginx/snippets/letsencrypt.conf
/etc/nginx/snippets/letsencrypt.conflocation ^~ /.well-known/acme-challenge/ {
allow all;
root /var/lib/letsencrypt/;
default_type "text/plain";
try_files $uri =404;
}
Le deuxième extrait ssl.conf
inclut les chippers recommandés par Mozilla, active l'agrafage OCSP, HTTP Strict Transport Security (HSTS) et applique quelques en-têtes HTTP axés sur la sécurité.
sudo nano /etc/nginx/snippets/ssl.conf
/etc/nginx/snippets/ssl.confssl_dhparam /etc/ssl/certs/dhparam.pem;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 30s;
add_header Strict-Transport-Security "max-age=63072000" always;
add_header X-Frame-Options SAMEORIGIN;
add_header X-Content-Type-Options nosniff;
Une fois cela fait, ouvrez le fichier de blocage du serveur de domaine et incluez le letsencrypt.conf
extrait comme indiqué ci-dessous :
sudo nano /etc/nginx/sites-available/example.com.conf
/etc/nginx/sites-available/example.com.confserver {
listen 80;
server_name example.com www.example.com;
include snippets/letsencrypt.conf;
}
Créer un lien symbolique vers le sites-enabled
répertoire pour activer le blocage du serveur de domaine :
sudo ln -s /etc/nginx/sites-available/example.com.conf /etc/nginx/sites-enabled/
Redémarrez le service Nginx pour que les modifications prennent effet :
sudo systemctl restart nginx
Vous êtes maintenant prêt à obtenir les fichiers de certificat SSL en exécutant la commande suivante :
sudo certbot certonly --agree-tos --email [email protected] --webroot -w /var/lib/letsencrypt/ -d example.com -d www.example.com
Si le certificat SSL est obtenu avec succès, le message suivant sera imprimé sur votre terminal :
IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/example.com/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/example.com/privkey.pem
Your cert will expire on 2020-02-22. 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
Modifiez le bloc de serveur de domaine et incluez les fichiers de certificat SSL comme suit :
sudo nano /etc/nginx/sites-available/example.com.conf
/etc/nginx/sites-available/example.com.confserver {
listen 80;
server_name www.example.com example.com;
include snippets/letsencrypt.conf;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name www.example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
include snippets/ssl.conf;
include snippets/letsencrypt.conf;
return 301 https://example.com$request_uri;
}
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
include snippets/ssl.conf;
include snippets/letsencrypt.conf;
# . . . other code
}
La configuration ci-dessus indique à Nginx de rediriger de HTTP vers HTTPS et de www vers une version non www.
Redémarrez ou rechargez le service Nginx pour que les modifications prennent effet :
sudo systemctl restart nginx
Ouvrez votre site Web en utilisant https://
, et vous remarquerez une icône de cadenas vert.
Si vous testez votre domaine à l'aide du test de serveur SSL Labs, vous obtiendrez un A+
note, comme indiqué dans l'image ci-dessous :
Certificat SSL à renouvellement automatique #
Les certificats de Let’s Encrypt sont valides pendant 90 jours. Pour renouveler automatiquement les certificats avant leur expiration, le package certbot crée un cronjob et un timer systemd. Le minuteur renouvellera automatiquement les certificats 30 jours avant son expiration.
Lorsque le certificat est renouvelé, nous devons également recharger le service nginx. Ouvrez le /etc/letsencrypt/cli.ini
et ajoutez la ligne suivante :
sudo nano /etc/letsencrypt/cli.ini
/etc/cron.d/certbotdeploy-hook = systemctl reload nginx
Testez le processus de renouvellement automatique en exécutant cette commande :
sudo certbot renew --dry-run
S'il n'y a pas d'erreurs, cela signifie que le processus de renouvellement a réussi.