Hoe de HSTS-header van .htaccess alleen op HTTPS in te stellen

Mijn webtoepassing draait op een ander aantal hosts dat ik beheer. Om te voorkomen dat de Apache-configuratie van elke vhost moet worden gewijzigd, voeg ik de meeste configuratie toe met behulp van .htaccess-bestanden in mijn repo, zodat de basisconfiguratie van elke host slechts een paar regels is. Dit maakt het ook mogelijk om de configuratie te wijzigen bij het implementeren van een nieuwe versie. Momenteel stelt de .htaccess (un)set headers in, herschrijft wat magie en controleert de caching van de UA.

Ik wil HSTS inschakelen in de applicatie met .htaccess. Gewoon de koptekst instellen is eenvoudig:

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

Maar in de specificatie staat duidelijk: “Een HSTS-host MOET NIET het STS-headerveld opnemen in HTTP-reacties die via niet-beveiligd transport worden verzonden.”. Dus ik wil de header niet verzenden wanneer deze via HTTP-verbindingen wordt verzonden. Zie https://datatracker.ietf.org /doc/html/draft-ietf-websec-strict-transport-sec-14.

Ik heb geprobeerd de header in te stellen met behulp van omgevingsvariabelen, maar ik liep daar vast. Iemand die weet hoe dat moet?


Antwoord 1, autoriteit 100%

Blijkbaar is er een HTTPS-omgevingsvariabele beschikbaar die gemakkelijk kan worden gebruikt. Voor mensen met dezelfde vraag:

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

Antwoord 2, autoriteit 26%

Om voort te bouwen op het antwoord van nielsr, heb ik het volgende gebruikt in de .htaccess om te voldoen aan de aanbevelingen voor veilige implementatie op https://hstspreload.org die het domein hardcodeert in de Chrome-browser. Houd er rekening mee dat hierdoor HSTS wordt afgedwongen in uw subdomeinen en dat opname in de preload-lijst niet gemakkelijk ongedaan kan worden gemaakt, dus rtfm.

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

Antwoord 3, autoriteit 9%

U kunt dit gebruiken en in uw htaccess-bestand plaatsen om te voldoen aan https://hstspreload.org. zet dit in je .htaccess-bestand.

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

eerst, zal het een omleiding uitvoeren voor niet-https naar https. en stuur niet-www https om naar www https met HSTS-header.

(http://example.com-> https://example.com-> https://www.example.com – met HSTS-header)

Getest en in overeenstemming met https://hstspreload.org


Antwoord 4, autoriteit 3%

Voor httpd.conf(als u toegang heeft om dit te bewerken) kunt u gebruik maken van

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

OPMERKING: je moet het alleen op de HTTPS vhost instellen en niet op http vhost.

Wanneer moet ik wel en niet .htaccess-bestanden gebruiken?

Als u .htaccess-bestanden toestaat, zal Apache ernaar zoeken bij elke toegang tot uw server. Aangezien ook de bovenliggende mappen worden doorzocht, zal dit enige (kleine) tijd in beslag nemen en de prestaties van uw server beïnvloeden.
Bron


Antwoord 5

Nog een ander alternatief is om altijd de header in te stellen en deze voorwaardelijk te verwijderen voor niet-ssl-verbindingen:

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

Dit heeft het voordeel, dat de Header-instructie kan worden gebruikt met zowel de env-voorwaarde als de early-vlag. Met een enkele Header-richtlijn kunnen enven earlyniet samen worden gebruikt, ze sluiten elkaar uit (zie officiële documentatie: https://httpd.apache.org/docs/current/mod/mod_headers.html#header).

Other episodes