Jak ustawić nagłówek HSTS z .htaccess tylko na HTTPS [zamknięte]

82

Moja aplikacja internetowa działa na różnej liczbie hostów, które kontroluję. Aby zapobiec konieczności zmiany konfiguracji Apache każdego vhosta, dodaję większość konfiguracji za pomocą plików .htaccess w moim repozytorium, więc podstawowa konfiguracja każdego hosta to tylko kilka wierszy. Umożliwia to również zmianę konfiguracji po wdrożeniu nowej wersji. Obecnie .htaccess (un) ustawia nagłówki, przepisuje magię i kontroluje buforowanie UA.

Chcę włączyć HSTS w aplikacji za pomocą .htaccess. Samo ustawienie nagłówka jest łatwe:

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

Jednak specyfikacja wyraźnie stwierdza: „Host HSTS NIE MOŻE zawierać pola nagłówka STS w odpowiedziach HTTP przekazywanych za pośrednictwem niezabezpieczonego transportu”. Dlatego nie chcę wysyłać nagłówka podczas wysyłania go przez połączenia HTTP. Zobacz http://tools.ietf.org/html/draft-ietf-websec-strict-transport-sec-14 .

Próbowałem ustawić nagłówek za pomocą zmiennych środowiskowych, ale utknąłem tam. Każdy, kto wie, jak to zrobić?

nielsr
źródło
Stack Overflow to witryna zawierająca pytania dotyczące programowania i programowania. To pytanie wydaje się być niezwiązane z tematem, ponieważ nie dotyczy programowania ani programowania. Zobacz, o jakie tematy mogę zapytać w Centrum pomocy. Być może lepszym miejscem do zadawania pytań będzie Super User lub Unix & Linux Stack Exchange . Zobacz też Gdzie mogę zadawać pytania dotyczące operacji deweloperskich?
jww
6
@jww Pliki .htaccess są częścią mojego repozytorium aplikacji internetowych i są utrzymywane przez programistów, aby uzyskać pożądane zachowanie aplikacji (np. buforowanie, przepisywanie adresów URL i ustawianie odpowiednich nagłówków). Pytanie jest wyświetlane prawie 20 000 razy tutaj na SO (dostępne są tagi [apache], [.htaccess] i [mod-headers]). Więc nie sądzę, żeby to było tu nie na temat.
nielsr
1
„Pliki .htaccess są częścią mojego repozytorium aplikacji internetowych i są utrzymywane przez programistów…” - Nie są też kryteriami włączenia do Stack Overflow. Dobry test wąchania to, czy możesz pokazać swój kod? W tym przypadku odpowiedź brzmi NIE. Po zbadaniu, to tylko pytanie dotyczące konfiguracji Apache. „Pytanie jest oglądane prawie 20 000 razy…” - Stack Overflow to wysypisko śmieci. Zadawane jest tutaj pytanie niezwiązane z tematem, a następnie jest indeksowane przez wyszukiwarkę. Inne przykłady tego zjawiska obejmują przesyłanie plików przez SSH . Programiści również czasami używają SSH.
jww

Odpowiedzi:

113

Najwyraźniej dostępna jest zmienna środowiskowa HTTPS, której można łatwo użyć. Dla osób z tym samym pytaniem:

Header set Strict-Transport-Security "max-age=31536000" env=HTTPS
nielsr
źródło
2
w jakim pliku jest to ustawienie?
ted.strauss
7
@ ted.strauss będzie w .htaccesspliku.
zen
Z jakiegoś powodu to nie działa na moim serwerze. Apache 2.4
Andy
14
Dla mnie też nie działało; jednak dołączanie "expr=%{HTTPS} == 'on'"zadziałało. A więc cała linia jest Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" "expr=%{HTTPS} == 'on'". Może to dlatego, że alwayssłowo kluczowe?
Adrian Föder
3
Zauważ, że HTTPS zmienna env w warunku env=HTTPSróżni się od zmiennej serwera , którą często widzimy w warunkach mod_rewrite (i wyrażeniu Apache) jako %{HTTPS}. Ponieważ jest to zmienna env , zależy od środowiska, tj. konfiguracja serwera. Czasami nigdy nie jest ustawiony. Czasami jest przypisywana ta sama wartość co HTTPSzmienna serwera (więc zawsze jest ustawiona na „wyłączone” lub „włączone” - a warunek env=HTTPSjest zawsze prawdziwy! Po env=HTTPSprostu sprawdza, czy zmienna env jest ustawiona, a nie, że jest włączona .) Używanie wyrażenia Apache, jak sugeruje @ AdrianFöder, jest zalecane w Apache 2.4+
MrWhite Stycznia
29

Opierając się na odpowiedzi nielsr, użyłem następujących elementów w .htaccess, aby spełnić zalecenia dotyczące bezpiecznego wdrażania na https://hstspreload.org, które zakodują domenę na stałe w przeglądarce Chrome. Należy pamiętać, że spowoduje to wymuszenie HSTS we wszystkich subdomenach, a uwzględnienia na liście wstępnego ładowania nie można łatwo cofnąć, więc rtfm.

<IfModule mod_headers.c>
Header set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" env=HTTPS
</IfModule>
LJT
źródło
6
Jest to trochę bezpieczniejsze, tak - jeśli zamierzasz używać HTTPS tylko w całej domenie. Jeśli nie, jest to niezwykle niebezpieczne - więc nieodpowiedzialne jest sugerowanie tego bez ostrzeżenia. Załóżmy, że Twój serwer internetowy odpowiada tym nagłówkiem na żądanie w domenie najwyższego poziomu (example.com) - wtedy, gdy uwzględniasz subdomeny, każda inna subdomena obsługiwana przez inny serwer sieciowy tylko przez http, a nie https (np. Intranet.example.com) , nie będzie działać. Dołączenie tagu wstępnego ładowania umożliwia również przesłanie go do listy wstępnego ładowania, dzięki czemu jest on zakodowany na stałe w przeglądarkach internetowych, a następnie jest nieodwracalny.
Barry Pollard
Minęło kilka lat, więc pragnę tylko zauważyć, że Twój fragment jest nadal skuteczny na dzień dzisiejszy.
KGIII
6

Możesz tego użyć i umieścić go w swoim pliku htaccess, aby zachować zgodność z https://hstspreload.org . umieść to w swoim pliku .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

po pierwsze, przekieruje z połączeń innych niż https do https. i przekierowuj inny niż www https do www https z nagłówkiem HSTS.

( http://example.com -> https://example.com -> https://www.example.com - z nagłówkiem HSTS)

Przetestowane i zgodne z https://hstspreload.org

Yuda Prawira
źródło
4

Dla httpd.conf(jeśli masz dostęp do edytowania tej) można użyć

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

UWAGA: Musisz ustawić go tylko na HTTPS vhost i nie może być na http vhost.

Kiedy powinienem, a kiedy nie używać plików .htaccess?

Zezwolenie na pliki .htaccess sprawi, że Apache będzie ich szukał przy każdym dostępie do twojego serwera. Ponieważ przeszukiwane są również katalogi nadrzędne, zajmie to trochę (niewielką) ilość czasu i może wpłynąć na wydajność serwera. Źródło

Aniket Thakur
źródło
Apache zawsze będzie szukał plików .htaccess. Więc jeśli nie wyłączysz wyszukiwania .htaccess, nie poprawi to wydajności, ponieważ Apache i tak sprawdzi plik.
Rudy Broersma
1

Jeszcze inną alternatywą jest zawsze ustawianie nagłówka i warunkowe usuwanie go w przypadku połączeń innych niż SSL:

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

Ma to tę zaletę, że Headerdyrektywy można używać zarówno z envwarunkiem, jak i earlyflagą. Dzięki jednej Headerdyrektywie envi earlynie można ich używać razem, wykluczają się one wzajemnie (patrz oficjalna dokumentacja: https://httpd.apache.org/docs/current/mod/mod_headers.html#header ).

studersi
źródło