it-swarm.com.de

Festlegen des HSTS-Headers von .htaccess nur bei HTTPS

Meine Webanwendung wird auf einer anderen Anzahl von Hosts ausgeführt, die ich kontrolliere. Um zu verhindern, dass die Apache-Konfiguration für jeden vhost geändert werden muss, füge ich die meisten configs mithilfe von .htaccess-Dateien in meinem Repo hinzu, sodass die grundlegenden Einstellungen jedes Hosts nur aus ein paar Zeilen bestehen. Dadurch ist es auch möglich, die Konfiguration beim Bereitstellen einer neuen Version zu ändern. Derzeit setzt .htaccess (un) Header, schreibt etwas Magie und steuert das Caching der UA.

Ich möchte HSTS in der Anwendung mit .htaccess aktivieren. Das Einstellen der Kopfzeile ist einfach:

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

Die Spezifikation besagt jedoch eindeutig: "Ein HSTS-Host darf das STS-Headerfeld NICHT in HTTP-Antworten enthalten, die über einen nicht sicheren Transport übermittelt werden." Daher möchte ich den Header nicht senden, wenn er über HTTP-Verbindungen gesendet wird. Siehe http://tools.ietf.org/html/draft-ietf-websec-strict-transport-sec-14 .

Ich habe versucht, den Header mit Umgebungsvariablen zu setzen, aber ich blieb dort hängen. Wer weiß, wie das geht?

64
nielsr

Offenbar gibt es eine HTTPS-Umgebungsvariable, die einfach verwendet werden kann. Für Leute mit der gleichen Frage:

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

Um auf die Antwort von nielsr aufzubauen, habe ich in .htaccess Folgendes verwendet, um die Empfehlungen für die sichere Bereitstellung unter https://hstspreload.org zu erfüllen, wodurch die Domäne im Chrome-Browser fest codiert wird. Beachten Sie, dass dadurch HSTS in Ihren Subdomains erzwungen wird und dass die Aufnahme in die Preload-Liste nicht ohne weiteres rückgängig gemacht werden kann, so rtfm.

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

Für httpd.conf (falls Sie Zugriff zum Bearbeiten haben) können Sie verwenden

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

ANMERKUNG: Sie müssen es nur auf dem HTTPS-vhost festlegen und dürfen sich nicht auf http vhost befinden. 

Wann sollte und sollte ich keine .htaccess-Dateien verwenden?

Wenn Sie .htaccess-Dateien zulassen, sucht Apache bei jedem Zugriff auf Ihren Server nach ihnen. Da auch übergeordnete Verzeichnisse durchsucht werden, dauert dies einige Zeit und kann sich auf die Leistung Ihres Servers auswirken. Quelle

3
Aniket Thakur

Eine weitere Alternative besteht darin, den Header immer festzulegen und ihn für Nicht-SSL-Verbindungen bedingt zu entfernen:

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

Dies hat den Vorteil, dass die Header-Direktive sowohl mit der env-Bedingung als auch mit dem early-Flag verwendet werden kann. Mit einer einzigen Header-Direktive können env und early nicht zusammen verwendet werden. Sie schließen sich gegenseitig aus (siehe offizielle Dokumentation: https://httpd.Apache.org/docs/current/mod/mod_headers.html#header ).

0
studersi

Sie können dies verwenden und in Ihre htaccess-Datei einfügen, um https://hstspreload.org zu erfüllen. Fügen Sie dies in Ihre .htaccess-Datei ein.

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

zunächst wird die Umleitung von Nicht-https zu https durchgeführt. und leiten Sie Nicht-WWW-HTTPS mit HSTS-Header zu WWW-HTTPS um.

( http://example.com -> https://example.com -> https://www.example.com - mit HSTS-Header)

Getestet und konform mit https://hstspreload.org

0
Yuda Prawira