Comment sécuriser Nginx avec Let’s Encrypt sur Ubuntu 20.04

Introduction

Let’s Encrypt est une autorité de certification (CA) qui fournit un moyen facile d’obtenir et d’installer gratuitement des certificats TLS/SSL, permettant ainsi le chiffrement HTTPS sur les serveurs web. Elle simplifie le processus en fournissant un client logiciel, Certbot, qui tente d’automatiser la plupart, voire tous, 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 Ubuntu 20.04 et configurerez votre certificat pour se renouveler automatiquement.

Ce tutoriel utilisera un fichier de configuration de serveur Nginx séparé au lieu du fichier par défaut. Nous recommandons de 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 en tant que configuration de secours.

Laissez DigitalOcean se charger de la gestion de Nginx et de Let’s Encrypt. La plateforme d’application DigitalOcean vous permettra de déployer directement depuis GitHub en quelques minutes. La plateforme d’application gérera également les certificats SSL et le routage pour vous.

Prérequis

Pour suivre ce tutoriel, vous aurez besoin de :

  • Un serveur Ubuntu 20.04 configuré en suivant ce tutoriel de configuration initiale du serveur pour Ubuntu 20.04, comprenant un utilisateur non-root avec les privilèges sudo 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 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 le tutoriel Comment installer Nginx sur Ubuntu 20.04. 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

La première étape pour utiliser Let’s Encrypt afin d’obtenir un certificat SSL est d’installer le logiciel Certbot sur votre serveur.

Installez Certbot ainsi que son plugin Nginx avec la commande apt:

  1. sudo apt install certbot python3-certbot-nginx

Certbot est maintenant prêt à être utilisé, mais pour qu’il configure automatiquement SSL pour Nginx, nous devons vérifier certaines configurations de Nginx.

Étape 2 – Confirmation de la configuration de Nginx

Certbot doit pouvoir trouver le bloc server correct dans votre configuration Nginx afin de 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 dans /etc/nginx/sites-available/example.com avec la directive server_name déjà définie correctement.

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

  1. sudo nano /etc/nginx/sites-available/example.com

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

/etc/nginx/sites-available/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 pour correspondre. Enregistrez ensuite le fichier, quittez votre éditeur et vérifiez la syntaxe de vos modifications de configuration:

  1. sudo nginx -t

Si vous obtenez une erreur, rouvrez le fichier du bloc 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 désormais trouver le bloc server correct et le mettre à jour automatiquement.

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

Étape 3 — Autoriser le trafic HTTPS à travers le pare-feu

Si vous avez activé le pare-feu ufw, comme recommandé par les guides préalables, vous devrez ajuster les paramètres pour autoriser le trafic HTTPS. Heureusement, Nginx enregistre quelques profils avec ufw lors de l’installation.

Vous pouvez voir le paramètre actuel en tapant:

  1. sudo ufw status

Il ressemblera probablement à ceci, ce qui signifie que seul le trafic HTTP est autorisé vers le serveur web:

Output
Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere Nginx HTTP ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) Nginx HTTP (v6) ALLOW Anywhere (v6)

Pour permettre en plus le trafic HTTPS, autorisez le profil Nginx Full et supprimez l’autorisation redondante du profil Nginx HTTP:

  1. sudo ufw allow 'Nginx Full'
  2. sudo ufw delete allow 'Nginx HTTP'

Votre statut devrait maintenant ressembler à ceci:

  1. sudo ufw status
Output
Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere Nginx Full ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) Nginx Full (v6) ALLOW Anywhere (v6)

Ensuite, exécutons Certbot et récupérons nos 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 cela est 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 nous voulons que le certificat soit valide.

Si c’est la première fois que vous exécutez certbot, on vous demandera d’entrer une adresse e-mail et d’accepter les conditions d’utilisation. Après avoir fait cela, certbot communiquera avec le serveur Let’s Encrypt, puis lancera un défi pour vérifier que vous contrôlez le domaine pour lequel vous demandez un certificat.

Si cela réussit, certbot vous demandera comment vous souhaitez configurer vos paramètres HTTPS.

Output
Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1: No redirect - Make no further changes to the webserver configuration. 2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for new sites, or if you're confident your site works on HTTPS. You can undo this change by editing your web server's configuration. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Select the appropriate number [1-2] then [enter] (press 'c' to cancel):

Sélectionnez votre choix puis appuyez sur ENTRÉE. La configuration sera mise à jour et Nginx se rechargera pour prendre en compte les nouveaux paramètres. certbot terminera avec un message vous indiquant que le processus a été réussi et où sont stockés vos certificats :

Output
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-08-18. To obtain a new or tweaked version of this certificate in the future, simply run certbot again with the "certonly" option. 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

Vos certificats sont téléchargés, installés et chargés. Essayez de recharger votre site Web en utilisant https:// 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 verrou. Si vous testez votre serveur en utilisant le Test de serveur 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 de Let’s Encrypt ne sont valides que pendant quatre-vingt-dix jours. Cela vise à encourager les utilisateurs à automatiser leur processus de renouvellement de certificat. Le package certbot que nous avons installé s’occupe de cela pour nous en ajoutant une minuterie systemd qui s’exécutera deux fois par jour et renouvellera automatiquement tout certificat qui expire dans les trente jours.

Vous pouvez interroger l’état de la minuterie avec systemctl:

  1. sudo systemctl status certbot.timer
Output
● certbot.timer - Run certbot twice daily Loaded: loaded (/lib/systemd/system/certbot.timer; enabled; vendor preset: enabled) Active: active (waiting) since Mon 2020-05-04 20:04:36 UTC; 2 weeks 1 days ago Trigger: Thu 2020-05-21 05:22:32 UTC; 9h left Triggers: ● certbot.service

Pour tester le processus de renouvellement, vous pouvez effectuer un essai à sec avec certbot:

  1. sudo certbot renew --dry-run

Si vous ne voyez pas d’erreurs, vous êtes prêt. Si nécessaire, Certbot renouvellera vos certificats et rechargera Nginx pour prendre en compte les modifications. Si le processus de renouvellement automatique échoue, Let’s Encrypt enverra un message à l’adresse e-mail que vous avez spécifiée pour vous avertir lorsque votre certificat est sur le point d’expirer.

Conclusion

Dans ce tutoriel, vous avez installé le client Let’s Encrypt certbot, téléchargé des certificats SSL pour votre domaine, configuré Nginx pour utiliser ces certificats, et mis en place le renouvellement automatique des certificats. Si vous avez d’autres questions sur l’utilisation de Certbot, la documentation officielle est un bon point de départ.

Source:
https://www.digitalocean.com/community/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-ubuntu-20-04