Qu’est-ce que HSTS ?
HSTS (HTTP Strict Transport Security) est un mécanisme de sécurité Web qui indique aux navigateurs d'interagir uniquement avec un site Web via HTTPS, jamais HTTP. Une fois qu'un navigateur voit un en-tête HSTS, il mettra automatiquement à niveau toutes les requêtes futures vers HTTPS et refusera de se connecter via HTTP, même si l'utilisateur tape explicitement http://.
Pourquoi HSTS est important
Même avec un certificat SSL valide, des vulnérabilités existent :
Attaque par suppression de SSL
1. L'utilisateur saisit « example.com » (sans https://)
2. L'attaquant intercepte la requête HTTP initiale
3. L'attaquant relaie la requête vers HTTPS, mais présente HTTP à l'utilisateur
4. L'utilisateur pense être protégé, mais l'attaquant voit tout
HSTS empêche cela en s'assurant que les navigateurs ne font jamais cette requête HTTP initiale.
Avantages de HSTS
- Prévient les attaques de dégradation: Pas de retour HTTP possible
- Protection des signets utilisateur: Même les anciens signets HTTP deviennent HTTPS
- Élimine le contenu mélangé: Les sous-ressources sont également forcées à HTTPS
- Améliore la performance: Pas de redirection HTTP→HTTPS nécessaire
Syntaxe de l’en-tête HSTS
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
Directives
| Directive | Description |
|---|---|
| max-age | Nombre de secondes pendant lesquelles HSTS est mémorisé (31536000 = 1 an) |
| includeSubDomains | Applique HSTS à tous les sous-domaines |
| preload | Consentement à l'inclusion dans la liste de préchargement des navigateurs |
Mise en œuvre de HSTS
Nginx
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
Apache
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
Cloudflare
Activer dans SSL/TLS → Edge Certificates → HTTP Strict Transport Security
Express.js
const helmet = require('helmet');
app.use(helmet.hsts({
maxAge: 31536000,
includeSubDomains: true,
preload: true
}));
Liste de préchargement HSTS
La liste de préchargement HSTS contient des domaines intégrés aux navigateurs et accessibles uniquement via HTTPS. Elle élimine même la vulnérabilité de la première requête HTTP.
Exigences de préchargement
1. Certificat SSL valide
2. Rediriger tout HTTP vers HTTPS
3. En-tête HSTS avec :
- max-age d'au moins 31536000 (1 an)
- la directive includeSubDomains
- la directive preload
Soumission à la liste de préchargement
1. Vérifier les exigences : utiliser hstspreload.org pour vérifier
2. Soumettre le domaine : Entrez le domaine à hstspreload.org
3. Attendre l'inclusion : les mises à jour des navigateurs prennent de plusieurs semaines à plusieurs mois
Avertissements du préchargement
La précharge est permanente (en pratique). Le retrait de la liste prend des mois et nécessite des mises à jour du navigateur. Ne préchargez le domaine que si vous êtes certain que tous les sous-domaines prendront en charge HTTPS indéfiniment.Vérification de HSTS
Outils de développement du navigateur :1. Ouvrir DevTools → onglet réseau
2. Chargez le site
3. Vérifiez les en-têtes de réponse pour la sécurité strict-transport
Utilisation de curl :curl -I https://example.com | grep -i strict
Utilisation de DomScan :
curl "https://domscan.net/v1/health?domain=example.com"
# Reports hasHSTS in security details
État du préchargement :
Vérifiez hstspreload.org pour voir si un domaine est préchargé.
Stratégie de déploiement de HSTS
Phase 1 : durée maximale courte
Commencez par une courte durée max-age pour tester :
Strict-Transport-Security: max-age=300
En cas de problème, le navigateur ne conservera le cache que pendant 5 minutes.
Phase 2 : augmenter la durée
Après avoir confirmé que HTTPS fonctionne partout :
Strict-Transport-Security: max-age=86400
Phase 3 : ajouter les sous-domaines
Une fois que tous les sous-domaines prennent en charge HTTPS :
Strict-Transport-Security: max-age=2592000; includeSubDomains
Phase 4 : déploiement complet et préchargement
Après plusieurs mois de fonctionnement stable :
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
Soumettez ensuite le domaine à la liste de préchargement.
Problèmes courants liés à HSTS
Sous-domaine sans HTTPS : includeSubDomains rend ce sous-domaine inaccessible Environnements de développement : le HSTS mis en cache depuis la production peut empêcher le développement local En-têtes CDN et proxy : vérifier que l'en-tête HSTS n'est pas supprimé par les intermédiaires Contenu mixte : toutes les ressources doivent utiliser HTTPS. HSTS ne corrige pas les ressources HTTP intégréesHSTS est essentiel pour tout site Web traitant des données sensibles et fortement recommandé pour tous les sites HTTPS.