(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é « ». La politique spécifie une période de temps durant laquelle l'agent utilisateur doit accéder au serveur informatique uniquement de façon sécurisée.
Généralités
Lorsque la politique HSTS est active pour un site web, l'agent utilisateur compatible opère comme suit :
Il 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. Si la sécurité de la connexion ne peut être assurée (par exemple, le certificat TLS est autosigné), 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 ne peut pas intercepter de requête tant que le HSTS est actif pour ce site.
Syntaxe
Activer HSTS pour un an : Strict-Transport-Security "max-age=31536000"
L'activer aussi pour les sous-domaines : Strict-Transport-Security "max-age=31536000; includeSubDomains"
Autoriser aussi l'ajout du site dans les listes préchargées : Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
Bonnes pratiques
HSTS doit être déclaré sur le domaine. Par exemple, https://sub.example.com doit aussi utiliser HSTS sur https://example.com. Les pages de https://www.example.com devraient inclure une requête vers une ressource sur https://example.com pour s'assurer que le domaine principal est protégé. Avec la directive , cela permet de protéger l'intégralité des sous-domaines.
Liste préchargée
HSTS ne protège qu'après la première connexion. Afin de corriger ce défaut, les navigateurs proposent un mécanisme de préchargement : les sites peuvent s'enregistrer sur le site web pour demander leur inclusion dans cette liste. La présence du paramètre permet de s'assurer de leur consentement.
Support Navigateurs supportant HSTS Google Chrome et Chromium https://dev.chromium.org/sts supportent HSTS depuis la version 4.0.211.0. Le support de HSTS est activé dans les sources de Firefox depuis le , il est disponible depuis Firefox 4.0... 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.. L'extension pour Firefox « NoScript » impose HSTS depuis la version 1.9.8.9. L'extension pour Chrome/Firefox/Opera « HTTPS Everywhere », dérivée 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) https://www.eff.org/https-everywhere sur le site de l'Electronic Frontier Foundation. Opera 12.. Internet Explorer 11..
Implémentation Les en-têtes doivent être envoyés via des réponses HTTPS. L'implémentation du côté client ne doit pas respecter les en-têtes HSTS 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 TLS et les exemples de codes ne doivent être effectués que dans un contexte de réponses HTTPS.
Le temps maximum () est donné en secondes. Les (soit ) 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
# load module (example using [RHEL]) LoadModule headers_module modules/mod_headers.so
# redirect all HTTP to HTTPS (optional) <VirtualHost *:80> ServerAlias * RewriteEngine On RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [redirect=301] </VirtualHost>
# HTTPS-Host-Configuration <VirtualHost 10.0.0.1:443> # Use HTTP Strict Transport Security to force client to use secure connections only Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
# Further Configuration goes here [...] </VirtualHost>
Implémentation lighttpd Cette implémentation du protocole est partielle et ne propose pas la redirection à partir d'un environnement non sécurisé.server.modules += ( "mod_setenv" ) $HTTP["scheme"] == "https" { setenv.add-response-header = ( "Strict-Transport-Security" => "max-age=31536000; includeSubDomains; preload") }
Implémentation nginx Cette implémentation du protocole est partielle et ne propose pas la redirection à partir d'un environnement non sécurisé.# Use HTTP Strict Transport Security to force client to use secure connections only add_header Strict-Transport-Security max-age=31536000;Cette implémentation du protocole est partielle et ne propose pas la redirection à partir d'un environnement non sécurisé.# Use HTTP Strict Transport Security to force client to use secure connections only with includeSubdomains add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload;";
Implémentation Varnish Cette implémentation du protocole est partielle et ne propose pas la redirection à partir d'un environnement non sécurisé.// Add the following line to your vcl_deliver // Note: Varnish MUST be used with a frontend TLS proxy (e.g Hitch) for SSL/TLS support
sub vcl_deliver { set resp.http.Strict-Transport-Security = "max-age=31536000; includeSubDomains"; }
Implémentation NodeJS
// Avec l' utilisation du paquet NPM helmet. var helmet = require('helmet') ... app.use(helmet.hsts({ maxAge: 31536000000, includeSubdomains: true, force: true }));
Implémentation IIS
L'en-tête peut être ajouté en modifiant le fichier web.config.
Cette implémentation du protocole est partielle et ne propose pas la redirection à partir d'un environnement non sécurisé.
<configuration> <system.webServer> <httpProtocol> <customHeaders> <add name="Strict-Transport-Security" value="max-age=31536000"/> </customHeaders> </httpProtocol> </system.webServer> </configuration>
Implémentation PHP
// Use HTTP Strict Transport Security to force client to use secure connections only $use_sts = true;
// iis sets HTTPS to 'off' for non-SSL requests if ($use_sts && isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') { header('Strict-Transport-Security: max-age=31536000; includeSubDomains; preload'); } elseif ($use_sts) { header('Location: https://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'], true, 301); // we are in cleartext at the moment, prevent further execution and output die(); }
Implémentation Perl
# Use HTTP Strict Transport Security to force client to use secure connections only use CGI; use URI;
my $q = new CGI; my $url = URI->new($cgi->request_uri) my $use_sts = 1;
if ($use_sts and $url->scheme eq 'https') { print $q->header('Strict-Transport-Security' => 'max-age=31536000; includeSubDomains; preload'); } elsif ($use_sts) { $url->scheme('https'); print $q->redirect(status => 301, location => $url); }
Implémentation Ruby on Rails config.force_ssl = true
Implémentation ASP
Dim use_sts use_sts = True
If use_sts = True And Request.Url.Scheme = "https" Then Response.AddHeader "Strict-Transport-Security","max-age=31536000" 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 ASP.NET Core
//Startup.cs
public void ConfigureServices(IServiceCollection services) { services.AddHsts(opts =>
opts.MaxAge = TimeSpan.FromSeconds(31536000);
// Activer pour les sous-domaines, et autoriser l'ajout du site dans les listes préchargées opts.IncludeSubDomains = true; opts.Preload = true; });
// Configuration des autres services }
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (!env.IsDevelopment())
app.UseHsts();
app.UseHttpsRedirection();
// Configuration de l'application }
Implémentation ColdFusion Markup Language (CFML) Cette implémentation du protocole est partielle et ne propose pas la redirection à partir d'un environnement non sécurisé.<cfset use_sts = true>
<cfif use_sts is "True"> <cfheader name="Strict-Transport-Security" value="max-age=31536000"> <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)
use_sts = true;
if(use_sts) { if(request.getScheme().equals("https")) { // Envoi de l'en-tête HSTS response.setHeader("Strict-Transport-Security", "max-age=31536000"); } else { response.setStatus(301); url = "https://" + request.getServerName() + request.getPathInfo() + request.getQueryString(); response.setHeader("Location", url);
Implémentation Visual Basic .NET Cette implémentation du protocole est partielle et ne propose pas la redirection à partir d'un environnement non sécurisé.Dim use_sts As Boolean = True
If use_sts = True Then Response.AppendHeader("Strict-Transport-Security", "max-age=31536000") ElseIf use_sts = True Then Response.AppendHeader("Status-Code", "301") Response.AppendHeader("Location", "https://") End If
Implémentation F5 BIG-IP LTM
Créer une iRule et l'appliquer à votre HTTPS.
Cette implémentation du protocole est partielle et ne propose pas la redirection à partir d'un environnement non sécurisé. # iRule "Insert_HTTP_Strict_Transport_Security"
when HTTP_RESPONSE { HTTP::header insert Strict-Transport-Security "max-age=31536000 ; includeSubDomains ; preload" }
Implémentation HAProxy Ajouter cette ligne dans la partie HTTPS du fichier de configuration.
Cette implémentation du protocole est partielle et ne propose pas la redirection à partir d'un environnement non sécurisé.http-response set-header Strict-Transport-Security max-age=31536000;\ includeSubDomains;\ preload;
Implémentation OpenBSD httpd
server "example.com" { listen on 10.0.0.1 port 80 block return 301 "https://$HTTP_HOST$REQUEST_URI" }
server "example.com" { listen on 10.0.0.1 tls port 443
hsts max-age 31536000 hsts subdomain hsts preload
# Further Configuration goes here }
Notes et références
Liens externes RFC 6797 RFC 6797: HTTP Strict Transport Security (HSTS) sur le site de Stéphane Bortzmeyer
Catégorie:Hypertext Transfer Protocol
de:Hypertext Transfer Protocol Secure#HSTS