Dans cet article, nous aborderons HTTP Strict Transport Security dans une perspective complète et détaillée, afin de fournir à nos lecteurs une vision complète et enrichissante sur ce sujet. Dans cette optique, nous explorerons différentes facettes, études et opinions liées à HTTP Strict Transport Security, dans le but de proposer une analyse globale et actualisée. De son origine à son évolution actuelle, en passant par son impact sur la société et sa pertinence dans différents domaines, cet article se veut une source de connaissances enrichissante pour tous ceux qui souhaitent entrer dans le monde de HTTP Strict Transport Security.
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 informatique uniquement de façon sécurisée.
Lorsque la politique HSTS est active pour un site web, l'agent utilisateur compatible opère comme suit :
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.
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"
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 (en) https://hstspreload.org/ pour demander leur inclusion dans cette liste. La présence du paramètre preload permet de s'assurer de leur consentement.
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 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 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 31536000 secondes (soit 365 jours) 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.
# load module (example using )
LoadModule headers_module modules/mod_headers.so
# redirect all HTTP to HTTPS (optional)
<VirtualHost *:80>
ServerAlias *
RewriteEngine On
RewriteRule ^(.*)$ https://%{HTTP_HOST}$1
</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>
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 == "https" {
setenv.add-response-header = ( "Strict-Transport-Security" => "max-age=31536000; includeSubDomains; preload")
}
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;";
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";
}
// Avec l' utilisation du paquet NPM helmet.
var helmet = require('helmet')
...
app.use(helmet.hsts({
maxAge: 31536000000,
includeSubdomains: true,
force: true
}));
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>
// 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) && $_SERVER != 'off') {
header('Strict-Transport-Security: max-age=31536000; includeSubDomains; preload');
} elseif ($use_sts) {
header('Location: https://'.$_SERVER.$_SERVER, true, 301);
// we are in cleartext at the moment, prevent further execution and output
die();
}
# 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);
}
config.force_ssl = true
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
//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
}
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>
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);
}
}
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
Créer une iRule et l'appliquer à votre Virtual Server 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"
}
Ajouter cette ligne dans la partie frontend 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;
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
}