HSTS demande au navigateur de refuser le http simple pour votre domaine pendant une durée fixée. Il ferme une attaque bien réelle — la toute première requête, avant la redirection — et le navigateur s'en souvient : c'est précisément pour cela qu'il faut l'introduire avec précaution.

L'en-tête

add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

Ce qui le rend dangereux

Il est mémorisé, et on ne peut pas le reprendre. Envoyez max-age=31536000 et tout navigateur qui l'a vu refusera le http pendant un an. Si votre certificat expire ensuite, ou qu'un sous-domaine n'en a pas, les visiteurs reçoivent un avertissement qu'ils ne peuvent pas contourner d'un clic — et retirer l'en-tête n'y change rien, car l'instruction est déjà dans leur navigateur.

Introduisez-le par étapes

# week 1 - five minutes
add_header Strict-Transport-Security "max-age=300" always;

# week 2 - a day
add_header Strict-Transport-Security "max-age=86400" always;

# week 3 - a week, then a year once nothing has broken
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

includeSubDomains est la partie qui piège les gens

Il s'applique à chaque sous-domaine, y compris ceux que vous avez oubliés : une vieille préproduction, un outil interne, un hôte hérité sans certificat. Tous deviennent inaccessibles en http, d'un seul coup. Vérifiez que chaque sous-domaine possède un certificat valide avant de l'ajouter.

for h in www shop staging api mail; do
  printf '%-8s ' "$h"
  curl -sS -o /dev/null -w '%{http_code}\
' "https://$h.example.com/" || echo FAIL
done

Le préchargement est permanent, en pratique

La liste de préchargement est compilée dans les navigateurs : la règle s'applique avant même la première visite. Un retrait met des mois à atteindre tout le monde. N'ajoutez pas le jeton preload avant que le site ait tourné un an à max-age plein sans incident.

Si vous êtes déjà enfermé dehors

Réparez le certificat : c'est la seule vraie réponse. Pour votre propre machine, Chrome peut effacer un domaine depuis chrome://net-internals/#hsts, ce qui vous permet de tester et ne fait rien pour vos visiteurs.

HSTS mérite d'être mis en place. C'est le renouvellement automatique qui le rend sûr — voir Le renouvellement qui échoue en silence.