Let's Encrypt est une autorité de certification gratuite, open source et automatisée lancée par Internet Security Research Group (ISRG) et propose des certificats SSL/TLS pour chiffrer les communications impliquant deux parties.
Un certificat SSL sur votre site Web augmentera non seulement la sécurité de votre site Web grâce au cryptage, mais améliorera également le classement SEO de votre site puisque Google a rendu obligatoire l'inclusion d'un certificat SSL pour un meilleur classement SEO.
Dans cet article, nous verrons comment sécuriser un serveur NGINX avec le certificat SSL Let's Encrypt dans Ubuntu 18.04.
Prérequis
- Vous avez les privilèges d'ouvrir une session SSH sur le serveur Ubuntu 18.04 soit en utilisant un utilisateur root, soit en utilisant un utilisateur activé sudo.
- Vous avez déjà installé NGINX en suivant notre tutoriel à partir d'ici.
- Un nom de domaine enregistré.
- DNS Un enregistrement qui pointe vers l'adresse IP de votre serveur en fonction du nom de domaine que vous souhaitez utiliser.
Installer la bibliothèque Let's Encrypt Client
La toute première étape que vous devez accomplir est d'installer la bibliothèque cliente Let's Encrypt qui, à son tour, sera utilisée pour demander des certificats à l'autorité LE. Pour ce faire, vous pouvez notamment cloner la bibliothèque client Let's Encrypt à partir de son référentiel officiel sur votre serveur.
Il est également possible d'installer le même à partir du référentiel officiel d'Ubuntu. Dans le référentiel d'Ubuntu, la bibliothèque cliente est connue sous le nom de certbot fourni par les développeurs de Let's Encrypt. Mais nous choisirons la première méthode d'installation, c'est-à-dire en clonant le dépôt Github de Let's Encrypt.
Pour ce faire, accédez au dossier d'installation de votre choix et clonez le référentiel. J'ai choisi le dossier d'installation comme /usr/local
, vous pouvez choisir un autre dossier en fonction de votre environnement.
# apt-get install git
# cd /usr/local
# git clone https://github.com/letsencrypt/letsencrypt
Allez dans le dossier Letsencrypt, vous trouverez tous les dossiers et fichiers clonés, y compris le certbot, nécessaires à Let's encrypt pour récupérer les certificats pour vous.
Liste Lets Encrypt Folder
Configurez Let's Encrypt pour vérifier votre domaine
Lors du processus de récupération d'un certificat, le client Let's Encrypt crée un fichier temporaire dans .well-known/acme-challenge
dossier. Ce fichier contient un jeton pour valider le fait que vous possédez réellement le domaine pour lequel vous essayez de récupérer les certificats. N'oubliez pas que ledit dossier relève de la racine Web du domaine.
Par conséquent, il est impératif que Let's Encrypt puisse accéder au fichier temporaire pour vérifier le domaine. Pour accorder l'accès, vous devez configurer NGINX puisqu'il est le propriétaire de la racine Web du domaine. Ajoutez un bloc d'emplacement spécifiquement pour le dossier /.well-known/acme-challenge
cela permettra à Let's Encrypt de placer un jeton pour la vérification de domaine. Pour ce faire, modifiez le fichier de configuration NGINX pour votre hôte virtuel. N'oubliez pas d'ajuster le dossier racine en fonction de votre environnement.
server {
listen 80;
server_name SUBDOMAIN.DOMAIN.TLD;
root /var/www/html/wordpress;
...
...
...
location /.well-known/acme-challenge {
allow all;
default_type "text/plain";
}
...
...
}
Vérifiez que la syntaxe du fichier de configuration est correcte et redémarrez NGINX :
# nginx -t
# systemctl restart nginx
Configurer le pare-feu UFW
Ubuntu 18.04 est livré avec un gestionnaire de pare-feu par défaut UFW et si vous l'avez déjà activé et qu'il s'exécute sur votre serveur, aucune connexion HTTP ou HTTPS ne sera autorisée à atteindre le serveur NGINX.
Il est également possible que vous essayiez d'installer des certificats sur un serveur précédemment configuré et que les règles de pare-feu soient déjà présentes. Bien sûr, vous pouvez lister les règles de pare-feu en utilisant ufw status
sur votre serveur avant de procéder à l'activation des connexions HTTP et HTTPS sur votre serveur Ubuntu 18.04.
Exécutez l'ensemble de commandes suivant dans le terminal pour autoriser les connexions HTTP et HTTPS sur votre serveur.
# ufw status
# ufw allow http
# ufw allow https
# ufw reload
Demander un certificat SSL Let's Encrypt
Demandons un certificat SSL pour le domaine choisi en utilisant le client Let's Encrypt que nous avons cloné précédemment. Bien qu'il existe de nombreuses options de configuration disponibles que l'on peut utiliser avec le script Let's Encrypt lors de la demande d'un certificat, nous n'utiliserons que les options suivantes.
- certainement :Cette option indique au script letsencrypt d'obtenir uniquement le certificat SSL. Nous ferons la configuration de NGINX manuellement plus tard.
- racine Web :Cette option spécifie le plug-in Webroot à utiliser dans le processus de validation du nom de domaine.
- chemin racine Web :Cette option définit la racine du domaine et doit pointer vers l'emplacement du site Web que vous avez configuré dans la configuration NGINX.
- acceptez :signifie accepter les conditions d'utilisation de Let's Encrypt.
- courriel :L'e-mail est utilisé pour recevoir un avis d'expiration de Let's Encrypt, mais peut également être utilisé pour récupérer la clé perdue.
- d :Cette option spécifie le nom de domaine pour lequel le certificat sera demandé.
En combinant maintenant les options ci-dessus avec le script client Letsencrypt, demandez un certificat à l'aide des commandes suivantes :
# cd /usr/local/letsencrypt
# ./letsencrypt-auto certonly --agree-tos --email [email protected] --webroot --webroot-path /var/www/html/wordpress -d SUBDOMAIN.DOMAIN.TLD
Récupération Lets Encrypt Certificate avec succès
Le script Let's Encrypt vous montrera une petite note une fois que les certificats SSL ont été récupérés avec succès et les certificats seront stockés dans le /etc/letsencrypt/live
dossier.
Configurer NGINX pour le certificat SSL Let's Encrypt
À ce stade, la chaîne de certificats Let's Encrypt a été enregistrée avec succès sur votre serveur. Passez maintenant à la configuration du fichier d'hôte virtuel pour un serveur Web NGINX sécurisé compatible SSL.
Générer une clé Diffie-Hellman
Bien que l'utilisation de la clé Diffie-Hellman soit facultative lors de la configuration des certificats Let's Encrypt avec NGINX, elle est principalement utilisée comme méthode d'échange sécurisé de clés de chiffrement à utiliser dans le certificat Let's encrypt.
# mkdir -p /etc/nginx/ssl
# cd /etc/nginx/ssl
# openssl dhparam -out /etc/nginx/ssl/dhparam.pem 4096
J'ai placé le fichier de paramètres DH dans le /etc/nginx/ssl
répertoire simplement pour plus de commodité. Vous pouvez placer le fichier à un autre emplacement.
Configurer les paramètres SSL
Ensuite, ajoutez des paramètres pour la connexion SSL comme les versions de protocole, les suites de chiffrement, la session, les en-têtes que votre serveur doit prendre en charge dans un fichier séparé.
Cela mettra en place une suite de chiffrement forte qui activera le Forward Secrecy dans la mesure du possible. De plus, nous allons également activer HSTS et HPKP pour renforcer le serveur NGINX pour les connexions SSL. Cela permettra à une configuration SSL solide et à l'épreuve du temps d'obtenir une note A+ au test SSL de Qualys Labs .
# vi /etc/nginx/conf.d/ssl.conf
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:ECDHE-RSA-AES128-GCM-SHA256:AES256+EECDH:DHE-RSA-AES128-GCM-SHA256:AES256+EDH:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4";
ssl_dhparam /etc/nginx/ssl/dhparam.pem;
server_tokens off;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
#Online Certificate Status Protocol Stapling
ssl_stapling on;
ssl_stapling_verify on;
ssl_session_tickets off;
#HTTP Strict Transport Security
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
ssl_trusted_certificate /etc/letsencrypt/live/SUBDOMAIN.DOMAIN.TLD/chain.pem;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
add_header X-Frame-Options DENY;
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options nosniff;
add_header X-Robots-Tag none;
Modifier l'hôte virtuel NGINX
Enfin, modifiez les blocs de serveur NGINX pour le domaine que vous avez choisi. Accédez à l'emplacement par défaut des blocs de serveur NGINX qui est /etc/nginx/sites-available
et modifiez le fichier d'hôte virtuel NGINX.
# vi /etc/nginx/sites-available/your_nginx_file.conf
server {
listen 80;
listen [::]:80;
server_name SUBDOMAIN.DOMAIN.TLD;
return 301 https://$host$request_uri;
}
...
...
Le bloc de serveur ci-dessus demande à NGINX d'écouter toute demande entrante dans le port 80 pour le domaine SUBDOMAIN.DOMAIN.TLD
et redirigez-le vers la section https, dont la configuration est donnée ci-dessous.
...
...
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
root /var/www/html/wordpress;
index index.html index.php index.htm;
server_name SUBDOMAIN.DOMAIN.TLD;
error_log /var/log/nginx/SUBDOMAIN.DOMAIN.TLD-error.log debug;
access_log /var/log/nginx/SUBDOMAIN.DOMAIN.TLD-access.log;
ssl_certificate /etc/letsencrypt/live/SUBDOMAIN.DOMAIN.TLD/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/SUBDOMAIN.DOMAIN.TLD/privkey.pem;
include /etc/nginx/conf.d/ssl.conf;
location /.well-known/acme-challenge {
allow all;
default_type "text/plain";
}
location / {
try_files $uri $uri/ =404;
}
location = /favicon.ico {
log_not_found off;
access_log off;
}
location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}
location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
expires max;
log_not_found off;
}
}
Vérifiez le fichier de configuration pour toute erreur syntaxique :
# nginx -t
Pour activer le bloc serveur, créez un lien symbolique du fichier de configuration de l'hôte virtuel ci-dessus dans /etc/nginx/sites-enabled
dossier.
# cd /etc/nginx/sites-enabled
# ln -s ../sites-available/your_nginx_file.conf .
Rechargez NGINX pour appliquer les nouveaux paramètres :
# systemctl reload nginx
Pour analyser la configuration des paramètres SSL ci-dessus, pointez votre navigateur vers SSL Labs Test et saisissez votre nom de domaine et cliquez sur "Soumettre". Attendez une minute pour voir le résumé du test. Une note A+ signifie que nous avons inclus la plupart des options SSL dans le processus de sécurisation du serveur NGINX.
Renouvellement automatique du certificat Let's Encrypt
Les certificats Let's Encrypt sont valables 90 jours. L'objectif est de limiter les dommages causés par la compromission des clés et d'encourager l'automatisation.
Pour automatiser le processus de renouvellement des certificats, créez une tâche cron à l'aide de crontab et ajoutez une ligne de script qui s'exécutera une fois par semaine pour renouveler les certificats lorsqu'ils sont sur le point d'expirer.
# crontab -e
45 4 * * 6 cd /usr/local/letsencrypt/ && ./certbot-auto renew && systemctl restart nginx
Le script d'une seule ligne ci-dessus s'exécutera tous les samedis pour vérifier si les certificats doivent être renouvelés et, le cas échéant, il renouvellera les certificats suivi du redémarrage du serveur NGINX.
Notez qu'il n'est pas entièrement optimisé car le serveur NGINX sera redémarré même si le certificat n'est pas renouvelé. La meilleure option serait d'écrire un script personnalisé pour renouveler le certificat SSL et redémarrer le serveur NGINX si les certificats sont effectivement renouvelés.
Conclusion
Dans cet article, nous avons appris comment installer la bibliothèque client Let’s Encrypt, demander un certificat pour votre domaine et comment configurer les certificats SSL Let’s Encrypt avec NGINX. De plus, un exemple de cronjob vous montre également comment gérer régulièrement le processus de renouvellement du certificat.