HTTP Strict Transport Security

Un article de Wikipédia, l'encyclopédie libre.
Aller à : navigation, rechercher

HTTP Strict Transport Security (HSTS) est un mécanisme de politique de sécurité proposé pour HTTP, permettant à un serveur web de déclarer à un agent utilisateur (comme un navigateur web), compatible, qu'il doit interagir avec lui en utilisant une connexion sécurisée (comme HTTPS). La politique est donc communiquée à l'agent utilisateur par le serveur via la réponse HTTP, dans le champ d'en-tête nommé « Strict-Transport-Security ». La politique spécifie une période de temps durant laquelle l'agent utilisateur doit accéder au serveur uniquement de façon sécurisée.

Généralités[modifier | modifier le code]

Lorsque la politique HSTS est active pour un site web, l'agent utilisateur compatible opère comme suit :

  1. Remplace automatiquement tous les liens non sécurisés par des liens sécurisés. Par exemple, http://www.exemple.com/une/page/ est automatiquement remplacé par https://www.exemple.com/une/page/ avant d'accéder au serveur.
  2. Si la sécurité de la connexion ne peut être assurée (par exemple, le certificat TLS est auto-signé), celui-ci affiche un message d'erreur et interdit à l'utilisateur l'accès au site à cause de cette erreur.

La politique HSTS aide à protéger les utilisateurs de sites web contre quelques attaques réseau passives (écoute clandestine) et actives. Une attaque du type man-in-the-middle ne peut pas intercepter de requête tant que le HSTS est actif pour ce site.

Support[modifier | modifier le code]

Navigateurs supportant HSTS[modifier | modifier le code]

  • Google Chrome et Chromium[1] supporte HSTS depuis la version 4.0.211.0.
  • Le support de HSTS est activé dans les sources de Firefox depuis le 25 août 2010, il est disponible depuis Firefox 4.0[2],[3]. La version 17 du navigateur possède en interne, une liste prédéfinie de sites web dont la connexion devra se faire en HSTS, ceci afin d'éviter un détournement lors de la première connexion où le navigateur ignore si le site demandera HSTS ou pas[4].
  • L'extension pour Firefox « NoScript » impose HSTS depuis la version 1.9.8.9
  • L'extension pour Firefox « HTTPS Everywhere », dérivé de NoScript, généralise le concept de HSTS en incluant des sous-ensembles de chemins pour certains domaines, et réécrit les URI non-sécurisées http:// d'un domaine en URI https:// d'un domaine relatif (Par exemple, de http://en.wikipedia.org à https://en.wikipedia.org)[5].
  • Opera 12[6]

Implémentation[modifier | modifier le code]

Les en-têtes Strict-Transport-Security doivent être envoyés via des réponses HTTPS. L'implémentation du côté client ne doit pas respecter les en-têtes STS qui ne sont pas envoyées via des réponses HTTPS, ou par le biais de réponses HTTPS qui ne sont pas configurées proprement, et sans certificat de confiance. Les bribes de configuration de serveur suivantes doivent être effectuées dans un contexte de bloc de configuration d'un site SSL, et les exemples de codes ne doivent être effectués que dans un contexte de réponses HTTPS.

Le temps maximum (max-age) est donné en secondes. Les 500 secondes dans les exemples ci-dessous peuvent être remplacées par des valeurs plus grandes ou petites en fonction des besoins du gestionnaire du serveur web.

Implémentation Apache[modifier | modifier le code]

Header set Strict-Transport-Security "max-age=500"
Header append Strict-Transport-Security includeSubDomains

Implémentation Lighttpd[modifier | modifier le code]

server.modules += ( "mod_setenv" )
$HTTP["scheme"] == "https" {
    setenv.add-response-header  = ( "Strict-Transport-Security" => "max-age=31536000")
}

Implémentation Nginx[modifier | modifier le code]

add_header Strict-Transport-Security max-age=500;

Implémentation IIS[modifier | modifier le code]

Le module STSModule[7]. peut-être installé afin d'ajouter l'en-tête STS.

<system.web>
  <httpModules>
    <add name="STSModule" type="STSModule.STSServerModule"/>
  </httpModules>
</system.web>
<configuration>
  <configSections>
    <sectionGroup name="stsModuleSection">
      <section name="stsModule" type="STSModule.StrictTransportSecuritySection"/>
    </sectionGroup>
  </configSections>
</configuration>

Implémentation PHP[modifier | modifier le code]

$use_sts = true;
 
// iis sets HTTPS to 'off' for non-SSL requests
if ($use_sts) {
    if (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') {
        header('Strict-Transport-Security: max-age=500');
    } else {
        header('Status-Code: 301');
        header('Location: https://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']);
        exit;
    }
}

Implémentation Perl[modifier | modifier le code]

use CGI;
 
$q = new CGI;
$use_sts = true;
 
if ($use_sts == true) {
    print $q->header('Strict-Transport-Security' => 'max-age=500'); 
} elsif ($use_sts == true) {
    header('Status-Code: 301');
    $url = 'https://'.$ENV{'SERVER_NAME'}.$ENV{'PATH_INFO'}.$ENV{'QUERY_STRING'}
    print $q->redirect(status => '301 Moved Permanently', location => $url);
}

Implémentation Ruby on Rails[modifier | modifier le code]

use_sts = true;
 
if use_sts == true
    @response.headers['Strict-Transport-Security'], 'max-age=500'
if use_sts == true
    head :moved_permanently, :location => "https://" + request.env["SERVER_ADDR"] + request.env["REQUEST_URI"]

Implémentation ASP[modifier | modifier le code]

Dim use_sts
use_sts = True
 
If use_sts = True And Request.Url.Scheme = "https" Then
    Response.AddHeader "Strict-Transport-Security","max-age=500"
ElseIf use_sts = True And Request.Url.Scheme = "http" Then
    Response.Status="301 Moved Permanently"
    Response.AddHeader "Location", "https://" + Request.Url.Host + Request.Url.PathAndQuery
End If

Implémentation ColdFusion Markup Language (CFML)[modifier | modifier le code]

<cfset use_sts = true>
 
<cfif use_sts is "True"> 
  <cfheader name="Strict-Transport-Security" value="max-age=500">
<cfelseif use_sts is "True"> 
  <cfheader statuscode="301" statustext="Moved permanently">
  <cfheader name="Location" value="https://" + CGI.SERVER_NAME + CGI.SCRIPT_NAME + CGI.QUERY_STRING>
</cfif>

Implémentation JavaServer Pages (JSP)[modifier | modifier le code]

use_sts = true;
 
if(use_sts == true) {
  if(request.getScheme().equals("https")) {
    // Envoi de l'en-tête HSTS
    response.setHeader("Strict-Transport-Security", "max-age=500");
  } else {
    response.setStatus(301);
    url = "https://" + request.getServerName() + request.getPathInfo() + request.getQueryString();
    response.setHeader("Location", url);
  }
}

Implémentation Visual Basic .NET[modifier | modifier le code]

Dim use_sts As Boolean = True
 
If use_sts = True Then
    Response.AppendHeader("Strict-Transport-Security", "max-age=500")
ElseIf use_sts = True Then
    Response.AppendHeader("Status-Code", "301")
    Response.AppendHeader("Location", "https://")
End If

Notes et références[modifier | modifier le code]

  1. (en) http://dev.chromium.org/sts
  2. http://linuxfr.org/news/hsts-arrive-dans-firefox-4
  3. https://blog.mozilla.org/security/2010/08/27/http-strict-transport-security/
  4. https://blog.mozilla.org/security/2012/11/01/preloading-hsts/
  5. (en) https://www.eff.org/https-everywhere sur le site de l'Electronic Frontier Foundation
  6. http://www.opera.com/docs/specs/presto2.10/#m210-244
  7. (en) http://blogs.msdn.com/b/sfaust/archive/2010/05/12/strict-transport-security-asp-net-module.aspx

Liens externes[modifier | modifier le code]