Let's Encrypt est une autorité de certification gratuite et ouverte développée par l'Internet Security Research Group (ISRG). Les certificats émis par Let's Encrypt sont aujourd'hui approuvés par presque tous les navigateurs.
Dans ce tutoriel, nous expliquerons comment utiliser l'outil Certbot pour obtenir un certificat SSL gratuit pour Nginx sur Debian 9. 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 ce didacticiel :
- Connecté en tant qu'utilisateur avec des privilèges sudo.
- Avoir un nom de domaine pointant vers l'adresse IP de votre serveur public. Nous utiliserons
example.com
. - Faites installer Nginx en suivant ces instructions
- Vous disposez d'un bloc de serveur pour votre domaine. Vous pouvez suivre ces instructions pour savoir comment en créer un.
Installer Certbot #
Certbot est un outil complet et facile à utiliser qui peut automatiser 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 package certbot est inclus dans les référentiels Debian par défaut.
Mettez à jour la liste des packages et installez le package certbot :
sudo apt update
sudo apt install certbot
Générer le numéro de groupe Strong 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
Si vous le souhaitez, vous pouvez modifier la taille jusqu'à 4096 bits, mais dans ce cas, la génération peut prendre plus de 30 minutes en fonction de l'entropie du système. Obtention d'un certificat SSL Let's Encrypt #
Pour obtenir un certificat SSL pour notre domaine, nous allons utiliser le plugin Webroot qui 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
.
Les commandes suivantes créeront le répertoire et le rendront 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, créez les deux extraits de code suivants qui seront inclus dans tous nos fichiers de bloc de 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;
}
Créez le deuxième extrait ssl.conf
qui 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:50m;
ssl_session_tickets off;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS';
ssl_prefer_server_ciphers on;
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=15768000; includeSubdomains; preload";
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;
}
Activez le nouveau bloc de serveur en créant un lien symbolique vers le sites-enabled
répertoire :
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 pouvez maintenant exécuter Certbot avec le plugin webroot et obtenir les fichiers de certificat SSL en émettant :
sudo certbot certonly --agree-tos --email admin@example.com --webroot -w /var/lib/letsencrypt/ -d example.com -d www.example.com
Si le certificat SSL est obtenu avec succès, le message suivant s'imprimera 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 2018-07-28. 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"
- Your account credentials have been saved in your Certbot
configuration directory at /etc/letsencrypt. You should make a
secure backup of this folder now. This configuration directory will
also contain certificates and private keys obtained by Certbot so
making regular backups of this folder is ideal.
- 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
Ensuite, modifiez le bloc du serveur de domaine 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
}
Avec la configuration ci-dessus, nous forçons HTTPS et la redirection de www vers une version non www.
Rechargez le service Nginx pour que les modifications prennent effet :
sudo systemctl reload nginx
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 une tâche cron qui s'exécute deux fois par jour et renouvelle automatiquement tout certificat 30 jours avant son expiration.
Comme nous utilisons le plug-in certbot webroot une fois le certificat renouvelé, nous devons également recharger le service nginx. Ajouter --renew-hook "systemctl reload nginx"
au /etc/cron.d/certbot
fichier pour qu'il ressemble à ceci :
sudo nano /etc/cron.d/certbot
/etc/cron.d/certbot0 */12 * * * root test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(3600))' && certbot -q renew --renew-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.