web-dev-qa-db-fra.com

Comment définir l'en-tête HSTS à partir de .htaccess uniquement sur HTTPS

Mon application Web s'exécute sur un nombre différent d'hôtes que je contrôle. Pour éviter de devoir modifier la configuration Apache de chaque hôte, j'ajoute l'essentiel de celle-ci à l'aide de fichiers .htaccess dans mon référentiel, de sorte que la configuration de base de chaque hôte ne comporte que quelques lignes. Cela permet également de modifier la configuration lors du déploiement d'une nouvelle version. Actuellement, le .htaccess (un) définit les en-têtes, effectue une réécriture de la magie et contrôle la mise en cache de l'UA.

Je veux activer HSTS dans l'application à l'aide de .htaccess. Il est facile de définir l'en-tête:

Header always set Strict-Transport-Security "max-age=31536000"

Mais la spécification indique clairement: "Un hôte HSTS NE DOIT PAS inclure le champ d'en-tête STS dans les réponses HTTP acheminées via un transport non sécurisé.". Donc, je ne veux pas envoyer l'en-tête lorsque je l'envoie via des connexions HTTP. Voir http://tools.ietf.org/html/draft-ietf-websec-strict-transport-sec-14 .

J'ai essayé de définir l'en-tête à l'aide de vars d'environnement, mais je suis resté bloqué là. Quelqu'un qui sait comment faire ça?

64
nielsr

Apparemment, une variable d’environnement HTTPS est disponible et peut être utilisée facilement. Pour les personnes ayant la même question:

Header set Strict-Transport-Security "max-age=31536000" env=HTTPS
96
nielsr

Pour compléter la réponse de nielsr, j’ai utilisé ce qui suit dans le fichier .htaccess pour respecter les recommandations de déploiement sécurisé disponibles à l’adresse https://hstspreload.org , qui coderont le domaine en code brut dans le navigateur Chrome. Sachez que cela va appliquer le HSTS à vos sous-domaines et que l'inclusion dans la liste de préchargement ne peut pas être facilement annulée, donc rtfm.

<IfModule mod_headers.c>
Header set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" env=HTTPS
</IfModule>
20
LJT

Pour httpd.conf (si vous avez le droit de le modifier), vous pouvez utiliser

<VirtualHost 65.81.122.43:443>
    Header always set Strict-Transport-Security "max-age=31536000; includeSubdomains;"
</VirtualHost>

REMARQUE: vous devez le configurer uniquement sur le HTTPS vhost et ne pouvez pas utiliser http vhost. 

Quand devrais-je et ne devrais-je pas utiliser les fichiers .htaccess?

Autoriser les fichiers .htaccess obligera Apache à les rechercher à chaque accès à votre serveur. Etant donné que la recherche dans les répertoires parents est également effectuée, cela prendra un peu de temps et peut affecter les performances de votre serveur . La source

3
Aniket Thakur

Une autre alternative consiste à toujours définir l’en-tête et à le supprimer conditionnellement pour les connexions non SSL:

Header always set   Strict-Transport-Security "max-age=31536000" early
Header        unset Strict-Transport-Security env=!HTTPS

Cela présente l'avantage que la directive Header peut être utilisée avec la condition env ainsi que l'indicateur early. Avec une seule directive Header, env et early ne peuvent pas être utilisés ensemble, ils s'excluent mutuellement (voir la documentation officielle: https://httpd.Apache.org/docs/current/mod/mod_headers.html#header ).

0
studersi

Vous pouvez utiliser ceci et le mettre sur votre fichier htaccess pour vous conformer à https://hstspreload.org . mettez ceci dans votre fichier .htaccess.

RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ https://%{HTTP_Host}/$1 [R=301,L]

RewriteCond %{HTTP_Host} !^www\.
RewriteRule ^(.*)$ https://www.%{HTTP_Host}/$1 [R=301,L,E=HTTPS:1]
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" env=HTTPS

tout d'abord, il fera la redirection pour https non https. et redirigez les adresses non www https vers www https avec l'en-tête HSTS.

( http://example.com -> https://example.com -> https://www.example.com - avec en-tête HSTS)

Testé et conforme à https://hstspreload.org

0
Yuda Prawira