Recherche sur le site Web

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


Introduction

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

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

Points clés

  • Utilisez le plugin Nginx de Certbot pour obtenir et installer des certificats Let’s Encrypt gratuits en quelques minutes.
  • Fonctionne sur Ubuntu 22.04 (Jammy), 24.04 (Noble) et 25.04 (Lunar).
  • Activer le renouvellement automatique ; les certificats sont valides pendant 90 jours et se renouvellent automatiquement.
  • Renforcez HTTPS avec HSTS et des suites de chiffrement modernes; validez avec SSL Labs.
  • Assurez-vous que les enregistrements DNS A et les ports 80/443 sont accessibles; la plupart des échecs de validation sont liés au réseau ou au DNS.

Prérequis

Pour suivre ce tutoriel, vous aurez besoin de :

  • Un serveur Ubuntu configuré en suivant ce tutoriel de configuration initiale du serveur Ubuntu, incluant un utilisateur non root avec des privilèges sudo et un pare-feu.

  • Un nom de domaine enregistré. Ce tutoriel utilisera example.com tout au long. Vous pouvez acheter un nom de domaine sur Namecheap, ou utiliser Google Domains ou votre registraire de domaine préféré.

  • Les deux enregistrements DNS suivants doivent être configurés pour votre serveur. Si vous utilisez Linux-Console.net, veuillez consulter notre documentation 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 guide Comment installer Nginx sur Ubuntu. 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

Certbot recommande d’utiliser leur paquet snap pour l’installation. Les paquets snap fonctionnent sur presque toutes les distributions Linux, mais ils exigent que vous ayez d’abord installé snapd pour pouvoir gérer les paquets snap. Ubuntu est livré avec le support de snap (22.04, 24.04, 25.04). Commencez par vous assurer que snapd est à jour :

sudo snap install core; sudo snap refresh core

Si vous travaillez sur un serveur qui avait auparavant une version plus ancienne de Certbot installée, vous devriez la supprimer avant d’aller plus loin :

sudo apt remove certbot

Après cela, vous pouvez installer le paquet certbot :

sudo snap install --classic certbot

Enfin, vous pouvez lier la commande certbot à partir du répertoire d'installation du snap à votre chemin, afin de pouvoir l'exécuter simplement en tapant certbot. Cela n'est pas nécessaire sur tous les systèmes, mais les snaps ont tendance à être moins intrusifs par défaut, donc ils ne rentrent pas en conflit accidentellement avec d'autres paquets du système :

sudo ln -s /snap/bin/certbot /usr/bin/certbot

Alternative (APT) : Dans certains environnements sans snapd, vous pouvez installer à partir des dépôts Ubuntu :

sudo apt update

sudo apt install -y certbot python3-certbot-nginx

La distribution Snap demeure la méthode d’installation recommandée par l’équipe Certbot pour bénéficier des dernières fonctionnalités et des mises à jour en temps opportun.

Maintenant que nous avons installé Certbot, exécutons-le pour obtenir notre certificat.

Étape 2 — Confirmer la configuration de Nginx

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

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

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

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

...
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 qu’il corresponde. Ensuite, enregistrez le fichier, quittez votre éditeur et vérifiez la syntaxe de vos modifications de configuration :

sudo nginx -t

Si vous obtenez une erreur, rouvrez le fichier du bloc serveur et vérifiez qu'il n'y a pas de fautes de frappe ou de caractères manquants. Une fois que la syntaxe de votre fichier de configuration est correcte, rechargez Nginx pour appliquer la nouvelle configuration :

sudo systemctl reload nginx

Certbot peut maintenant trouver le bon bloc server et le mettre à jour automatiquement.

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

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

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

Vous pouvez voir le paramètre actuel en tapant :

sudo ufw status

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

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere                  
Nginx HTTP                 ALLOW       Anywhere                  
OpenSSH (v6)               ALLOW       Anywhere (v6)             
Nginx HTTP (v6)            ALLOW       Anywhere (v6)

Pour autoriser également le trafic HTTPS, autorisez le profil Nginx Full et supprimez l'autorisation redondante du profil Nginx HTTP :

sudo ufw allow 'Nginx Full'

sudo ufw delete allow 'Nginx HTTP'

Votre statut devrait maintenant ressembler à ceci :

sudo ufw status
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 — Obtenir un certificat SSL

Certbot offre plusieurs façons d'obtenir des certificats SSL grâce à des plugins. Le plugin Nginx se chargera de reconfigurer Nginx et de recharger la configuration chaque fois que nécessaire. Pour utiliser ce plugin, tapez ce qui suit :

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.

Lorsque vous exécutez la commande, vous serez invité à entrer une adresse courriel et à accepter les conditions d'utilisation. Après cela, vous devriez voir un message vous indiquant que le processus a été réussi et où vos certificats sont stockés :

IMPORTANT NOTES:
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-06-01.
These files will be updated when the certificate renews.
Certbot has set up a scheduled task to automatically renew this certificate in the background.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
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, et votre configuration Nginx redirigera désormais automatiquement toutes les requêtes web vers https://. Essayez de recharger votre site web et observez 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 avec le test SSL Labs Server Test, 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 encourage les utilisateurs à automatiser leur processus de renouvellement de certificat. Le paquet certbot que nous avons installé s’en occupe pour nous en ajoutant un minuteur systemd qui s’exécutera deux fois par jour et renouvellera automatiquement tout certificat qui arrive à expiration dans moins de trente jours.

Vous pouvez vérifier l'état du minuteur avec systemctl :

sudo systemctl status snap.certbot.renew.service
○ snap.certbot.renew.service - Service for snap application certbot.renew
     Loaded: loaded (/etc/systemd/system/snap.certbot.renew.service; static)
     Active: inactive (dead)
TriggeredBy: ● snap.certbot.renew.timer

Pour tester le processus de renouvellement, vous pouvez effectuer un test à blanc avec certbot :

sudo certbot renew --dry-run

Si vous ne voyez aucune erreur, tout est prêt. Au besoin, Certbot renouvellera vos certificats et rechargera Nginx pour prendre en compte les modifications. Si le processus de renouvellement automatisé échoue, Let’s Encrypt enverra un message à l’adresse courriel que vous avez spécifiée pour vous avertir lorsque votre certificat est sur le point d’expirer.

Si vous préférez les hooks, vous pouvez ajouter un post-hook pour recharger Nginx seulement lorsqu'un certificat est renouvelé :

sudo certbot renew --dry-run --post-hook "systemctl reload nginx"

Sur les systèmes utilisant des paquets APT, une tâche cron peut gérer les renouvellements ; avec snap, un minuteur systemd (snap.certbot.renew.timer) s'exécute deux fois par jour.

Configuration des meilleures pratiques HTTPS (HSTS, chiffrements, redirections)

Renforcez votre configuration TLS pour réduire les risques de rétrogradation et de contenu mixte.

  • Activez HSTS pour forcer HTTPS dans les navigateurs pris en charge :
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
  • Préférez les protocoles et chiffrements TLS modernes (à adapter selon votre profil de risque) :
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256';
  • Rediriger HTTP vers HTTPS (Certbot peut ajouter cela automatiquement) :
server {
    listen 80;
    server_name example.com www.example.com;
    return 301 https://$host$request_uri;
}
  • Validez votre configuration avec des outils industriels :

    • Générateur de configuration SSL de Mozilla (https://ssl-config.mozilla.org)
    • Test de serveur SSL Labs (https://www.ssllabs.com/ssltest/)

Remarque : Soyez prudent avec HSTS lors de la première activation. Si vous définissez preload, soumettez votre domaine seulement après avoir confirmé une configuration HTTPS stable pour tous les sous-domaines.

PratiquePourquoi est-ce important ?Comment postuler
Utiliser 301 de HTTP à HTTPSLes utilisateurs accèdent rapidement à l'URL sécuriséeCertbot écrit automatiquement les redirections, ou ajoutez un serveur sur le port 80 renvoyant 301 https://$host$request_uri
Minimiser les sauts de redirectionMoins de trajets aller-retour=peinture initiale plus rapideLe point DNS/liens canoniques vers l’hôte HTTPS final ; éviter les chaînes http → www → https
Servir tous les éléments via HTTPSPrévient les avertissements de contenu mixte et les problèmes d'interfaceAudit avec le panneau de sécurité DevTools ; mettre à jour les URL des CDN/ressources vers https://
Activer HTTP/2 et HTTP/3Livraison multiplexée plus rapide, meilleure performance mobileDans Nginx, listen 443 ssl http2; et, si pris en charge, http3/QUIC sur 443/udp
Activer la reprise de session TLSVisites répétées plus rapidesAssurez-vous que ssl_session_cache shared:SSL:10m; ssl_session_timeout 1d;
Activer le regroupement OCSPValidation des certificats plus rapide et plus fiablessl_stapling activé; ssl_stapling_verify activé; avec un résolveur valide
Préférer Brotli/GzipCharges utiles plus petites pour HTML/CSS/JSActivez brotli on; (si le module est présent) et gzip on; comme solution de rechange
Définir des URL HTTPS canoniques clairesÉvitez le contenu dupliqué et les URL confusesUtilisez <link rel="canonical" href="https://example.com/..."> et mettez à jour les sitemaps
Consolider www vs apexAdresses prévisibles et moins de redirectionsChoisissez un nom d'hôte ; redirigez l'autre de façon permanente vers celui-ci
Pages d’erreur/entretien TLS convivialesRéduire l'abandon lors des incidentsPage d'erreur personnalisée error_page 497/403/502/503 avec des étapes claires à suivre
Surveiller les renouvellements et les échecsÉviter les verrouillages dus à l'expiration soudaine des certificatsAlerte sur les journaux de certbot; vérifications externes; délivrabilité des courriels vérifiée
Introduire HSTS avec prudenceÉvitez le verrouillage accidentel lors du déploiementCommencez sans preload; ajoutez progressivement des sous-domaines; vérifiez avant de soumettre le preload

Problèmes courants et solutions

  • Échec du défi ACME HTTP-01 : Assurez-vous que le port 80 est accessible depuis Internet et n'est pas bloqué par un pare-feu ou un équilibreur de charge en amont.
  • Incohérence DNS : Confirmez que les enregistrements A/AAAA pour example.com et www.example.com pointent vers la bonne adresse IP publique.
  • Mauvais server_name dans Nginx : Certbot localise le bloc serveur par le server_name ; vérifiez qu'il correspond aux domaines demandés.
  • Limites de débit : Les demandes répétées échouées peuvent atteindre les limites de débit de Let’s Encrypt. Utilisez --dry-run lors des tests et variez les sous-domaines si nécessaire.
  • Conflits Snap vs APT : Supprimez l'ancien certbot installé via APT avant d'installer Snap afin d'éviter les conflits de chemins.

FAQ

1. Qu'est-ce que Let's Encrypt et comment fonctionne-t-il avec Nginx ?

Let’s Encrypt est une autorité de certification gratuite qui vérifie le contrôle du domaine et délivre des certificats SSL/TLS via le protocole ACME. Certbot automatise la validation du domaine (HTTP‑01 dans la plupart des cas, DNS‑01 pour les certificats génériques), la délivrance des certificats, la configuration de Nginx et les renouvellements. Avec le plugin Nginx, Certbot met à jour votre bloc server et écrit les fichiers de certificat dans /etc/letsencrypt/live/votre_domaine/.

2. Ai-je besoin d'un nom de domaine pour utiliser le SSL Let’s Encrypt ?

Oui. Les certificats de confiance publique nécessitent un domaine enregistré avec un DNS public pointant vers votre serveur — seuls les IP ou les noms d’hôtes privés ne sont pas pris en charge. Utilisez des enregistrements A/AAAA pour chaque nom d’hôte que vous demandez. Les certificats génériques (par exemple, *.example.com) nécessitent une validation DNS‑01 et l'accès pour modifier le DNS.

3. Comment installer Certbot sur Ubuntu pour Nginx ?

Utilisez snap (recommandé) : sudo snap install --classic certbot && sudo ln -s /snap/bin/certbot /usr/bin/certbot. Sinon, sudo apt install certbot python3-certbot-nginx.

Le paquet snap reçoit les mises à jour le plus rapidement et inclut le plugin Nginx. Vérifiez la version avec certbot --version. Si snap n'est pas disponible, APT fonctionne mais peut être en retard sur les fonctionnalités ; assurez-vous que python3-certbot-nginx est installé afin que Certbot puisse modifier Nginx automatiquement.

4. Puis-je sécuriser plusieurs domaines ou sous-domaines avec un seul certificat ?

Oui, Let’s Encrypt vous permet de sécuriser plusieurs domaines et sous-domaines à l’aide d’un seul certificat, appelé certificat SAN (Subject Alternative Name). Au lieu de demander et de gérer des certificats distincts pour chaque nom d’hôte, vous pouvez tous les regrouper sous un seul certificat, ce qui simplifie grandement la gestion et le renouvellement.

Comment le faire :
Lors de l'exécution de Certbot, vous pouvez spécifier chaque domaine ou sous-domaine que vous souhaitez inclure dans votre certificat en répétant le paramètre -d pour chacun. Par exemple :

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

Cette commande obtiendra un certificat qui est valide pour les trois noms (example.com, www.example.com, api.example.com). Certbot mettra automatiquement à jour votre configuration Nginx pour utiliser le nouveau certificat pour tous les domaines listés.

Qu'en est-il des domaines génériques ?
Si vous souhaitez un certificat qui couvre tous les sous-domaines (comme anything.example.com), vous pouvez utiliser un domaine générique. Cela nécessite une validation DNS-01 (prouvant que vous contrôlez votre zone DNS), généralement en ajoutant un enregistrement TXT spécial auprès de votre fournisseur DNS. Par exemple :

sudo certbot --manual --preferred-challenges dns -d *.example.com -d example.com

Vous serez invité à créer des enregistrements DNS spécifiques pendant ce processus.

Autres choses à savoir :

  • Vous devez vous assurer que tous les domaines spécifiés sont correctement dirigés vers votre serveur avant d’exécuter Certbot.
  • Soyez conscient des limites de taux de Let’s Encrypt : essayez de regrouper les domaines connexes dans le moins de certificats possible, afin de minimiser le risque d’atteindre ces limites.
  • Lors du renouvellement, Certbot conservera tous les domaines originaux ensemble sauf si vous demandez un nouvel ensemble.

Utiliser plusieurs options -d avec Certbot est la manière recommandée pour couvrir plusieurs domaines/sous-domaines. Les certificats avec de nombreux SAN sont idéaux pour les sites et les API sur le même projet ou serveur.

5. Comment puis-je confirmer que le renouvellement automatique fonctionne ?

Exécutez sudo systemctl status snap.certbot.renew.timer (snap) et sudo certbot renew --dry-run. Vérifiez les journaux dans /var/log/letsencrypt/. Vous pouvez également vérifier la date d'expiration :

openssl x509 -in /etc/letsencrypt/live/your_domain/fullchain.pem -noout -enddate

En cas de succès, les renouvellements se font automatiquement lorsqu'un certificat est sur le point d'expirer dans les 30 jours et que Nginx est rechargé.

6. Comment configurer Nginx pour utiliser le certificat Let’s Encrypt ?

Certbot configure automatiquement Nginx avec le certificat Let’s Encrypt. Les directives typiques dans votre bloc serveur TLS sont :

ssl_certificate /etc/letsencrypt/live/your_domain/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/your_domain/privkey.pem;

Validez avec sudo nginx -t et appliquez avec sudo systemctl reload nginx.

7. Comment puis-je vérifier si ma configuration HTTPS est correcte ?

Utilisez des tests externes et des vérifications client :

  • Test de serveur SSL Labs : https://www.ssllabs.com/ssltest/
  • Guide du générateur de configuration SSL de Mozilla : https://ssl-config.mozilla.org
  • Vérifications rapides :
curl -I http://example.com      # Expect 301 to https

curl -I https://example.com     # Confirm 200 and HSTS if enabled

openssl s_client -connect example.com:443 -servername example.com -tls1_3 < /dev/null | openssl x509 -noout -dates -issuer -subject

Ouvrez également les Outils de développement → Sécurité pour repérer les avertissements de contenu mixte.

8. Comment puis-je configurer le renouvellement automatique des certificats Let’s Encrypt ?

Avec les installations snap, un minuteur systemd (snap.certbot.renew.timer) s'exécute deux fois par jour et renouvelle les certificats proches de leur expiration. Vérifiez avec systemctl status et simulez avec sudo certbot renew --dry-run. Si vous avez besoin de crochets, utilisez :

sudo certbot renew --post-hook "systemctl reload nginx"

Assurez-vous que les ports 80/443 sont accessibles, que le DNS est correct et que l’e-mail de notification est surveillé afin de détecter rapidement tout problème de renouvellement.

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. Vous avez également renforcé votre configuration TLS avec HSTS et des chiffrements modernes, et passé en revue les étapes courantes de dépannage. Si vous avez d'autres questions sur l'utilisation de Certbot, la documentation officielle est un bon point de départ.

Regard vers l'avenir : Pour les équipes gérant de nombreux domaines, envisagez l'automatisation de l'infrastructure en tant que code (par exemple, les rôles Ansible pour Nginx + Certbot), les défis DNS-01 pour les certificats génériques, et la surveillance proactive des certificats avec alertes — des domaines bien adaptés pour un guide avancé séparé.

Lecture supplémentaire

  • Comment installer Nginx sur Ubuntu : installer Nginx, gérer le service, ouvrir le pare-feu et configurer des blocs de serveur.
  • Comment sécuriser Nginx avec Let’s Encrypt sur Ubuntu 20.04 : Variante plus ancienne d’Ubuntu couvrant l’émission de Certbot, les redirections HTTPS et le renouvellement automatique.
  • Comment obtenir un certificat Let’s Encrypt en utilisant la validation DNS : Utilisez les défis DNS‑01 (via acme‑dns/Certbot) pour les certificats wildcard ou lorsque la validation HTTP n’est pas possible.
  • Comment corriger les erreurs courantes de Let's Encrypt : résoudre les problèmes des défis ACME, la portée DNS/HTTP, les limites de fréquence et les problèmes de renouvellement.

Merci de apprendre avec la communauté Linux-Console.net.