{"id":207,"date":"2026-06-17T16:47:27","date_gmt":"2026-06-17T16:47:27","guid":{"rendered":"https:\/\/shattered.io\/fr\/2026\/06\/17\/lets-encrypt-nginx-https-tutoriel\/"},"modified":"2026-06-17T16:49:18","modified_gmt":"2026-06-17T16:49:18","slug":"lets-encrypt-nginx-https-tutoriel","status":"publish","type":"post","link":"https:\/\/shattered.io\/fr\/2026\/06\/17\/lets-encrypt-nginx-https-tutoriel\/","title":{"rendered":"Let&#8217;s Encrypt + Nginx : HTTPS en 12 \u00e9tapes [2026]"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Let&#8217;s Encrypt d\u00e9livre plus de 10 millions de certificats TLS par jour. Pourtant, des milliers de serveurs Nginx tournent encore en HTTP simple, exposant les donn\u00e9es de leurs visiteurs \u00e0 des interceptions. Ce tutoriel vous guide de l&#8217;installation de Certbot jusqu&#8217;\u00e0 un score A+ sur SSL Labs, en 12 \u00e9tapes reproductibles sur Ubuntu 22.04 ou 24.04.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En juin 2026, Let&#8217;s Encrypt entre dans la phase d&#8217;opt-in pour des certificats de 45 jours (contre 90 actuellement), avec une g\u00e9n\u00e9ralisation pr\u00e9vue en f\u00e9vrier 2028. Un renouvellement automatique fiable n&#8217;a jamais \u00e9t\u00e9 aussi indispensable.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"prerequis\">Pr\u00e9requis<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Avant de commencer, assurez-vous de disposer de l&#8217;environnement suivant :<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Composant<\/th><th>Version minimale<\/th><th>R\u00f4le<\/th><\/tr><\/thead><tbody><tr><td>Ubuntu<\/td><td>22.04 LTS ou 24.04 LTS<\/td><td>Syst\u00e8me d&#8217;exploitation du serveur<\/td><\/tr><tr><td>Nginx<\/td><td>1.18 ou ult\u00e9rieur<\/td><td>Serveur web \u00e0 s\u00e9curiser<\/td><\/tr><tr><td>Certbot<\/td><td>2.9 ou ult\u00e9rieur (via snap)<\/td><td>Client ACME pour Let&#8217;s Encrypt<\/td><\/tr><tr><td>Snapd<\/td><td>Install\u00e9 et actif<\/td><td>Gestionnaire de paquets pour Certbot<\/td><\/tr><tr><td>Nom de domaine<\/td><td>Tout registrar<\/td><td>Doit pointer vers l&#8217;IP publique du serveur<\/td><\/tr><tr><td>Ports ouverts<\/td><td>80\/TCP et 443\/TCP<\/td><td>Validation HTTP-01 et trafic HTTPS<\/td><\/tr><tr><td>Acc\u00e8s administrateur<\/td><td>sudo ou root<\/td><td>Requis pour Certbot et Nginx<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Connaissances suppos\u00e9es :<\/strong> manipuler un terminal SSH, \u00e9diter des fichiers avec nano ou vim, comprendre les bases du DNS (enregistrement A, TTL).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"pourquoi-https-est-obligatoire-en-2026\">Pourquoi HTTPS est obligatoire en 2026<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Google Chrome affiche depuis 2018 l&#8217;avertissement &#8220;Non s\u00e9curis\u00e9&#8221; sur tous les sites HTTP. En 2026, cette politique est durcie : les navigateurs modernes bloquent par d\u00e9faut les contenus mixtes (scripts et images charg\u00e9s en HTTP depuis une page HTTPS) et certains d&#8217;entre eux affichent une page d&#8217;interstitielle sur les sites sans HTTPS avant m\u00eame d&#8217;afficher le contenu. Les cons\u00e9quences sont concr\u00e8tes : perte de confiance des visiteurs, p\u00e9nalit\u00e9 de r\u00e9f\u00e9rencement naturel et risques juridiques au regard du RGPD, qui exige la protection des donn\u00e9es personnelles en transit.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">TLS remplit quatre fonctions distinctes. L&#8217;<strong>authentification<\/strong> garantit que le serveur est bien celui qu&#8217;il pr\u00e9tend \u00eatre, gr\u00e2ce au certificat sign\u00e9 par une autorit\u00e9 de confiance. La <strong>confidentialit\u00e9<\/strong> chiffre les donn\u00e9es \u00e9chang\u00e9es, les rendant illisibles pour un observateur tiers. L&#8217;<strong>int\u00e9grit\u00e9<\/strong> d\u00e9tecte toute alt\u00e9ration en transit via des codes d&#8217;authentification de message (MAC). La <strong>non-r\u00e9pudiation<\/strong> est assur\u00e9e via les journaux de certification publics (Certificate Transparency), qui archuvent chaque certificat \u00e9mis.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Let&#8217;s Encrypt, g\u00e9r\u00e9 par l&#8217;Internet Security Research Group (ISRG), a franchi le cap du milliard de certificats \u00e9mis depuis son lancement en 2015. Son mod\u00e8le enti\u00e8rement gratuit et automatis\u00e9 repose sur le protocole ACME (Automatic Certificate Management Environment, RFC 8555). Le client officiel recommand\u00e9 par l&#8217;EFF est Certbot, qui impl\u00e9mente ce protocole et s&#8217;int\u00e8gre directement avec Nginx via un plugin d\u00e9di\u00e9.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"etape-1-mettre-a-jour-le-systeme-et-installer-nginx\">\u00c9tape 1 : Mettre \u00e0 jour le syst\u00e8me et installer Nginx<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Commencez par mettre \u00e0 jour la liste des paquets et installer Nginx. Cette \u00e9tape est importante pour \u00e9viter les conflits de version lors de l&#8217;installation de Certbot.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo apt update && sudo apt upgrade -y\nsudo apt install -y nginx curl snapd<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">V\u00e9rifiez que Nginx est actif et configur\u00e9 pour d\u00e9marrer automatiquement :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo systemctl enable --now nginx\nsudo systemctl status nginx<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">R\u00e9sultat attendu :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\u25cf nginx.service - A high performance web server and a reverse proxy server\n     Loaded: loaded (\/lib\/systemd\/system\/nginx.service; enabled)\n     Active: active (running) since Tue 2026-06-17 10:00:00 UTC; 5s ago<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Testez l&#8217;acc\u00e8s HTTP depuis votre navigateur ou via curl :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>curl -I http:\/\/monsite.com<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Vous devez obtenir un code <code>200 OK<\/code>. Si la r\u00e9ponse est un timeout ou une erreur de connexion, v\u00e9rifiez que le DNS de votre domaine pointe bien vers l&#8217;adresse IP publique de votre serveur avant de continuer. La validation HTTP-01 de Let&#8217;s Encrypt \u00e9chouera si ce n&#8217;est pas le cas, et vous risquez de consommer inutilement du quota d&#8217;\u00e9mission.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"etape-2-configurer-le-pare-feu-ufw\">\u00c9tape 2 : Configurer le pare-feu UFW<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Let&#8217;s Encrypt doit atteindre votre serveur sur le port 80 pour valider la propri\u00e9t\u00e9 du domaine via la m\u00e9thode HTTP-01. Nginx doit \u00e9galement \u00e9couter sur le port 443 apr\u00e8s l&#8217;obtention du certificat. UFW (Uncomplicated Firewall) propose des profils d&#8217;application pr\u00e9d\u00e9finis pour Nginx, ce qui simplifie la configuration.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo ufw allow 'Nginx Full'\nsudo ufw allow OpenSSH\nsudo ufw enable\nsudo ufw status<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">R\u00e9sultat attendu :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Status: active\n\nTo                         Action      From\n--                         ------      ----\nNginx Full                 ALLOW       Anywhere\nOpenSSH                    ALLOW       Anywhere<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Le profil &#8220;Nginx Full&#8221; ouvre les ports 80 (HTTP) et 443 (HTTPS). Si vous h\u00e9bergez votre serveur chez un fournisseur cloud (AWS, GCP, Scaleway, OVH, Hetzner), pensez \u00e0 ouvrir \u00e9galement ces ports dans le groupe de s\u00e9curit\u00e9 ou le pare-feu r\u00e9seau du fournisseur. Les deux niveaux de filtrage, UFW et le pare-feu cloud, s&#8217;appliquent de fa\u00e7on ind\u00e9pendante et cumulative.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Avertissement :<\/strong> n&#8217;activez jamais UFW sans avoir pr\u00e9alablement autoris\u00e9 OpenSSH (port 22). Activer UFW sans cette r\u00e8gle vous verrouillera hors du serveur si vous \u00eates connect\u00e9 via SSH depuis une session non encore \u00e9tablie.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"etape-3-creer-la-configuration-nginx-de-base\">\u00c9tape 3 : Cr\u00e9er la configuration Nginx de base<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Avant de demander un certificat, Certbot a besoin d&#8217;un bloc <code>server<\/code> Nginx fonctionnel avec le bon nom de domaine. Cr\u00e9ez un fichier de configuration d\u00e9di\u00e9 :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo nano \/etc\/nginx\/sites-available\/monsite.com<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Contenu minimal \u00e0 coller dans le fichier :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>server {\n    listen 80;\n    listen [::]:80;\n    server_name monsite.com www.monsite.com;\n\n    root \/var\/www\/monsite.com\/html;\n    index index.html index.htm;\n\n    location \/ {\n        try_files $uri $uri\/ =404;\n    }\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Activez le site et rechargez Nginx :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo ln -s \/etc\/nginx\/sites-available\/monsite.com \/etc\/nginx\/sites-enabled\/\nsudo mkdir -p \/var\/www\/monsite.com\/html\necho '&lt;h1&gt;Bienvenue&lt;\/h1&gt;' | sudo tee \/var\/www\/monsite.com\/html\/index.html\nsudo nginx -t && sudo systemctl reload nginx<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">La commande <code>nginx -t<\/code> teste la syntaxe de la configuration sans red\u00e9marrer le service. Adoptez cette habitude avant chaque rechargement. Si le test retourne une erreur, corrigez-la avant de continuer. Nginx ne rechargera pas une configuration syntaxiquement incorrecte, ce qui prot\u00e8ge les sites d\u00e9j\u00e0 en production sur le m\u00eame serveur.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Si vous utilisez Nginx comme reverse proxy devant une application Node.js ou Python, ajoutez maintenant une exception pour le chemin de validation Let&#8217;s Encrypt. Sans cette exception, le bloc <code>location \/<\/code> qui proxifie le trafic interceptera les requ\u00eates de validation HTTP-01 :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>    location \/.well-known\/acme-challenge\/ {\n        root \/var\/www\/html;\n        allow all;\n    }\n\n    location \/ {\n        proxy_pass http:\/\/localhost:3000;\n        proxy_set_header Host $host;\n        proxy_set_header X-Real-IP $remote_addr;\n    }<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"etape-4-installer-certbot-via-snap\">\u00c9tape 4 : Installer Certbot via Snap<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">L&#8217;EFF recommande depuis 2020 d&#8217;installer Certbot via Snap plut\u00f4t que via le gestionnaire de paquets <code>apt<\/code>. Le paquet snap re\u00e7oit les mises \u00e0 jour directement de l&#8217;\u00e9quipe Certbot, ind\u00e9pendamment du cycle de publication d&#8217;Ubuntu. C&#8217;est particuli\u00e8rement important en 2026, car la gestion des ACME Renewal Information (ARI) n\u00e9cessite Certbot 4.1.0 ou ult\u00e9rieur. ARI permet \u00e0 Let&#8217;s Encrypt d&#8217;indiquer au client exactement quand renouveler un certificat, ce qui sera indispensable avec les certificats de 45 jours pr\u00e9vus \u00e0 partir de mai 2026.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Si vous avez une ancienne installation Certbot via apt, supprimez-la d&#8217;abord pour \u00e9viter les conflits :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo apt remove certbot python3-certbot-nginx -y<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Installez ensuite Certbot via Snap :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo snap install --classic certbot\nsudo ln -s \/snap\/bin\/certbot \/usr\/bin\/certbot<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Le flag <code>--classic<\/code> accorde \u00e0 Certbot l&#8217;acc\u00e8s au syst\u00e8me de fichiers complet, ce dont il a besoin pour modifier les fichiers de configuration Nginx et \u00e9crire les certificats dans <code>\/etc\/letsencrypt\/<\/code>. V\u00e9rifiez la version install\u00e9e :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>certbot --version\nsnap list certbot<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Le snap se met \u00e0 jour automatiquement plusieurs fois par jour via le daemon snapd. Vous b\u00e9n\u00e9ficiez donc en permanence des derni\u00e8res corrections de s\u00e9curit\u00e9 sans intervention manuelle, ce qui est un avantage majeur par rapport au paquet apt d&#8217;Ubuntu qui n&#8217;est mis \u00e0 jour qu&#8217;\u00e0 chaque nouvelle version LTS.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"etape-5-obtenir-le-certificat-lets-encrypt\">\u00c9tape 5 : Obtenir le certificat Let&#8217;s Encrypt<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Certbot int\u00e8gre un plugin Nginx qui modifie automatiquement la configuration du serveur pour activer HTTPS. C&#8217;est la m\u00e9thode la plus directe pour la grande majorit\u00e9 des cas d&#8217;usage.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo certbot --nginx -d monsite.com -d www.monsite.com<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Certbot vous pose plusieurs questions interactives :<\/p>\n\n\n\n<ol class=\"wp-block-list\"><li>Votre adresse email (pour les alertes d&#8217;expiration envoy\u00e9es par Let&#8217;s Encrypt)<\/li><li>Acceptation des conditions d&#8217;utilisation de Let&#8217;s Encrypt<\/li><li>Partage optionnel de votre email avec l&#8217;EFF<\/li><li>Si vous souhaitez rediriger automatiquement le trafic HTTP vers HTTPS (r\u00e9pondez oui)<\/li><\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Si la demande r\u00e9ussit, Certbot affiche le message de confirmation suivant :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Successfully received certificate.\nCertificate is saved at: \/etc\/letsencrypt\/live\/monsite.com\/fullchain.pem\nKey is saved at:         \/etc\/letsencrypt\/live\/monsite.com\/privkey.pem\nThis certificate expires on 2026-09-15.\n\nDeploying certificate\nSuccessfully deployed certificate for monsite.com to \/etc\/nginx\/sites-enabled\/monsite.com\nCongratulations! You have successfully enabled HTTPS on https:\/\/monsite.com<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Les certificats sont stock\u00e9s dans <code>\/etc\/letsencrypt\/live\/votre-domaine\/<\/code> et contiennent quatre fichiers : <code>cert.pem<\/code> (certificat du serveur seul), <code>chain.pem<\/code> (cha\u00eene interm\u00e9diaire Let&#8217;s Encrypt), <code>fullchain.pem<\/code> (certificat + cha\u00eene, utilis\u00e9 dans Nginx), et <code>privkey.pem<\/code> (cl\u00e9 priv\u00e9e RSA ou ECDSA 256 bits). Ne partagez jamais le fichier <code>privkey.pem<\/code> et ne le copiez pas dans des dossiers accessibles au serveur web.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Pour tester sans consommer de quota de production<\/strong>, utilisez toujours l&#8217;environnement de staging lors des premi\u00e8res tentatives :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo certbot --nginx --staging -d monsite.com -d www.monsite.com<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"etape-6-verifier-la-configuration-nginx-generee\">\u00c9tape 6 : V\u00e9rifier la configuration Nginx g\u00e9n\u00e9r\u00e9e<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Certbot modifie automatiquement votre fichier de configuration Nginx. Examinez le r\u00e9sultat pour comprendre ce qui a \u00e9t\u00e9 ajout\u00e9 :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo cat \/etc\/nginx\/sites-enabled\/monsite.com<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">La configuration g\u00e9n\u00e9r\u00e9e ressemble \u00e0 ceci :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>server {\n    listen 443 ssl;\n    listen [::]:443 ssl;\n    server_name monsite.com www.monsite.com;\n\n    root \/var\/www\/monsite.com\/html;\n    index index.html;\n\n    location \/ {\n        try_files $uri $uri\/ =404;\n    }\n\n    ssl_certificate \/etc\/letsencrypt\/live\/monsite.com\/fullchain.pem;\n    ssl_certificate_key \/etc\/letsencrypt\/live\/monsite.com\/privkey.pem;\n    include \/etc\/letsencrypt\/options-ssl-nginx.conf;\n    ssl_dhparam \/etc\/letsencrypt\/ssl-dhparams.pem;\n}\n\nserver {\n    listen 80;\n    listen [::]:80;\n    server_name monsite.com www.monsite.com;\n    return 301 https:\/\/$host$request_uri;\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Trois points m\u00e9ritent attention. Premi\u00e8rement, le fichier <code>\/etc\/letsencrypt\/options-ssl-nginx.conf<\/code> contient les param\u00e8tres TLS recommand\u00e9s par Certbot. Il est mis \u00e0 jour avec chaque renouvellement de snap. La directive <code>include<\/code> le charge dynamiquement, garantissant que votre serveur b\u00e9n\u00e9ficie des param\u00e8tres les plus r\u00e9cents sans intervention manuelle.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Deuxi\u00e8mement, le second bloc <code>server<\/code> g\u00e8re la redirection HTTP vers HTTPS via une r\u00e9ponse <code>301<\/code>. Le code 301 (redirection permanente) est essentiel pour le SEO, car il indique aux moteurs de recherche que l&#8217;URL canonique est celle en HTTPS et qu&#8217;il faut transf\u00e9rer le jus de lien vers la nouvelle adresse.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Troisi\u00e8mement, Certbot n&#8217;ajoute pas <code>http2<\/code> au bloc <code>listen<\/code> par d\u00e9faut. Nous l&#8217;ajouterons manuellement \u00e0 l&#8217;\u00e9tape suivante.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"etape-7-renforcer-les-protocoles-tls\">\u00c9tape 7 : Renforcer les protocoles TLS<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">La configuration par d\u00e9faut de Certbot est fonctionnelle mais pas optimale pour un score A+ sur SSL Labs. Modifiez votre bloc <code>server<\/code> HTTPS pour ajouter les param\u00e8tres TLS stricts recommand\u00e9s par Mozilla et l&#8217;ANSSI :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>server {\n    listen 443 ssl http2;\n    listen [::]:443 ssl http2;\n    server_name monsite.com www.monsite.com;\n\n    ssl_certificate     \/etc\/letsencrypt\/live\/monsite.com\/fullchain.pem;\n    ssl_certificate_key \/etc\/letsencrypt\/live\/monsite.com\/privkey.pem;\n    ssl_trusted_certificate \/etc\/letsencrypt\/live\/monsite.com\/chain.pem;\n\n    # TLS 1.2 et 1.3 uniquement (TLS 1.0 et 1.1 d\u00e9sactiv\u00e9s)\n    ssl_protocols TLSv1.2 TLSv1.3;\n    ssl_prefer_server_ciphers off;\n\n    # Suites chiffr\u00e9es modernes - ECDHE + AEAD uniquement\n    ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305';\n\n    # Courbes elliptiques recommand\u00e9es\n    ssl_ecdh_curve X25519:secp384r1:prime256v1;\n\n    root \/var\/www\/monsite.com\/html;\n    index index.html;\n\n    location \/ {\n        try_files $uri $uri\/ =404;\n    }\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Quelques points techniques importants sur ces param\u00e8tres :<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>ssl_prefer_server_ciphers off<\/strong> : avec TLS 1.3, la s\u00e9lection des suites chiffr\u00e9es est g\u00e9r\u00e9e par le client. Mettre cette directive \u00e0 <code>off<\/code> suit les recommandations Mozilla pour les profils &#8220;interm\u00e9diaire&#8221; et &#8220;moderne&#8221; de 2026. Cela permet aux clients d&#8217;utiliser ChaCha20-Poly1305 quand ils y sont optimis\u00e9s (appareils mobiles sans acc\u00e9l\u00e9ration AES mat\u00e9rielle).<\/li><li><strong>ssl_ecdh_curve X25519<\/strong> : X25519 offre de meilleures performances que P-256 pour les \u00e9changes de cl\u00e9s ECDHE, avec une s\u00e9curit\u00e9 consid\u00e9r\u00e9e \u00e9quivalente. C&#8217;est la courbe recommand\u00e9e en priorit\u00e9 par les guides de hardening TLS actuels.<\/li><li><strong>http2<\/strong> : HTTP\/2 n\u00e9cessite TLS pour fonctionner dans les navigateurs. Il apporte le multiplexage des requ\u00eates, r\u00e9duisant la latence de 20 \u00e0 50% pour les pages chargeant de nombreuses ressources.<\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Apr\u00e8s chaque modification de configuration Nginx, testez puis rechargez :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo nginx -t && sudo systemctl reload nginx<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"etape-8-activer-locsp-stapling-et-le-cache-de-sessions-ssl\">\u00c9tape 8 : Activer l&#8217;OCSP Stapling et le cache de sessions SSL<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">L&#8217;OCSP Stapling (agrafage OCSP) permet au serveur de joindre une r\u00e9ponse de v\u00e9rification du statut de r\u00e9vocation du certificat directement dans la poign\u00e9e de main TLS. Sans cette fonctionnalit\u00e9, chaque navigateur doit interroger le serveur OCSP de Let&#8217;s Encrypt lors de chaque nouvelle connexion, ajoutant une latence de 50 \u00e0 200ms selon la localisation g\u00e9ographique. Avec l&#8217;agrafage, le serveur pr\u00e9-r\u00e9cup\u00e8re cette r\u00e9ponse (valide 48h) et la fournit directement au client, \u00e9liminant ce d\u00e9lai.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ajoutez ces directives dans votre bloc <code>server<\/code> HTTPS :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>    # OCSP Stapling\n    ssl_stapling on;\n    ssl_stapling_verify on;\n    resolver 1.1.1.1 8.8.8.8 valid=300s;\n    resolver_timeout 5s;\n\n    # Cache de sessions SSL\n    ssl_session_cache shared:SSL:50m;\n    ssl_session_timeout 1d;\n    ssl_session_tickets off;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Explications des param\u00e8tres :<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>resolver<\/strong> : Nginx a besoin d&#8217;un r\u00e9solveur DNS pour interroger le serveur OCSP de Let&#8217;s Encrypt. 1.1.1.1 (Cloudflare) et 8.8.8.8 (Google) sont les choix standards. Pour une meilleure confidentialit\u00e9 en contexte d&#8217;entreprise, utilisez le r\u00e9solveur interne de votre fournisseur d&#8217;h\u00e9bergement.<\/li><li><strong>ssl_session_cache shared:SSL:50m<\/strong> : alloue 50 Mo de m\u00e9moire partag\u00e9e entre les workers Nginx pour stocker les param\u00e8tres de session TLS. Chaque m\u00e9gaoctet stocke environ 4 000 sessions, soit 200 000 sessions simultan\u00e9es avec 50 Mo.<\/li><li><strong>ssl_session_tickets off<\/strong> : les tickets de session TLS posent un probl\u00e8me de confidentialit\u00e9 persistante si la cl\u00e9 de chiffrement du ticket fuite. Les d\u00e9sactiver est recommand\u00e9 par Mozilla pour toutes les configurations interm\u00e9diaires et modernes, sauf si vous avez mis en place une rotation de cl\u00e9s de ticket.<\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Rechargez Nginx apr\u00e8s ces ajouts. Pour v\u00e9rifier que l&#8217;OCSP Stapling fonctionne, attendez quelques minutes (Nginx doit d&#8217;abord r\u00e9cup\u00e9rer la r\u00e9ponse OCSP), puis testez :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>echo | openssl s_client -connect monsite.com:443 -status 2>\/dev\/null | grep -A 10 \"OCSP response\"<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">R\u00e9sultat attendu si l&#8217;agrafage fonctionne :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>OCSP response:\n======================================\nOCSP Response Status: successful (0x0)\nResponse Type: Basic OCSP Response\n...<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"etape-9-ajouter-les-en-tetes-de-securite-http\">\u00c9tape 9 : Ajouter les en-t\u00eates de s\u00e9curit\u00e9 HTTP<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Les en-t\u00eates HTTP de s\u00e9curit\u00e9 renforcent la protection c\u00f4t\u00e9 navigateur. Ils sont ind\u00e9pendants de TLS mais font partie d&#8217;une configuration HTTPS compl\u00e8te et sont pris en compte par certains scanners de s\u00e9curit\u00e9 (Mozilla Observatory, SecurityHeaders.com). Ajoutez ces directives dans votre bloc <code>server<\/code> HTTPS :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>    # HSTS : force HTTPS pendant 1 an\n    add_header Strict-Transport-Security \"max-age=31536000; includeSubDomains\" always;\n\n    # Emp\u00eache le sniffing de type MIME\n    add_header X-Content-Type-Options \"nosniff\" always;\n\n    # Protection contre le clickjacking\n    add_header X-Frame-Options \"SAMEORIGIN\" always;\n\n    # Politique de r\u00e9f\u00e9rant pour la confidentialit\u00e9\n    add_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\n\n    # Permissions des fonctionnalit\u00e9s navigateur\n    add_header Permissions-Policy \"camera=(), microphone=(), geolocation=()\" always;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">D\u00e9tail des en-t\u00eates les plus critiques :<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>Strict-Transport-Security (HSTS)<\/strong> : indique au navigateur de ne jamais contacter le domaine en HTTP, m\u00eame si l&#8217;utilisateur tape manuellement <code>http:\/\/<\/code>. La valeur <code>max-age=31536000<\/code> repr\u00e9sente 365 jours. Avec <code>includeSubDomains<\/code>, cette r\u00e8gle s&#8217;applique \u00e0 tous les sous-domaines. N&#8217;activez <code>includeSubDomains<\/code> que si tous vos sous-domaines disposent d&#8217;un certificat valide, car un sous-domaine sans HTTPS deviendrait inaccessible pour les visiteurs ayant m\u00e9moris\u00e9 la r\u00e8gle HSTS.<\/li><li><strong>X-Content-Type-Options: nosniff<\/strong> : emp\u00eache les navigateurs d&#8217;interpr\u00e9ter un fichier dans un type MIME diff\u00e9rent de celui d\u00e9clar\u00e9 par le serveur, bloquant certaines attaques XSS bas\u00e9es sur l&#8217;upload de fichiers.<\/li><li><strong>X-Frame-Options: SAMEORIGIN<\/strong> : bloque l&#8217;int\u00e9gration de vos pages dans des iframes depuis des domaines tiers, contrant les attaques de clickjacking.<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"etape-10-tester-avec-ssl-labs-pour-valider-le-score-a\">\u00c9tape 10 : Tester avec SSL Labs pour valider le score A+<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">SSL Labs de Qualys est la r\u00e9f\u00e9rence mondiale pour \u00e9valuer la qualit\u00e9 d&#8217;une configuration TLS. Rendez-vous sur <a href=\"https:\/\/www.ssllabs.com\/ssltest\/\" rel=\"noopener noreferrer\" target=\"_blank\">ssllabs.com\/ssltest<\/a>, entrez votre domaine et attendez 60 \u00e0 90 secondes pour obtenir le rapport complet.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Crit\u00e8re SSL Labs<\/th><th>Exigence pour A+<\/th><th>Ce que nous avons configur\u00e9<\/th><\/tr><\/thead><tbody><tr><td>Protocoles support\u00e9s<\/td><td>TLS 1.2 et TLS 1.3 uniquement<\/td><td>ssl_protocols TLSv1.2 TLSv1.3<\/td><\/tr><tr><td>HSTS activ\u00e9<\/td><td>max-age sup\u00e9rieur \u00e0 180 jours<\/td><td>31 536 000 s (365 jours)<\/td><\/tr><tr><td>Forward Secrecy<\/td><td>Requis sur tous navigateurs<\/td><td>ECDHE sur toutes les suites<\/td><\/tr><tr><td>Certificat<\/td><td>Valide, cha\u00eene compl\u00e8te<\/td><td>fullchain.pem de Let&#8217;s Encrypt<\/td><\/tr><tr><td>Vuln\u00e9rabilit\u00e9s connues<\/td><td>Aucune (BEAST, POODLE, ROBOT)<\/td><td>TLS 1.0 et 1.1 d\u00e9sactiv\u00e9s<\/td><\/tr><tr><td>\u00c9change de cl\u00e9s<\/td><td>Score sup\u00e9rieur \u00e0 90<\/td><td>X25519, secp384r1<\/td><\/tr><tr><td>Algorithme de chiffrement<\/td><td>Score sup\u00e9rieur \u00e0 90<\/td><td>AEAD uniquement (GCM, CHACHA20)<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Si SSL Labs retourne une note A mais pas A+, la cause la plus fr\u00e9quente est l&#8217;absence ou la mauvaise valeur de HSTS. V\u00e9rifiez que l&#8217;en-t\u00eate est envoy\u00e9 avec la bonne valeur :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>curl -I https:\/\/monsite.com | grep -i strict<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">R\u00e9sultat attendu :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>strict-transport-security: max-age=31536000; includeSubDomains<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Si la ligne est absente, le probl\u00e8me vient presque toujours de l&#8217;absence du mot-cl\u00e9 <code>always<\/code> dans la directive <code>add_header<\/code>. Sans <code>always<\/code>, Nginx n&#8217;envoie l&#8217;en-t\u00eate HSTS que sur les r\u00e9ponses 200, mais pas sur les redirections 301 qui constituent l&#8217;essentiel du trafic HTTP vers HTTPS.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"etape-11-automatiser-le-renouvellement-des-certificats\">\u00c9tape 11 : Automatiser le renouvellement des certificats<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Les certificats Let&#8217;s Encrypt expirent apr\u00e8s 90 jours (avec une transition vers 45 jours pr\u00e9vue en 2028). Certbot installe automatiquement un timer systemd qui tente le renouvellement deux fois par jour. V\u00e9rifiez que ce m\u00e9canisme est bien actif :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo systemctl status snap.certbot.renew.timer\nsudo certbot renew --dry-run<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">R\u00e9sultat attendu d&#8217;un dry-run r\u00e9ussi :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Simulating renewal of an existing certificate for monsite.com and www.monsite.com\n\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - -\nCongratulations, all simulated renewals succeeded:\n  \/etc\/letsencrypt\/live\/monsite.com\/fullchain.pem (success)\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - -<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Certbot tente le renouvellement 30 jours avant l&#8217;expiration. Cette fen\u00eatre vous laisse le temps de r\u00e9agir si le renouvellement automatique rencontre un probl\u00e8me. Let&#8217;s Encrypt envoie \u00e9galement des alertes par email 20 jours, puis 10 jours avant l&#8217;expiration, \u00e0 l&#8217;adresse fournie lors de l&#8217;inscription.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ajoutez un hook de d\u00e9ploiement pour recharger Nginx automatiquement apr\u00e8s chaque renouvellement r\u00e9ussi. Sans ce hook, Nginx continue de servir l&#8217;ancien certificat jusqu&#8217;au prochain rechargement manuel :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo tee \/etc\/letsencrypt\/renewal-hooks\/deploy\/reload-nginx.sh &lt;&lt; 'EOF'\n#!\/bin\/bash\nsystemctl reload nginx\nEOF\nsudo chmod +x \/etc\/letsencrypt\/renewal-hooks\/deploy\/reload-nginx.sh<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Consultez les journaux de renouvellement pour diagnostiquer les probl\u00e8mes :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo journalctl -u snap.certbot.renew.service --since \"7 days ago\" --no-pager<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"etape-12-certificats-wildcard-avec-validation-dns\">\u00c9tape 12 : Certificats wildcard avec validation DNS<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Un certificat wildcard couvre tous les sous-domaines d&#8217;un niveau (<code>*.monsite.com<\/code>). Il est utile quand vous g\u00e9rez plusieurs sous-domaines (blog, api, admin, staging) avec le m\u00eame certificat. La validation HTTP-01 ne suffit pas pour les wildcards : Let&#8217;s Encrypt exige la validation DNS-01, qui prouve le contr\u00f4le de la zone DNS du domaine.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Pour Cloudflare, installez d&#8217;abord le plugin DNS :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo snap install certbot-dns-cloudflare<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Cr\u00e9ez le fichier de configuration avec votre token API Cloudflare :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo tee \/etc\/letsencrypt\/cloudflare.ini &lt;&lt; 'EOF'\ndns_cloudflare_api_token = VOTRE_TOKEN_API_CLOUDFLARE\nEOF\nsudo chmod 600 \/etc\/letsencrypt\/cloudflare.ini<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Demandez un certificat wildcard :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo certbot certonly \\\n  --dns-cloudflare \\\n  --dns-cloudflare-credentials \/etc\/letsencrypt\/cloudflare.ini \\\n  -d \"monsite.com\" \\\n  -d \"*.monsite.com\"<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Le renouvellement automatique fonctionne de la m\u00eame fa\u00e7on que pour les certificats standards. Certbot met \u00e0 jour l&#8217;enregistrement DNS TXT <code>_acme-challenge.monsite.com<\/code> via l&#8217;API Cloudflare \u00e0 chaque renouvellement. Configurez le TTL de cet enregistrement \u00e0 60 secondes ou moins pour une propagation DNS rapide. Des plugins \u00e9quivalents existent pour OVH (<code>certbot-dns-ovh<\/code>), Gandi (<code>certbot-dns-gandi<\/code>) et AWS Route 53 (<code>certbot-dns-route53<\/code>).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"limites-de-debit-lets-encrypt-a-connaitre\">Limites de d\u00e9bit Let&#8217;s Encrypt \u00e0 conna\u00eetre<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Let&#8217;s Encrypt impose des limites strictes pour pr\u00e9venir les abus. Les conna\u00eetre vous \u00e9vitera des blocages impr\u00e9vus en production.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Limite<\/th><th>Valeur<\/th><th>Fen\u00eatre<\/th><th>Remarque<\/th><\/tr><\/thead><tbody><tr><td>Certificats par domaine enregistr\u00e9<\/td><td>50<\/td><td>7 jours glissants<\/td><td>Ex. : 50 certs pour *.monsite.com<\/td><\/tr><tr><td>Certificats pour un jeu de domaines identique<\/td><td>5<\/td><td>7 jours glissants<\/td><td>La r\u00e9vocation ne r\u00e9initialise pas ce compteur<\/td><\/tr><tr><td>Nouvelles commandes par compte<\/td><td>300<\/td><td>3 heures<\/td><td>Endpoint \/acme\/new-order<\/td><\/tr><tr><td>Comptes par adresse IP<\/td><td>10<\/td><td>3 heures<\/td><td>Limit\u00e9 par IP source<\/td><\/tr><tr><td>Requ\u00eates renewal-info<\/td><td>1 000<\/td><td>Fen\u00eatre glissante<\/td><td>Endpoint ARI<\/td><\/tr><tr><td>Domaines par certificat SAN<\/td><td>100<\/td><td>N\/A<\/td><td>Un seul certificat peut couvrir 100 domaines<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Consultez la <a href=\"https:\/\/letsencrypt.org\/fr\/docs\/rate-limits\/\" rel=\"noopener noreferrer\" target=\"_blank\">page officielle des limites Let&#8217;s Encrypt<\/a> pour les valeurs \u00e0 jour, notamment si vous g\u00e9rez des environnements multi-tenant ou des d\u00e9ploiements automatis\u00e9s \u00e0 grande \u00e9chelle.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"7-pieges-courants-et-comment-les-eviter\">7 pi\u00e8ges courants et comment les \u00e9viter<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Pi\u00e8ge 1 : DNS pas encore propag\u00e9.<\/strong> Lancer Certbot avant que le DNS de votre domaine pointe vers le serveur est l&#8217;erreur num\u00e9ro un. La validation HTTP-01 de Let&#8217;s Encrypt doit pouvoir atteindre votre serveur depuis Internet. V\u00e9rifiez la propagation avec <code>dig monsite.com +short<\/code> avant de lancer Certbot. Si l&#8217;IP affich\u00e9e n&#8217;est pas celle de votre serveur, attendez que le TTL expire.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Pi\u00e8ge 2 : Coexistence de l&#8217;ancienne installation apt et du nouveau snap.<\/strong> Ubuntu installe parfois <code>python3-certbot-nginx<\/code> via des d\u00e9pendances. La coexistence des deux versions provoque des comportements impr\u00e9visibles. V\u00e9rifiez avec <code>which certbot<\/code> que le binaire pointe vers <code>\/snap\/bin\/certbot<\/code>. Si ce n&#8217;est pas le cas, supprimez le paquet apt et reliez le symlink.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Pi\u00e8ge 3 : Activer HSTS avec includeSubDomains pr\u00e9matur\u00e9ment.<\/strong> Si un sous-domaine ne dispose pas d&#8217;un certificat HTTPS valide, les navigateurs qui ont m\u00e9moris\u00e9 la r\u00e8gle HSTS rendront ce sous-domaine totalement inaccessible jusqu&#8217;\u00e0 l&#8217;expiration du max-age. Testez d&#8217;abord sans <code>includeSubDomains<\/code>, et ajoutez cette directive uniquement quand tous vos sous-domaines sont couverts.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Pi\u00e8ge 4 : Oublier le hook de rechargement Nginx.<\/strong> Apr\u00e8s un renouvellement, Nginx continue de servir l&#8217;ancien certificat jusqu&#8217;au prochain red\u00e9marrage. Sans le hook dans <code>\/etc\/letsencrypt\/renewal-hooks\/deploy\/<\/code>, votre site affichera un certificat expir\u00e9 \u00e0 90 jours pr\u00e9cis, en pleine nuit, sans que vous l&#8217;ayez anticip\u00e9.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Pi\u00e8ge 5 : Tester avec le domaine de production sans passer par le staging.<\/strong> Cinq demandes de certificat identiques \u00e9chou\u00e9es en 7 jours d\u00e9clenchent un blocage de 7 jours. Utilisez toujours le flag <code>--staging<\/code> pour les premi\u00e8res tentatives, puis supprimez le certificat de staging (<code>sudo certbot delete --cert-name monsite.com<\/code>) avant d&#8217;\u00e9mettre le certificat de production.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Pi\u00e8ge 6 : add_header sans le mot-cl\u00e9 always.<\/strong> En Nginx, la directive <code>add_header<\/code> sans <code>always<\/code> n&#8217;envoie l&#8217;en-t\u00eate que sur les r\u00e9ponses de code 200, 201, 204, 206, 301, 302, 303, 304, 307 et 308. Mais si vous avez un bloc <code>location<\/code> enfant qui d\u00e9finit ses propres <code>add_header<\/code>, les en-t\u00eates du bloc parent sont compl\u00e8tement \u00e9cras\u00e9s pour ce contexte. La solution : regroupez tous vos en-t\u00eates de s\u00e9curit\u00e9 dans un fichier s\u00e9par\u00e9 (<code>\/etc\/nginx\/security-headers.conf<\/code>) et incluez-le dans chaque bloc <code>location<\/code> qui en a besoin.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Pi\u00e8ge 7 : Chemin de challenge ACME inaccessible derri\u00e8re un reverse proxy.<\/strong> Si Nginx proxifie vers une application backend, le bloc <code>location \/<\/code> intercepte les requ\u00eates ACME de validation HTTP-01 avant qu&#8217;elles n&#8217;atteignent le r\u00e9pertoire de challenge. Ajoutez toujours une exception explicite avant le bloc de proxy :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>    location \/.well-known\/acme-challenge\/ {\n        root \/var\/www\/html;\n        allow all;\n    }\n\n    location \/ {\n        proxy_pass http:\/\/localhost:3000;\n    }<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"depannage-8-erreurs-frequentes-et-leurs-solutions\">D\u00e9pannage : 8 erreurs fr\u00e9quentes et leurs solutions<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"erreur-connection-refused-lors-de-la-validation-http-01\">Erreur &#8220;Connection refused&#8221; lors de la validation HTTP-01<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Let&#8217;s Encrypt ne peut pas joindre votre serveur sur le port 80. V\u00e9rifiez dans cet ordre : UFW autorise le port 80 (<code>sudo ufw status<\/code>), Nginx est lanc\u00e9 (<code>sudo systemctl status nginx<\/code>), aucune r\u00e8gle de pare-feu externe ne bloque le port 80. Testez depuis une machine externe avec <code>curl -v http:\/\/monsite.com\/.well-known\/acme-challenge\/test<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"erreur-too-many-certificates-already-issued\">Erreur &#8220;too many certificates already issued&#8221;<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Vous avez atteint la limite de 5 certificats identiques en 7 jours. La seule solution est d&#8217;attendre la fin de la fen\u00eatre glissante. Pour d\u00e9bloquer la situation, vous pouvez ajouter ou supprimer un domaine du jeu de SANs pour cr\u00e9er un nouveau jeu unique. Pour l&#8217;avenir, utilisez syst\u00e9matiquement <code>--staging<\/code> pour tester.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"erreur-nginx-emerg-unknown-directive-ssl_stapling\">Erreur &#8220;nginx: [emerg] unknown directive ssl_stapling&#8221;<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Nginx a \u00e9t\u00e9 compil\u00e9 sans le module SSL. V\u00e9rifiez avec <code>nginx -V 2>&1 | grep with-http_ssl_module<\/code>. Le paquet Nginx standard d&#8217;Ubuntu inclut ce module. Si vous avez compil\u00e9 Nginx manuellement depuis les sources, recompilez avec les flags <code>--with-http_ssl_module --with-http_v2_module --with-http_stub_status_module<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"ocsp-stapling-retourne-no-response-sent\">OCSP Stapling retourne &#8220;no response sent&#8221;<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Deux causes fr\u00e9quentes. Premi\u00e8re : Nginx n&#8217;a pas encore r\u00e9cup\u00e9r\u00e9 la r\u00e9ponse OCSP (attendez 5 minutes apr\u00e8s le rechargement). Deuxi\u00e8me : la directive <code>ssl_trusted_certificate<\/code> pointe vers <code>fullchain.pem<\/code> au lieu de <code>chain.pem<\/code>. La v\u00e9rification de la cha\u00eene OCSP n\u00e9cessite la cha\u00eene interm\u00e9diaire seule, sans le certificat du serveur.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"ssl-labs-retourne-b-a-cause-de-tls-1-0-ou-1-1\">SSL Labs retourne &#8220;B&#8221; \u00e0 cause de TLS 1.0 ou 1.1<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Votre configuration inclut encore des protocoles obsol\u00e8tes. V\u00e9rifiez le contenu de <code>\/etc\/letsencrypt\/options-ssl-nginx.conf<\/code> pour d\u00e9tecter une ancienne version. Mettez \u00e0 jour Certbot (<code>sudo snap refresh certbot<\/code>) et rechargez Nginx. Si le probl\u00e8me persiste, votre directive <code>ssl_protocols<\/code> personnalis\u00e9e \u00e9crase peut-\u00eatre celle du fichier include.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"le-renouvellement-automatique-echoue-silencieusement\">Le renouvellement automatique \u00e9choue silencieusement<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Consultez les journaux du service de renouvellement :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo journalctl -u snap.certbot.renew.service --since \"30 days ago\" --no-pager\nsudo journalctl -u snap.certbot.renew.timer<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Une erreur de permission indique souvent que le hook de rechargement Nginx n&#8217;est pas ex\u00e9cutable (<code>chmod +x<\/code> manquant). Une erreur de connexion indique un probl\u00e8me r\u00e9seau intermittent ou un pare-feu bloquant l&#8217;acc\u00e8s Let&#8217;s Encrypt.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"erreur-snap-store-cannot-be-reached-lors-de-linstallation\">Erreur &#8220;Snap store cannot be reached&#8221; lors de l&#8217;installation<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Certains VPS ou environnements r\u00e9seau restreignent l&#8217;acc\u00e8s au snap store. Diagnostiquez avec <code>curl -v https:\/\/api.snapcraft.io\/api\/v1\/<\/code>. Si votre serveur est derri\u00e8re un proxy, configurez les variables d&#8217;environnement dans <code>\/etc\/environment<\/code> : <code>https_proxy=http:\/\/proxy.exemple.com:3128<\/code>. Alternative si le snap reste inaccessible : pip (<code>pip3 install certbot certbot-nginx<\/code>).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"erreur-certificate-verify-failed-lors-du-renouvellement\">Erreur &#8220;certificate verify failed&#8221; lors du renouvellement<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Erreur fr\u00e9quente lors de la mise \u00e0 jour de la cha\u00eene de certification interm\u00e9diaire de Let&#8217;s Encrypt. Let&#8217;s Encrypt a modifi\u00e9 sa cha\u00eene interm\u00e9diaire en 2021 (fin du cross-sign avec IdenTrust). Si votre serveur utilise encore l&#8217;ancien certificat racine, mettez \u00e0 jour les certificats CA du syst\u00e8me : <code>sudo update-ca-certificates<\/code>. V\u00e9rifiez \u00e9galement que <code>ssl_trusted_certificate<\/code> pointe vers le bon fichier <code>chain.pem<\/code>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"tls-1-2-vs-tls-1-3-ce-qui-change-concretement\">TLS 1.2 vs TLS 1.3 : ce qui change concr\u00e8tement<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Crit\u00e8re<\/th><th>TLS 1.2<\/th><th>TLS 1.3<\/th><\/tr><\/thead><tbody><tr><td>Tours de poign\u00e9e de main (RTT)<\/td><td>2 RTT pour une nouvelle connexion<\/td><td>1 RTT (0-RTT en reprise de session)<\/td><\/tr><tr><td>Algorithmes d&#8217;\u00e9change de cl\u00e9s<\/td><td>RSA, DH, ECDHE au choix du serveur<\/td><td>ECDHE uniquement (perfect forward secrecy garantie)<\/td><\/tr><tr><td>Chiffrement du handshake<\/td><td>Certificat visible en clair<\/td><td>Chiffr\u00e9 apr\u00e8s ServerHello (Encrypted Client Hello en cours)<\/td><\/tr><tr><td>Nombre de suites chiffr\u00e9es<\/td><td>Des dizaines, dont des suites faibles<\/td><td>5 suites AEAD uniquement (AES-GCM, ChaCha20)<\/td><\/tr><tr><td>Compatibilit\u00e9 navigateurs<\/td><td>100% (IE 11 inclus)<\/td><td>Plus de 97% des navigateurs modernes<\/td><\/tr><tr><td>Recommandation ANSSI 2026<\/td><td>Autoris\u00e9 (profil interm\u00e9diaire)<\/td><td>Recommand\u00e9 (profil moderne)<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">En pratique, activer les deux protocoles (<code>ssl_protocols TLSv1.2 TLSv1.3<\/code>) est le bon compromis pour 2026. TLS 1.3 sera n\u00e9goci\u00e9 avec les navigateurs modernes. TLS 1.2 assure la compatibilit\u00e9 avec des clients plus anciens, notamment certains appareils Android sous des versions datant d&#8217;avant 2016, des biblioth\u00e8ques HTTP d&#8217;entreprise vieillissantes ou des \u00e9quipements IoT industriels.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">L&#8217;<a href=\"https:\/\/cyber.gouv.fr\/publications\/recommandations-de-securite-relatives-tls\" rel=\"noopener noreferrer\" target=\"_blank\">ANSSI publie des recommandations TLS<\/a> d\u00e9taillant les profils de s\u00e9curit\u00e9 selon le contexte. Pour un serveur web public, le profil &#8220;interm\u00e9diaire&#8221; (TLS 1.2 + 1.3, suites ECDHE-AEAD) est adapt\u00e9. Le profil &#8220;strict&#8221; (TLS 1.3 uniquement) est recommand\u00e9 pour les applications traitant des donn\u00e9es de sant\u00e9, financi\u00e8res ou gouvernementales. Le <a href=\"https:\/\/ssl-config.mozilla.org\/\" rel=\"noopener noreferrer\" target=\"_blank\">g\u00e9n\u00e9rateur de configuration Mozilla<\/a> produit des exemples de configuration Nginx pour ces deux profils, en s\u00e9lectionnant automatiquement les param\u00e8tres adapt\u00e9s \u00e0 la version de Nginx d\u00e9tect\u00e9e.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"conseils-avances\">Conseils avanc\u00e9s<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"surveillance-proactive-de-lexpiration-des-certificats\">Surveillance proactive de l&#8217;expiration des certificats<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Le renouvellement automatique peut \u00e9chouer pendant des semaines sans alerter l&#8217;administrateur. Mettez en place une v\u00e9rification active depuis un serveur de monitoring externe. Ce script v\u00e9rifie la date d&#8217;expiration du certificat en production et alerte si elle est inf\u00e9rieure \u00e0 30 jours :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/bin\/bash\nDOMAIN=\"monsite.com\"\nJOURS_ALERTE=30\nexpiry=$(echo | openssl s_client -servername $DOMAIN -connect $DOMAIN:443 2>\/dev\/null \\\n  | openssl x509 -noout -enddate | cut -d= -f2)\nexpiry_epoch=$(date -d \"$expiry\" +%s)\nnow_epoch=$(date +%s)\njours_restants=$(( (expiry_epoch - now_epoch) \/ 86400 ))\nif [ $jours_restants -lt $JOURS_ALERTE ]; then\n  echo \"ALERTE : certificat $DOMAIN expire dans $jours_restants jours\"\n  exit 1\nfi\necho \"OK : certificat $DOMAIN expire dans $jours_restants jours\"<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Int\u00e9grez ce script \u00e0 cron avec une ex\u00e9cution quotidienne, ou connectez-le \u00e0 votre syst\u00e8me de monitoring (Zabbix, Nagios, Prometheus avec le module <code>ssl_exporter<\/code>).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"gerer-plusieurs-sites-sur-le-meme-serveur\">G\u00e9rer plusieurs sites sur le m\u00eame serveur<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Certbot peut g\u00e9rer plusieurs certificats ind\u00e9pendants sur un seul serveur. Chaque domaine poss\u00e8de son propre r\u00e9pertoire dans <code>\/etc\/letsencrypt\/live\/<\/code>. Listez tous les certificats g\u00e9r\u00e9s avec <code>sudo certbot certificates<\/code>. Pour ajouter un domaine \u00e0 un certificat existant, utilisez le flag <code>--expand<\/code>. Pour r\u00e9voquer et supprimer un certificat qui n&#8217;est plus n\u00e9cessaire : <code>sudo certbot revoke --cert-name monanciendomaine.com && sudo certbot delete --cert-name monanciendomaine.com<\/code>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"couverture-associee\">Couverture associ\u00e9e<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li><a href=\"\/openssl-cles-certificats-tutoriel\/\">OpenSSL : cl\u00e9s et certificats en 12 \u00e9tapes [2026]<\/a> : g\u00e9n\u00e9rez des CSR, des cl\u00e9s priv\u00e9es et des certificats auto-sign\u00e9s avec OpenSSL en ligne de commande, avant de les utiliser avec Nginx.<\/li><li><a href=\"\/ssh-keygen-cle-ssh-authentification\/\">ssh-keygen : cl\u00e9 SSH en 12 \u00e9tapes, 20 min [2026]<\/a> : s\u00e9curisez l&#8217;acc\u00e8s administrateur \u00e0 votre serveur Linux avec des cl\u00e9s SSH avant de configurer HTTPS.<\/li><li><a href=\"\/fail2ban-tutoriel-serveur-linux\/\">Fail2ban : prot\u00e9ger un serveur Linux en 12 \u00e9tapes [2026]<\/a> : bloquez les attaques par force brute sur votre serveur Nginx et SSH.<\/li><li><a href=\"\/nmap-scanner-reseau-tutoriel\/\">Nmap : scanner un r\u00e9seau en 12 \u00e9tapes, 30 min [2026]<\/a> : v\u00e9rifiez que seuls les ports 80 et 443 sont expos\u00e9s sur votre serveur apr\u00e8s la configuration HTTPS.<\/li><li><a href=\"\/kyber-vs-dilithium\/\">Kyber vs Dilithium : 1 Ko vs 3,3 Ko, le duel PQC [2026]<\/a> : les algorithmes post-quantiques qui remplaceront RSA et ECDSA dans les futures versions de TLS.<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"faq\">FAQ<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"les-certificats-lets-encrypt-sont-ils-vraiment-fiables-pour-la-production\">Les certificats Let&#8217;s Encrypt sont-ils vraiment fiables pour la production ?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Oui. Let&#8217;s Encrypt est une autorit\u00e9 de certification publique reconnue par tous les navigateurs majeurs (Chrome, Firefox, Safari, Edge). Elle est g\u00e9r\u00e9e par l&#8217;Internet Security Research Group (ISRG), une organisation \u00e0 but non lucratif soutenue par Mozilla, Google, Cisco et l&#8217;EFF. Les certificats DV (Domain Validation) de Let&#8217;s Encrypt sont techniquement identiques \u00e0 ceux vendus par Comodo ou DigiCert. La seule diff\u00e9rence r\u00e9side dans le niveau de validation : DV prouve uniquement le contr\u00f4le du domaine, OV valide l&#8217;organisation, EV valide l&#8217;organisation de fa\u00e7on \u00e9tendue. Pour un blog, une boutique en ligne ou une API, DV est suffisant.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"quelle-est-la-difference-entre-certbot-nginx-et-certbot-certonly\">Quelle est la diff\u00e9rence entre certbot &#8211;nginx et certbot certonly ?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><code>certbot --nginx<\/code> obtient le certificat ET modifie automatiquement la configuration Nginx pour activer HTTPS. C&#8217;est la m\u00e9thode recommand\u00e9e pour les d\u00e9butants. <code>certbot certonly<\/code> obtient uniquement le certificat sans toucher \u00e0 la configuration Nginx : vous devez ensuite modifier manuellement votre bloc <code>server<\/code> pour pointer vers <code>fullchain.pem<\/code> et <code>privkey.pem<\/code>. Cette deuxi\u00e8me m\u00e9thode est pr\u00e9f\u00e9rable quand vous g\u00e9rez la configuration Nginx via Ansible, Puppet ou Terraform, afin d&#8217;\u00e9viter que Certbot n&#8217;\u00e9crase vos fichiers g\u00e9r\u00e9s par votre outil d&#8217;automatisation.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"pourquoi-mon-score-ssl-labs-est-a-et-non-a\">Pourquoi mon score SSL Labs est A et non A+ ?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">La note A+ n\u00e9cessite HSTS avec un <code>max-age<\/code> d&#8217;au moins 180 jours (15 552 000 secondes). V\u00e9rifiez avec <code>curl -I https:\/\/monsite.com | grep strict<\/code> que l&#8217;en-t\u00eate est pr\u00e9sent. Si absent, v\u00e9rifiez que le mot-cl\u00e9 <code>always<\/code> figure dans votre directive <code>add_header<\/code>. S&#8217;il est pr\u00e9sent mais avec une valeur trop faible, augmentez le <code>max-age<\/code> \u00e0 31536000 (1 an) et rechargez Nginx.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"que-se-passe-t-il-si-le-certificat-expire\">Que se passe-t-il si le certificat expire ?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">D\u00e8s l&#8217;expiration, les navigateurs affichent l&#8217;erreur bloquante &#8220;NET::ERR_CERT_DATE_INVALID&#8221; et les visiteurs ne peuvent plus acc\u00e9der au site sans contourner manuellement l&#8217;avertissement de s\u00e9curit\u00e9. Pour les API HTTPS, les clients re\u00e7oivent une erreur TLS et toutes les requ\u00eates \u00e9chouent. Pour renouveler manuellement un certificat expir\u00e9, lancez <code>sudo certbot renew --force-renewal<\/code> puis rechargez Nginx.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"lets-encrypt-fonctionne-t-il-avec-des-protocoles-non-http-mqtt-grpc-imap\">Let&#8217;s Encrypt fonctionne-t-il avec des protocoles non-HTTP (MQTT, gRPC, IMAP) ?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Oui. Let&#8217;s Encrypt \u00e9met des certificats X.509 standards qui fonctionnent avec n&#8217;importe quel protocole bas\u00e9 sur TLS : HTTPS, SMTPS, IMAPS, MQTTS, WebSockets s\u00e9curis\u00e9s (WSS), gRPC-TLS. La validation du domaine se fait via HTTP ou DNS, mais le certificat \u00e9mis n&#8217;est pas limit\u00e9 \u00e0 un usage web. Pour des services non-HTTP, obtenez le certificat avec <code>certbot certonly<\/code> et configurez manuellement le d\u00e9mon concern\u00e9 pour pointer vers les fichiers de certificat dans <code>\/etc\/letsencrypt\/live\/<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"quelle-est-la-transition-vers-les-certificats-de-45-jours\">Quelle est la transition vers les certificats de 45 jours ?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Let&#8217;s Encrypt a annonc\u00e9 un calendrier de r\u00e9duction progressive de la dur\u00e9e de vie des certificats. En mai 2026, une phase d&#8217;opt-in permet aux early adopters d&#8217;obtenir des certificats de 45 jours. En f\u00e9vrier 2027, la dur\u00e9e passe \u00e0 64 jours pour tous. En f\u00e9vrier 2028, la dur\u00e9e finale de 45 jours sera g\u00e9n\u00e9ralis\u00e9e. Cette \u00e9volution renforce la s\u00e9curit\u00e9 (un certificat compromis expire plus vite) mais exige un renouvellement automatique parfaitement fiable. Certbot 4.1.0 ou ult\u00e9rieur prend en charge les ACME Renewal Information (ARI), permettant \u00e0 Let&#8217;s Encrypt de recommander exactement quand renouveler.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"comment-tester-la-configuration-nginx-sans-rechargement-en-production\">Comment tester la configuration Nginx sans rechargement en production ?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Utilisez toujours <code>sudo nginx -t<\/code> avant tout rechargement. Cette commande teste la syntaxe et la coh\u00e9rence de la configuration compl\u00e8te (fichier principal + includes) sans perturber le serveur en cours d&#8217;ex\u00e9cution. En cas d&#8217;erreur, Nginx affiche le fichier et le num\u00e9ro de ligne concern\u00e9s. Pour tester une nouvelle configuration sur un port diff\u00e9rent avant de basculer, utilisez <code>nginx -c \/chemin\/vers\/nginx-test.conf -t<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Pour approfondir, consultez les <a href=\"https:\/\/certbot.eff.org\/instructions?os=ubuntufocal&#038;web=nginx\" rel=\"noopener noreferrer\" target=\"_blank\">instructions officielles Certbot pour Ubuntu et Nginx<\/a>, le <a href=\"https:\/\/ssl-config.mozilla.org\/\" rel=\"noopener noreferrer\" target=\"_blank\">g\u00e9n\u00e9rateur de configuration SSL Mozilla<\/a> et les <a href=\"https:\/\/letsencrypt.org\/fr\/docs\/rate-limits\/\" rel=\"noopener noreferrer\" target=\"_blank\">limites de d\u00e9bit Let&#8217;s Encrypt<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Let&#8217;s Encrypt d\u00e9livre plus de 10 millions de certificats TLS par jour. Pourtant, des milliers de serveurs Nginx tournent encore en HTTP simple, exposant les donn\u00e9es de leurs visiteurs \u00e0\u2026<\/p>\n","protected":false},"author":9,"featured_media":208,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[10,3],"tags":[],"class_list":["post-207","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-10","category-security"],"_links":{"self":[{"href":"https:\/\/shattered.io\/fr\/wp-json\/wp\/v2\/posts\/207","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/shattered.io\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/shattered.io\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/shattered.io\/fr\/wp-json\/wp\/v2\/users\/9"}],"replies":[{"embeddable":true,"href":"https:\/\/shattered.io\/fr\/wp-json\/wp\/v2\/comments?post=207"}],"version-history":[{"count":1,"href":"https:\/\/shattered.io\/fr\/wp-json\/wp\/v2\/posts\/207\/revisions"}],"predecessor-version":[{"id":209,"href":"https:\/\/shattered.io\/fr\/wp-json\/wp\/v2\/posts\/207\/revisions\/209"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/shattered.io\/fr\/wp-json\/wp\/v2\/media\/208"}],"wp:attachment":[{"href":"https:\/\/shattered.io\/fr\/wp-json\/wp\/v2\/media?parent=207"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/shattered.io\/fr\/wp-json\/wp\/v2\/categories?post=207"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/shattered.io\/fr\/wp-json\/wp\/v2\/tags?post=207"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}