Principe et implémentation de HSTS (HTTP Strict Transport Security)

HTTPS est devenu quasiment obligatoire sur tous les sites web et particulièrement sur ceux contenant des formulaires. Même si ce n’est pour le moment qu’une indication non bloquante, Firefox émet une erreur lors de la visite d’une page non sécurisée contenant des formulaires (en savoir plus).

Warning Firefox formulaire HTTP

Pour rappel, la mise en place du protocole HTTPS est maintenant facilitée par l’initiative Let’s Encrypt.

Problématique

Traditionnellement, sur un site web implémentant HTTPS, un utilisateur qui souhaite accéder à la version HTTP est redirigé via une HTTP 301 sur la version HTTPS :

Redirection HTTP vers HTTPS avec HTTP 301

Par exemple sur LinkedIn :

Redirection HTTP vers HTTPS Linkedin

Ce scenario sera répété à chaque fois que l’utilisateur tente d’accéder au site web en utilisant le protocole HTTP.

Le problème avec ce mécanisme de redirection c’est que la première requête sur http://monsite.com est transmise en clair sur le réseau. On imagine qu’elle peut contenir des cookies sans le flag “secure”, des données de formulaires, etc. Toutes ces données peuvent être interceptées par une attaque de type “Man in the middle”.

Pour éviter cet aller/retour, il faut indiquer au navigateur que le site souhaité doit être accédé en HTTPS et qu’il doit donc remplacer le HTTP par le HTTPS.

Implémentation

Pour avertir le navigateur que le site doit être utilisé en HTTPS, il faut rajouter le header “Strict-Transport-Security” dans les réponses HTTP renvoyées par le site web.

hsts_header

Ce header dispose de plusieurs paramètres :

  • max-age (obligatoire) : durée pendant laquelle le navigateur va accéder au site web uniquement en HTTPS. La valeur conseillée étant généralement de 1an (31536000s).
  • includeSubDomains (facultatif) : permet d’appliquer HSTS aux sous-domaines * preload (facultatif) : permet d’être ajouté à la liste de preloading

Le scenario est donc maintenant le suivant :

Scenario HSTS

Grâce à ce mécanisme, seul le premier accès au site web contient un aller/retour en HTTP. Tout le reste se fait en HTTPS. Afin d’éliminer ce dernier échange non sécurisé, nous allons utiliser le preloading.

Les navigateurs Chrome, Firefox, IE et Edge intègre une liste de sites web implémentant HSTS. Ils savent donc que ces sites web doivent être accédés uniquement en HTTPS. Pour s’inscrire sur cette liste, il faut se rendre sur la page mise à disposition par l’équipe Chromium : https://hstspreload.appspot.com.

Certains pré-requis doivent être satisfaits pour être éligible :

  • Avoir un certificat valide
  • Rediriger le HTTP vers le HTTPS (comme décrit ci-dessus)
    • Tous les sous-domaines doivent être en HTTPS
  • Le sous-domaine www doit exister * Avoir le header HSTS (comme décrit ci-dessus) avec les paramètres “includeSubDomains” et “preload”.

Une fois inscrit, il faut attendre la mise à jour de chaque navigateur. Une fois chargé dans les différents navigateurs, le scenario est le suivant :

HSTS avec preload

Compatibilité

HSTS est supporté par les derniers navigateurs (http://caniuse.com/#feat=stricttransportsecurity):

Compatibilité HSTS

Sur les navigateurs ne supportant par HSTS, le header est simplement ignoré.

Vérification

Pour vérifier que le site web dispose d’un header HSTS valide et qu’il est bien préloadé dans les différents navigateurs, il est possible d’utiliser des outils en ligne comme https://www.ssllabs.com.

Vérification HSTS

Liens utiles


Voir également