Comment sécuriser Nginx avec Let’s Encrypt sur Rocky Linux 9

Introduction

Let’s Encrypt est une autorité de certification (CA) qui fournit un moyen accessible d’obtenir et d’installer gratuitement des certificats TLS/SSL, permettant ainsi de sécuriser les serveurs web avec HTTPS chiffré. Elle simplifie le processus en fournissant un client logiciel, Certbot, qui tente d’automatiser la plupart, voire la totalité, des étapes requises. Actuellement, l’ensemble du processus d’obtention et d’installation d’un certificat est entièrement automatisé à la fois sur Apache et Nginx.

Dans ce tutoriel, vous utiliserez Certbot pour obtenir un certificat SSL gratuit pour Nginx sur Rocky Linux 9 et configurer votre certificat pour qu’il se renouvelle automatiquement.

Ce tutoriel utilisera un fichier de configuration de serveur Nginx séparé au lieu du fichier par défaut. Vous devriez créer de nouveaux fichiers de bloc serveur Nginx pour chaque domaine car cela aide à éviter les erreurs courantes et à maintenir les fichiers par défaut comme une configuration de secours.

Prérequis

Pour suivre ce tutoriel, vous aurez besoin de :

  • Un serveur Rocky Linux 9 mis en place en suivant ce tutoriel configuration initiale du serveur pour Rocky Linux 9 , comprenant un utilisateur non-root avec sudo activé et un pare-feu.

  • Un nom de domaine enregistré. Ce tutoriel utilisera example.com comme exemple. Vous pouvez acheter un nom de domaine chez Namecheap, en obtenir un gratuitement avec Freenom, ou utiliser le registraire de domaine de votre choix.

  • Les deux enregistrements DNS suivants doivent être configurés pour votre serveur. Si vous utilisez DigitalOcean, veuillez consulter notre documentation sur les DNS pour savoir comment les ajouter.

    • Un enregistrement A avec example.com pointant vers l’adresse IP publique de votre serveur.
    • Un enregistrement A avec www.example.com pointant vers l’adresse IP publique de votre serveur.
  • Nginx installé en suivant Comment installer Nginx sur Rocky Linux 9. Assurez-vous d’avoir un bloc serveur pour votre domaine. Ce tutoriel utilisera /etc/nginx/sites-available/example.com comme exemple.

Étape 1 — Installation de Certbot

D’abord, vous devez installer le paquet logiciel certbot. Connectez-vous à votre machine Rocky Linux 8 en tant qu’utilisateur non-root:

  1. ssh sammy@your_server_ip

Le paquet certbot n’est pas disponible par défaut dans le gestionnaire de paquets. Vous devrez activer le référentiel EPEL pour installer Certbot.

Pour ajouter le référentiel EPEL de Rocky Linux 9, exécutez la commande suivante:

  1. sudo dnf install epel-release

Lorsqu’on vous demande de confirmer l’installation, tapez et appuyez sur y.

Maintenant que vous avez accès au référentiel supplémentaire, installez tous les paquets requis :

  1. sudo dnf install certbot python3-certbot-nginx

Cela installera Certbot lui-même ainsi que le plugin Nginx pour Certbot, nécessaire pour exécuter le programme.

Le processus d’installation vous demandera d’importer une clé GPG. Confirmez cela pour que l’installation puisse se terminer.

Maintenant que Certbot est installé, exécutons-le pour obtenir un certificat.

Étape 2 — Confirmation de la configuration de Nginx

Certbot doit être en mesure de trouver le bloc server correct dans votre configuration Nginx pour pouvoir configurer automatiquement SSL. Plus précisément, il le fait en recherchant une directive server_name qui correspond au domaine pour lequel vous demandez un certificat.

Si vous avez suivi l’étape de configuration du bloc serveur dans le tutoriel d’installation de Nginx, vous devriez avoir un bloc serveur pour votre domaine à /etc/nginx/conf.d/example.com avec la directive server_name déjà définie correctement.

Pour vérifier, ouvrez le fichier de configuration pour votre domaine avec nano ou votre éditeur de texte préféré:

  1. sudo nano /etc/nginx/conf.d/example.com

Recherchez la ligne server_name existante. Elle devrait ressembler à ceci:

/etc/nginx/conf.d/example.com
...
server_name example.com www.example.com;
...

Si c’est le cas, quittez votre éditeur et passez à l’étape suivante.

Si ce n’est pas le cas, mettez-le à jour. Enregistrez ensuite le fichier, quittez votre éditeur et vérifiez la syntaxe de vos modifications de configuration :

  1. sudo nginx -t

Si vous rencontrez une erreur, rouvrez le fichier de bloc de serveur et vérifiez s’il y a des fautes de frappe ou des caractères manquants. Une fois que la syntaxe de votre fichier de configuration est correcte, rechargez Nginx pour charger la nouvelle configuration:

  1. sudo systemctl reload nginx

Certbot peut maintenant trouver le bloc de serveur correct et le mettre à jour automatiquement.

Ensuite, mettons à jour le pare-feu pour autoriser le trafic HTTPS.

Étape 3 — Mise à jour des règles du pare-feu

Étant donné que votre configuration préalable permet firewalld, vous devrez ajuster les paramètres du pare-feu pour autoriser les connexions externes sur votre serveur web Nginx.

Pour vérifier les services déjà activés, exécutez la commande:

  1. sudo firewall-cmd --permanent --list-all

Vous recevrez une sortie comme ceci:

Output
public target: default icmp-block-inversion: no interfaces: sources: services: cockpit dhcpv6-client http ssh ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules:

Si vous ne voyez pas http dans la liste des services, activez-le en exécutant:

  1. sudo firewall-cmd --permanent --add-service=http

Pour autoriser le trafic https, exécutez la commande suivante:

  1. sudo firewall-cmd --permanent --add-service=https

Pour appliquer les modifications, vous devrez recharger le service pare-feu:

  1. sudo firewall-cmd --reload

Maintenant que vous avez ouvert votre serveur au trafic https, vous êtes prêt à exécuter Certbot et à récupérer vos certificats.

Étape 4 — Obtention d’un certificat SSL

Certbot propose plusieurs façons d’obtenir des certificats SSL via des plugins. Le plugin Nginx se chargera de reconfigurer Nginx et de recharger la configuration lorsque nécessaire. Pour utiliser ce plugin, tapez ce qui suit :

  1. sudo certbot --nginx -d example.com -d www.example.com

Cela exécute certbot avec le plugin --nginx, en utilisant -d pour spécifier les noms de domaine pour lesquels vous avez besoin que le certificat soit valide.

Lors de l’exécution de la commande, vous serez invité à saisir une adresse e-mail et à accepter les conditions d’utilisation. Après cela, vous devriez voir un message vous indiquant que le processus s’est déroulé avec succès et où vos certificats sont stockés :

Output
Successfully received certificate. Certificate is saved at: /etc/letsencrypt/live/your_domain/fullchain.pem Key is saved at: /etc/letsencrypt/live/your_domain/privkey.pem This certificate expires on 2022-12-15. These files will be updated when the certificate renews. Certbot has set up a scheduled task to automatically renew this certificate in the background. Deploying certificate Successfully deployed certificate for your_domain to /etc/nginx/conf.d/your_domain.conf Successfully deployed certificate for www.your_domain to /etc/nginx/conf.d/your_domain.conf Congratulations! You have successfully enabled HTTPS on https://your_domain and https://www.your_domain

Vos certificats sont téléchargés, installés, et chargés, et votre configuration Nginx redirigera désormais automatiquement toutes les demandes web vers https://. Essayez de recharger votre site web et remarquez l’indicateur de sécurité de votre navigateur. Il devrait indiquer que le site est correctement sécurisé, généralement avec une icône de cadenas. Si vous testez votre serveur en utilisant le Test de serveur SSL de SSL Labs, il obtiendra une note A.

Terminons en testant le processus de renouvellement.

Étape 5 — Vérification du renouvellement automatique de Certbot

Les certificats Let’s Encrypt sont valides pendant 90 jours, mais il est recommandé de les renouveler tous les 60 jours pour prévoir une marge d’erreur. Le client Let’s Encrypt Certbot dispose d’une commande renew qui vérifie automatiquement les certificats actuellement installés et tente de les renouveler s’ils expirent dans moins de 30 jours.

Vous pouvez tester le renouvellement automatique de vos certificats en exécutant cette commande :

  1. sudo certbot renew --dry-run

La sortie sera similaire à ceci :

Output
Saving debug log to /var/log/letsencrypt/letsencrypt.log - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Processing /etc/letsencrypt/renewal/your_domain.conf - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Cert not due for renewal, but simulating renewal for dry run Plugins selected: Authenticator nginx, Installer nginx Renewing an existing certificate Performing the following challenges: http-01 challenge for monitoring.pp.ua Waiting for verification... Cleaning up challenges - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - new certificate deployed with reload of nginx server; fullchain is /etc/letsencrypt/live/your_domain/fullchain.pem - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ** DRY RUN: simulating 'certbot renew' close to cert expiry ** (The test certificates below have not been saved.) Congratulations, all renewals succeeded. The following certs have been renewed: /etc/letsencrypt/live/your_domain/fullchain.pem (success) ...

Remarquez que si vous avez créé un certificat regroupé avec plusieurs domaines, seul le nom de domaine de base apparaîtra dans la sortie, mais le renouvellement fonctionnera pour tous les domaines inclus dans ce certificat.

A practical way to ensure your certificates will not get outdated is to create a cron job that will periodically execute the automatic renewal command for you. Since the renewal first checks for the expiration date and only executes the renewal if the certificate is less than 30 days away from expiration, it is safe to create a cron job that runs every week, or even every day.

Modifiez le crontab pour créer une nouvelle tâche qui exécutera le renouvellement deux fois par jour. Pour modifier le crontab de l’utilisateur root, exécutez :

  1. sudo crontab -e

Votre éditeur de texte ouvrira le crontab par défaut, qui est à ce stade un fichier texte vide. Passez en mode insertion en appuyant sur i et ajoutez la ligne suivante :

crontab
0 0,12 * * * python -c 'import random; import time; time.sleep(random.random() * 3600)' && certbot renew --quiet

Quand vous avez terminé, appuyez sur ESC pour quitter le mode insertion, puis saisissez :wq et appuyez sur ENTRÉE pour enregistrer et quitter le fichier. Pour en savoir plus sur l’éditeur de texte Vi et son successeur Vim, consultez notre tutoriel Installation et utilisation de l’éditeur de texte Vim sur un serveur cloud.

Cela créera une nouvelle tâche cron qui s’exécutera à midi et à minuit tous les jours. python -c 'import random; import time; time.sleep(random.random() * 3600)' sélectionnera une minute aléatoire dans l’heure pour vos tâches de renouvellement.

La commande renew pour Certbot vérifiera tous les certificats installés sur le système et mettra à jour ceux qui sont configurés pour expirer dans moins de trente jours. --quiet indique à Certbot de ne pas afficher d’informations ou d’attendre une saisie utilisateur.

Des informations plus détaillées sur le renouvellement peuvent être trouvées dans la documentation de Certbot.

Conclusion

Dans ce guide, vous avez installé le client Let’s Encrypt Certbot, téléchargé des certificats SSL pour votre domaine et configuré le renouvellement automatique des certificats. Si vous avez des questions sur l’utilisation de Certbot, vous pouvez consulter la documentation officielle de Certbot.

Vous pouvez également consulter le blog officiel de Let’s Encrypt pour des mises à jour importantes de temps en temps.

Source:
https://www.digitalocean.com/community/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-rocky-linux-9