Guide SecOps & Bonnes Pratiques

Strict-Transport-Security (HSTS) : Le guide définitif pour verrouiller HTTPS

Éliminez les attaques de SSL Stripping, sécurisez l’intégralité de vos sous-domaines et intégrez la HSTS Preload List officielle des navigateurs sans risque d’interruption de service.

Xavier Maillard 12 min

La majorité des administrateurs et développeurs pensent qu’une simple redirection HTTP 301 Moved Permanently vers HTTPS suffit à garantir l’étanchéité cryptographique de leurs échanges web. C’est une illusion d’optique sécuritaire particulièrement dangereuse. Dans ce guide de référence, j’analyse les mécanismes sous-jacents de l’en-tête Strict-Transport-Security (HSTS), la neutralisation des attaques de SSL Stripping, la méthode pour intégrer la HSTS Preload List des navigateurs et le protocole de déploiement par étapes pour éviter toute coupure de service.

Diagnostic Express Gratuit

Vérifier la configuration HSTS et SSL de votre domaine

Testez la présence de l’en-tête Strict-Transport-Security, la conformité de vos certificats et l’éligibilité Preload en 5 secondes.

1. Qu’est-ce que HSTS et pourquoi la redirection 301 ne suffit pas

Le protocole HSTS (HTTP Strict Transport Security), normalisé par l’IETF dans la RFC 6797, est un mécanisme de sécurité par lequel un serveur web informe les agents utilisateurs (navigateurs web) qu’ils ne doivent sous aucun prétexte communiquer avec lui en HTTP non chiffré.

Pourquoi une redirection de type http://exemple.com vers https://exemple.com est-elle fondamentalement insuffisante ?

Lorsqu’un internaute saisit simplement exemple.com dans sa barre d’adresse ou clique sur un lien historique non sécurisé, le navigateur tente par défaut une requête initiale en protocole HTTP clair sur le port 80. Votre serveur reçoit cette requête et renvoie immédiatement un code de redirection 301 ou 302 ordonnant de basculer sur https:// (port 443).

La fenêtre de vulnérabilité TOFU (Trust On First Use) : Cette redirection initiale transite en clair sur le réseau physique. Entre le moment où le visiteur émet la requête HTTP et le moment où votre serveur répond avec la redirection 301, les paquets sont lisibles et modifiables par tout acteur en position d’écoute (borne Wi-Fi compromise, proxy malveillant, routeur piraté).

Avec l’en-tête HSTS actif, la dynamique est radicalement inversée : lors de toute visite ultérieure, le navigateur intercepte la requête en mémoire locale avant même d’envoyer le moindre octet sur la carte réseau. Il génère en interne une redirection synthétique immédiate : 307 Internal Redirect. Le port 80 n’est jamais interrogé.

2. L’anatomie d’une attaque de SSL Stripping (MITM)

Dévoilée en 2009 par le chercheur Moxie Marlinspike, l’attaque de SSL Stripping (ou dégradation de chiffrement) est l’une des techniques d’interception de trafic les plus redoutables en environnement réseau partagé.

Le scénario d’attaque se décompose ainsi :

  1. L’attaquant se place en position d’homme du milieu (Man-in-the-Middle via usurpation ARP ou point d’accès Wi-Fi rogue).
  2. La victime tape banque.fr. Une requête HTTP claire vers le port 80 est émise.
  3. L’attaquant intercepte cette requête. Il établit lui-même une connexion sécurisée HTTPS légitime avec le serveur de la banque.
  4. Lorsque le serveur renvoie sa page de connexion ou sa redirection 301, l’attaquant réécrit à la volée tous les liens https:// en http:// et supprime tout en-tête de chiffrement.
  5. La victime continue de naviguer sur une version HTTP parfaitement déchiffrée et manipulable, sans que le moindre avertissement de certificat SSL invalide ne s’affiche sur son écran. Ses identifiants et jetons de session sont capturés en temps réel.

Face à cette attaque, seul HSTS offre une protection hermétique. Dès lors que le navigateur a mémorisé la consigne HSTS pour le domaine, il refuse catégoriquement d’émettre la requête HTTP initiale et bloque instantanément toute tentative d’abaissement de sécurité.

3. Décomposition des directives HSTS : max-age, includeSubDomains & preload

L’en-tête HTTP se configure via la directive Strict-Transport-Security. Sa syntaxe standard combine trois paramètres clés :

Strict-Transport-Security: max-age=31536000; includeSubDomains; preload

Analysons la portée technique exacte de chacun de ces paramètres :

  • max-age=<secondes> (Obligatoire) : Définit la durée pendant laquelle le navigateur doit se souvenir de l’obligation HTTPS. Chaque nouvelle visite valide sur le site réinitialise ce compteur. Pour une protection durable et pour être éligible au préchargement navigateur, la valeur minimale exigée est de 1 an (31 536 000 secondes), bien qu’une durée de 2 ans (63 072 000 secondes) soit recommandée par Google Chrome.
  • includeSubDomains (Optionnel mais crucial) : Étend la contrainte HTTPS stricte à l’intégralité des sous-domaines existants et futurs (ex. api.exemple.com, mail.exemple.com, dev.exemple.com, intranet.exemple.com). Sans cette directive, un attaquant peut exploiter un sous-domaine non sécurisé pour injecter des cookies falsifiés sur le domaine principal (attaque par cookie tossing).
  • preload (Optionnel – Engagement permanent) : Confère votre autorisation explicite pour que votre nom de domaine soit gravé en dur dans la HSTS Preload List officielle intégrée directement dans le binaire des navigateurs (Chromium, Firefox, Safari, Edge). Grâce à cette directive, même un internaute qui visite votre site pour la toute première fois de sa vie bénéficiera de la protection HSTS instantanée, éliminant définitivement la fenêtre de vulnérabilité TOFU.
Attention capitale aux certificats invalides : Sous HSTS, les navigateurs désactivent le bouton permettant à l’utilisateur d’outrepasser un avertissement de sécurité (« Continuer quand même vers le site »). Si votre certificat expire ou comporte un nom d’hôte incorrect, l’accès sera totalement verrouillé pour l’ensemble de vos utilisateurs jusqu’à renouvellement du certificat.

4. Stratégie de déploiement progressif en 4 étapes (zéro risque)

Le principal danger de HSTS réside dans un déploiement précipité avec un max-age élevé et la directive includeSubDomains sur une infrastructure dont certains sous-domaines historiques ne supportent pas encore HTTPS.

En tant qu’auditeur SecOps, j’applique systématiquement la méthodologie suivante en 4 étapes pour sécuriser les parcs web sans le moindre incident de production :

Étape 1 : Cartographie et audit de l’exposition TLS

Avant d’émettre le premier en-tête HSTS, dressez l’inventaire exhaustif de tous vos enregistrements DNS (sous-domaines applicatifs, webmails, serveurs de staging, APIs). Assurez-vous que chaque sous-domaine dispose d’un certificat SSL/TLS valide (via un certificat Wildcard *.domaine.com ou des certificats automatisés Let’s Encrypt / ACME).

Étape 2 : Déploiement en test court (max-age = 5 minutes)

Configurez votre serveur avec une durée de mise en cache très faible, sans sous-domaines ni préchargement :

Strict-Transport-Security: max-age=300

Surveillez vos logs d’erreurs et vos métriques applicatives pendant 48 heures. En cas de dysfonctionnement imprévu, l’impact pour un utilisateur ne dépassera jamais 5 minutes.

Étape 3 : Extension progressive de la durée de rétention

Augmentez la durée par paliers successifs tout en validant la stabilité :

  • 1 semaine : max-age=604800
  • 1 mois : max-age=2592000; includeSubDomains (activez includeSubDomains à ce stade)

Étape 4 : Verrouillage pérenne et préchargement (1 an à 2 ans)

Une fois la conformité absolue vérifiée sur l’ensemble de vos sous-domaines, déployez la directive de production définitive :

Strict-Transport-Security: max-age=31536000; includeSubDomains; preload

5. Soumission à la HSTS Preload List (hstspreload.org) : Exigences & Pièges

Pour que votre site soit accepté sur hstspreload.org, votre infrastructure doit valider l’intégralité des conditions techniques suivantes :

  1. Délivrer un certificat SSL/TLS valide et approuvé par les autorités de certification publiques.
  2. Rediriger tout le trafic HTTP vers HTTPS sur le port 80 vers le port 443 pour le même nom d’hôte.
  3. Servir l’ensemble des sous-domaines en HTTPS (notamment le sous-domaine www si un enregistrement DNS existe).
  4. Délivrer l’en-tête HSTS sur le domaine racine (ex. exemple.com) lors de la requête HTTPS avec les contraintes :
    • max-age supérieur ou égal à 31536000 (1 an).
    • Présence obligatoire de la directive includeSubDomains.
    • Présence obligatoire de la directive preload.
Avertissement sur le délai de retrait : L’inscription sur la Preload List est un engagement irréversible à court terme. Si vous devez retirer votre domaine de la liste par la suite, le processus de suppression sur hstspreload.org puis le déploiement des mises à jour des navigateurs auprès des millions d’utilisateurs mondiaux prend généralement entre 6 et 12 mois. Ne demandez le préchargement que si vous avez la certitude que votre infrastructure restera intégralement chiffrée en HTTPS de façon permanente.

6. Configurations serveur prêtes pour la production : Nginx, Apache, Caddy & Cloudflare

Voici les snippets de configuration prêts à l’emploi pour intégrer HSTS sur vos serveurs web :

Configuration Nginx

Dans votre bloc server { ... } écoutant sur le port 443 SSL :

# Nginx - Configuration HSTS recommandée
server {
    listen 443 ssl http2;
    server_name exemple.com www.exemple.com;

    # Le mot-clé 'always' est indispensable pour émettre l'en-tête même sur les erreurs 4xx et 5xx
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;

    # Vos directives SSL et chemins applicatifs...
}

Configuration Apache (mod_headers)

Dans votre VirtualHost SSL ou directement dans votre fichier .htaccess sécurisé :

# Apache - Activation HSTS
<IfModule mod_headers.c>
    Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
</IfModule>

Configuration Caddy

Caddy gère HTTPS et les certificats Let’s Encrypt automatiquement par défaut. Pour activer HSTS avec préchargement dans votre Caddyfile :

exemple.com {
    header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
    reverse_proxy localhost:8080
}

Configuration Cloudflare Edge

Si votre trafic transite par le CDN ou le proxy Cloudflare :

  1. Rendez-vous dans la console Cloudflare > SSL/TLS > Edge Certificates.
  2. Sous la section HTTP Strict Transport Security (HSTS), cliquez sur Enable HSTS.
  3. Activez le statut, réglez Max Age Header sur 1 month ou 1 year, cochez Apply HSTS policy to subdomains et Preload.

HSTS est indispensable pour garantir l’étanchéité du canal de transport, mais il ne protège pas votre application contre les vulnérabilités de la couche applicative (ex. scripts malveillants injectés, vol de jetons dans le DOM, détournement d’interface utilisateur).

Pour bâtir une défense en profondeur véritablement inviolable, HSTS doit s’inscrire au sein d’une politique globale d’en-têtes HTTP de sécurité comprenant :

  • Content-Security-Policy (CSP) : Le pare-feu navigateur absolu contre les failles XSS et l’exfiltration de données.
  • X-Frame-Options : La neutralisation du Clickjacking et de l’encapsulation dans des iframes furtives.
  • X-Content-Type-Options : Le blocage de l’interprétation fallacieuse des types MIME par le navigateur.
  • Permissions-Policy : Le verrouillage de l’accès aux capteurs matériels (caméra, microphone, géolocalisation) et la protection contre les attaques sur la supply chain logicielle.
  • Referrer-Policy : La confidentialité des adresses et paramètres de navigation de vos utilisateurs.
Compléter votre arsenal DevSecOps : Pour découvrir la configuration détaillée de l’ensemble des en-têtes HTTP de protection, consultez mon guide complet des Security Headers HTTP essentiels 2026 et mon guide approfondi Permissions-Policy.
Diagnostic Express Gratuit

Votre serveur est-il prêt pour la HSTS Preload List ?

Testez instantanément votre nom de domaine avec le scanner WebGuardian pour obtenir un diagnostic complet de vos en-têtes et corriger vos anomalies de sécurité.

Questions fréquentes (FAQ)

Quelle est la différence fondamentale entre une redirection 301 vers HTTPS et l’en-tête HSTS ?

La redirection 301 est une réponse du serveur reçue après une première requête qui a transité en clair (HTTP). Durant cet échange initial, un pirate peut intercepter ou modifier la communication. Avec HSTS, c’est le navigateur lui-même qui effectue une redirection interne instantanée (307 Internal Redirect) sans jamais envoyer de paquet HTTP sur le réseau physique.

Pourquoi la directive includeSubDomains peut-elle rendre certains services inaccessibles ?

Si vous activez includeSubDomains sur exemple.com, le navigateur appliquera obligatoirement HTTPS à l’ensemble de vos sous-domaines (api, mail, dev, intranet). Si l’un d’eux ne dispose pas d’un certificat SSL/TLS valide ou écoute uniquement en HTTP, il deviendra instantanément inaccessible pour vos utilisateurs sans possibilité d’outrepasser l’avertissement.

Peut-on annuler facilement une soumission à la HSTS Preload List ?

Non. Une fois votre domaine validé sur hstspreload.org, il est gravé dans le code source des futures versions de Chrome, Firefox, Safari et Edge. Une demande de retrait peut prendre entre 6 et 12 mois avant d’être répercutée sur les terminaux de tous les utilisateurs mondiaux.

Pourquoi le flag « always » est-il indispensable dans la configuration Nginx ?

Par défaut, la directive add_header de Nginx n’ajoute l’en-tête que sur les réponses aux statuts HTTP réussis (200, 201, 204, 301, 302). Sans le mot-clé « always », une page d’erreur 404 Not Found ou 500 Server Error ne recevrait pas le header HSTS, créant une brèche d’observation.

XM

Xavier Maillard

Directeur IT & Expert Indépendant (Mx Solutions)

Me contacter →

Directeur informatique en multinationale et expert indépendant, fondateur et gérant de Mx Solutions au Luxembourg depuis 2017. Développeur d’applications web PHP depuis 2003, spécialisé en bases de données, analyse de données, reporting réglementaire et architecture DevSecOps.