Recherche de 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 majorité (voire 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).
  • Activez le renouvellement automatique ; les certificats sont valables 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 de type 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 pour Ubuntu, incluant un utilisateur non root avec droits 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 bureau d'enregistrement de domaine préféré.

  • Les deux enregistrements DNS suivants sont 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 nécessitent que vous ayez installé snapd au préalable pour gérer les paquets snap. Ubuntu est livré avec le support 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 de continuer :

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 depuis le 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 par accident avec d'autres packages système :

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

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

sudo apt update

sudo apt install -y certbot python3-certbot-nginx

La distribution snap reste 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 voulu.

Maintenant que nous avons installé Certbot, lançons-le pour obtenir notre certificat.

Étape 2 — Confirmer la configuration de Nginx

Certbot doit être capable de trouver le bon bloc server dans votre configuration Nginx pour 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 server_name existante. 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, fermez 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 bloc server correct 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 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 :

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, activez 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, lançons Certbot et récupérons nos certificats.

Étape 4 — Obtention d'un certificat SSL

Certbot propose différentes façons d'obtenir des certificats SSL via 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.

Lors de l'exécution de la commande, il vous sera demandé de saisir une adresse e-mail et d'accepter les conditions d'utilisation. Après cela, vous devriez voir un message indiquant que le processus a 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 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 Labs, il obtiendra une note A.

Finissons par tester le processus de renouvellement.

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

Les certificats de Let’s Encrypt ne sont valables que pendant quatre-vingt-dix jours. Cela encourage les utilisateurs à automatiser le processus de renouvellement de leurs certificats. 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 dont l’expiration est dans les trente prochains 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 faire un essai à sec avec certbot :

sudo certbot renew --dry-run

Si vous ne voyez aucune erreur, tout est 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 un jour, Let’s Encrypt enverra un message à l'adresse e-mail que vous avez spécifiée, vous avertissant 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 uniquement lorsqu'un certificat est renouvelé :

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

Sur les systèmes utilisant des paquets APT, un travail 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 compatibles :
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
  • Privilégiez les protocoles et chiffrements TLS modernes (à ajuster 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 l’ajouter 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 lors de l'activation initiale de HSTS. Si vous définissez preload, soumettez votre domaine uniquement après avoir confirmé une configuration HTTPS stable pour tous les sous-domaines.

PratiquePourquoi est-ce important ?Comment postuler
Utilisez 301 de HTTP à HTTPSLes utilisateurs arrivent rapidement sur 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 redirectionsMoins d'aller-retours=peinture initiale plus rapidePointez les DNS/liens canoniques vers l'hôte final en HTTPS ; évitez les chaînes http → www → https
Servir tous les éléments via HTTPSEmpêche les avertissements de contenu mixte et les problèmes d'interfaceAudit avec le panneau Sécurité de DevTools ; mettre à jour les CDN/URLs des 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 de suivi plus rapidesAssurez-vous que ssl_session_cache shared:SSL:10m; ssl_session_timeout 1d;
Activer l'agrafe 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; en tant que solution de repli
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 domaine racineAdressage prévisible et moins de redirectionsChoisissez un nom d’hôte ; redirigez l’autre de façon permanente vers celui-ci
Pages d'erreur/maintenance TLS convivialesRéduire l'abandon lors des incidentsPage d'erreur personnalisée error_page 497/403/502/503 avec des étapes suivantes claires
Surveiller les renouvellements et les échecsPrévenir les verrouillages dus à l'expiration soudaine des certificatsAlerte sur les journaux certbot ; vérifications externes ; délivrabilité des e-mails vérifiée
Introduire HSTS avec prudenceÉvitez le verrouillage accidentel lors du déploiementCommencez sans preload ; ajoutez les sous-domaines progressivement ; vérifiez avant de soumettre le preload

Problèmes courants et solutions

  • Échec du challenge ACME HTTP-01 : Assurez-vous que le port 80 est accessible depuis Internet et qu'il n'est pas bloqué par un pare-feu ou un équilibreur de charge en amont.
  • Incohérence DNS : Vérifiez que les enregistrements A/AAAA pour example.com et www.example.com pointent vers l'adresse IP publique correcte.
  • Mauvais server_name Nginx : Certbot localise le bloc serveur grâce au server_name ; vérifiez qu'il correspond aux domaines demandés.
  • Limites de taux : Des requêtes échouées répétées peuvent atteindre les limites de taux 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 des domaines et délivre des certificats SSL/TLS via le protocole ACME. Certbot automatise la validation des domaines (HTTP‑01 dans la plupart des cas, DNS‑01 pour les certificats génériques), la délivrance de 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 de Let's Encrypt ?

Oui. Les certificats publiquement fiables nécessitent un domaine enregistré avec un DNS public pointant vers votre serveur — les adresses IP seules 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. Alternativement, 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 séparés pour chaque nom d'hôte, vous pouvez les regrouper tous 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 permettra d'obtenir un certificat valable 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 couvrant tous les sous-domaines (comme anything.example.com), vous pouvez utiliser un domaine générique. Cela nécessite une validation DNS-01 (prouver que vous contrôlez votre zone DNS), généralement en ajoutant un enregistrement TXT spécial chez votre fournisseur DNS. Par exemple :

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

Il vous sera demandé de créer des enregistrements DNS spécifiques au cours de 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 fréquence de Let’s Encrypt : essayez de regrouper les domaines liés dans le moins de certificats possible, afin de minimiser le risque d’atteindre ces limites.
  • Lors du renouvellement, Certbot conservera tous les domaines d'origine ensemble sauf si vous demandez un nouvel ensemble.

L'utilisation de plusieurs options -d avec Certbot est la manière recommandée de couvrir plusieurs domaines/sous-domaines. Les certificats avec de nombreux SAN sont idéaux pour les sites et 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 lorsque le certificat est à moins de 30 jours de son expiration 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 clients :

  • 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 DevTools → Sécurité pour repérer les avertissements de contenu mixte.

8. Comment 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 l'expiration. Vérifiez avec systemctl status et simulez avec sudo certbot renew --dry-run. Si vous avez besoin de hooks, 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 que les problèmes de renouvellement soient détectés rapidement.

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 à un guide avancé séparé.

Lectures complémentaires

  • Comment installer Nginx sur Ubuntu : installer Nginx, gérer le service, ouvrir le pare-feu et configurer les blocs de serveur.
  • Comment sécuriser Nginx avec Let’s Encrypt sur Ubuntu 20.04 : Variante d’Ubuntu plus ancienne 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 résoudre les erreurs courantes de Let’s Encrypt : dépanner les défis ACME, la portée DNS/HTTP, les limites de débit et les problèmes de renouvellement.

Merci d'apprendre avec la communauté Linux-Console.net.