Jak najlepiej włączyć HTTP Strict Transport Security na serwerze sieci Web IIS 7?
Czy mogę po prostu przez GUI i dodać odpowiedni nagłówek odpowiedzi HTTP, czy powinienem używać appcmd, a jeśli tak, jakie przełączniki?
Jak najlepiej włączyć HTTP Strict Transport Security na serwerze sieci Web IIS 7?
Czy mogę po prostu przez GUI i dodać odpowiedni nagłówek odpowiedzi HTTP, czy powinienem używać appcmd, a jeśli tak, jakie przełączniki?
Odpowiedzi:
IIS ma możliwość dodawania niestandardowych nagłówków do odpowiedzi . Wydaje się, że jest to najłatwiejszy sposób.
Zgodnie z dokumentacją na stronie IIS.net można dodać te nagłówki za pomocą Menedżera IIS:
- W okienku Połączenia przejdź do witryny, aplikacji lub katalogu, dla którego chcesz ustawić niestandardowy nagłówek HTTP.
- W okienku głównym kliknij dwukrotnie Nagłówki odpowiedzi HTTP.
- W panelu Nagłówki odpowiedzi HTTP kliknij Dodaj ... w okienku Akcje.
- W oknie dialogowym Dodawanie niestandardowego nagłówka odpowiedzi HTTP ustaw nazwę i wartość niestandardowego nagłówka, a następnie kliknij przycisk OK.
Dzięki temu możemy obsłużyć zarówno przekierowanie HTTP, jak i dodać nagłówek Strict-Transport-Security do odpowiedzi HTTPS za pomocą pojedynczej witryny IIS (moduł Rewrite URL musi być zainstalowany):
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="HTTP to HTTPS redirect" stopProcessing="true">
<match url=".*" />
<conditions>
<add input="{HTTPS}" pattern="off" ignoreCase="true" />
</conditions>
<action type="Redirect" url="https://{HTTP_HOST}{REQUEST_URI}"
redirectType="Permanent" />
</rule>
</rules>
<outboundRules>
<rule name="Add Strict-Transport-Security when HTTPS" enabled="true">
<match serverVariable="RESPONSE_Strict_Transport_Security"
pattern=".*" />
<conditions>
<add input="{HTTPS}" pattern="on" ignoreCase="true" />
</conditions>
<action type="Rewrite" value="max-age=31536000; includeSubDomains; preload" />
</rule>
</outboundRules>
</rewrite>
</system.webServer>
</configuration>
<action type="Rewrite" value="max-age=31536000 ;includeSubDomains; preload" />
uzyskać przepustkę na hstspreload.org
https://somedomain.com/https://somedomain.com/relatedpath
a wynik jest taki, że ścieżka została porzucona.
Aby uzupełnić odpowiedź voretaq7 , możesz to zrobić również za pomocą pliku Web.config (Uwaga: do użytku tylko w witrynach SSL, ponieważ doda nagłówek dla odpowiedzi HTTP i HTTPS, co jest niezgodne ze specyfikacją RFC 6797, zobacz wyjaśnienie poniżej) - dodaj blok w następujący sposób:
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Strict-Transport-Security" value="max-age=31536000"/>
</customHeaders>
</httpProtocol>
</system.webServer>
Oczywiście możesz mieć już system.webServer
blok w pliku Web.config, więc dodaj to do tego, jeśli tak. Wolimy obsługę rzeczy w Web.config niż w GUI, ponieważ oznacza to, że zmiany konfiguracji mogą zostać zatwierdzone w naszym repozytorium Git.
Jeśli chcesz obsłużyć przekierowanie HTTP na SSL, jak wspomniał Greg Askew , możesz łatwiej to zrobić z osobną witryną w IIS. W ten sposób radzimy sobie z wymaganiem protokołu SSL w przypadku niektórych witryn klienckich. Ta witryna zawiera tylko przekierowanie HTTP i niektóre poprawki ujawniania informacji , wszystko w pliku Web.config:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.web>
<httpRuntime requestValidationMode="2.0" enableVersionHeader="false" />
</system.web>
<system.webServer>
<httpRedirect enabled="true" destination="https://www.domain.co.uk/"
httpResponseStatus="Permanent" />
<httpProtocol>
<customHeaders>
<remove name="X-Powered-By" />
</customHeaders>
</httpProtocol>
<rewrite>
<outboundRules>
<rule name="Remove RESPONSE_Server">
<match serverVariable="RESPONSE_Server" pattern=".+" />
<action type="Rewrite" value="" />
</rule>
</outboundRules>
</rewrite>
</system.webServer>
</configuration>
Jest to nasze preferowane rozwiązanie z kilku powodów - możemy łatwo rejestrować przekierowany ruch osobno (ponieważ znajduje się w innym dzienniku IIS), nie wymaga więcej kodu w Global.asax.cs (nie mamy żadnego kodu tam, co jest nieco wygodniejsze dla witryny Umbraco) i, co ważne, oznacza to, że cała konfiguracja jest nadal przechowywana w naszym repozytorium GIT.
Edytowane w celu dodania: Aby było jasne, aby zachować zgodność z RFC 6797 , NIE WOLNO dodawać Strict-Transport-Security
niestandardowego nagłówka do żądań wysyłanych przez niezaszyfrowany HTTP. Aby być zgodnym z RFC6797, MUSISZ mieć dwie witryny w IIS, jak opisałem po pierwszym bloku kodu. Jak podkreśla Chris , RFC 6797 obejmuje:
Host HSTS NIE MOŻE zawierać pola nagłówka STS w odpowiedziach HTTP przesyłanych niezabezpieczonym transportem.
więc wysłanie Strict-Transport-Security
nagłówka klienta w odpowiedzi na żądanie inne niż SSL nie byłoby zgodne ze specyfikacją.
Chciałbym skorzystać z przykładu z linku z Wikipedii, do którego się odwołałeś, i wykonać działanie w global.asax dla witryny. Umożliwia to przekierowanie żądania do adresu URL https, a następnie wstawienie nagłówka do odpowiedzi.
Wynika to z faktu, że nagłówek HSTS musi zostać zignorowany, jeśli nie znajduje się w odpowiedzi https.
protected void Application_BeginRequest()
{
switch (Request.Url.Scheme)
{
case "https":
Response.AddHeader("Strict-Transport-Security", "max-age=31536000");
break;
case "http":
var path = "https://" + Request.Url.Host + Request.Url.PathAndQuery;
Response.Status = "301 Moved Permanently";
Response.AddHeader("Location", path);
break;
}
}
To wydaje się być całkiem bezpiecznym sposobem na zrobienie tego. Dodaj ten kod do Global.asax - zdarzenie Application_BeginRequest jest uruchamiane najpierw w cyklu życia żądania Asp.net: http://msdn.microsoft.com/en-us/library/system.web.httpapplication.beginrequest(v=vs. 110) .aspx
Zgodnie ze specyfikacją żądania HTTP nie mogą odpowiadać nagłówkiem - więc ten kod dodaje go tylko do żądań https. Maksymalny wiek to liczba sekund i zwykle dobrym pomysłem jest umieszczenie tutaj dużej wartości (IE - 31536000 wskazuje, że witryna będzie obsługiwać SSL tylko przez następne 365 dni)
protected void Application_BeginRequest(Object sender, EventArgs e)
{
switch (Request.Url.Scheme)
{
case "https":
Response.AddHeader("Strict-Transport-Security", "max-age=31536000");
break;
case "http":
var path = "https://" + Request.Url.Host + Request.Url.PathAndQuery;
Response.Status = "301 Moved Permanently";
Response.AddHeader("Location", path);
break;
}
}
Korzystając z przykładu podanego przez Douga Wilsona, stworzyłem następujące dwie funkcje PowerShell, aby dodać reguły przepisywania adresów URL w celu przekierowania do HTTPS i dodawania nagłówków HSTS.
Zostały one przetestowane w systemach Windows 2012 i Windows 2012 R2.
Wszystko, co musisz zrobić, to podać nazwę strony internetowej. Opcjonalnie możesz nadać regułom inną nazwę, jeśli nie podoba Ci się wartość domyślna.
Jedną z rzeczy, na które należy zwrócić uwagę, jest to, że z moich testów Zmienne Serwerowe należy dodać do listy dozwolonych, zanim znajdą się w nagłówkach odpowiedzi. Funkcje zrobią to za Ciebie.
EDYCJA: Zobacz odniesienie do przepisywania adresów URL dla nagłówków HTTP tutaj: http://www.iis.net/learn/extensions/url-rewrite-module/setting-http-request-headers-and-iis-server-variables
Function Add-HTTPSRedirectRewriteRule()
{
<#
.SYNOPSIS
This function is used to create a URL Rewrite Rule that redirects HTTP requests to HTTPS using a 301
RuleName is optional and will default to "Redirect to HTTPS"
.SYNTAX
Add-HTTPSRedirectRewriteRule -WebsiteName "www.mywebsite.com"
.EXAMPLES
Add-HTTPSRedirectRewriteRule -WebsiteName "www.mywebsite.com"
Add-HTTPSRedirectRewriteRule -WebsiteName "www.mywebsite.com" -RuleName "my rule name"
#>
[cmdletbinding(positionalbinding=$false)]
Param
(
[parameter(mandatory=$true)][String] [ValidateNotNullOrEmpty()] $WebsiteName,
[parameter(mandatory=$false)][String] $RuleName="Redirect to HTTPS"
)
Write-Verbose -Message "Creating the Url Rewrite rule ""$RuleName"" in website ""$WebsiteName"""
Remove-WebConfigurationProperty -pspath "MACHINE/WEBROOT/APPHOST" -location "$WebsiteName" -filter "system.webServer/rewrite/rules" -name "." -AtElement @{name="$RuleName"} -ErrorAction SilentlyContinue
Add-WebConfigurationProperty -pspath 'MACHINE/WEBROOT/APPHOST' -location "$WebsiteName" -filter "system.webServer/rewrite/rules" -name "." -value @{name="$RuleName";stopProcessing='True'}
Set-WebConfigurationProperty -pspath 'MACHINE/WEBROOT/APPHOST' -location "$WebsiteName" -filter "system.webServer/rewrite/rules/rule[@name='$RuleName']/match" -name "url" -value "(.*)"
Add-WebConfigurationProperty -pspath 'MACHINE/WEBROOT/APPHOST' -location "$WebsiteName" -filter "system.webServer/rewrite/rules/rule[@name='$RuleName']/conditions" -name "." -value @{input='{HTTPS}';pattern='off'}
Set-WebConfigurationProperty -pspath 'MACHINE/WEBROOT/APPHOST' -location "$WebsiteName" -filter "system.webServer/rewrite/rules/rule[@name='$RuleName']/action" -name "type" -value "Redirect"
Set-WebConfigurationProperty -pspath 'MACHINE/WEBROOT/APPHOST' -location "$WebsiteName" -filter "system.webServer/rewrite/rules/rule[@name='$RuleName']/action" -name "url" -value "https://{HTTP_HOST}/{R:1}"
}
Function Add-HSTSHeaderRewriteRule()
{
<#
.SYNOPSIS
This function is used to create a URL Rewrite Rule that sets an HTTP Response Header for Strict-Transport-Security
when the protocol requested is HTTPS
RuleName is optional and will default to "Add Strict-Transport-Security header when request is HTTPS"
.SYNTAX
Add-HSTSHeaderRewriteRule -WebsiteName "www.mywebsite.com"
.EXAMPLES
Add-HSTSHeaderRewriteRule -WebsiteName "www.mywebsite.com"
Add-HSTSHeaderRewriteRule -WebsiteName "www.mywebsite.com" -RuleName "my rule name"
#>
[cmdletbinding(positionalbinding=$false)]
Param
(
[parameter(mandatory=$true)][String] [ValidateNotNullOrEmpty()] $WebsiteName,
[parameter(mandatory=$false)][String]$RuleName="Add Strict-Transport-Security header when request is HTTPS"
)
$serverVariable = "RESPONSE_Strict_Transport_Security"
Write-Verbose -Message "Creating the HSTS Header rule ""$RuleName"" in website ""$WebsiteName"""
Remove-WebConfigurationProperty -pspath 'MACHINE/WEBROOT/APPHOST' -location "$WebsiteName" -filter "system.webServer/rewrite/allowedServerVariables" -name "." -AtElement @{name="$serverVariable"} -ErrorAction SilentlyContinue
Add-WebConfigurationProperty -pspath 'MACHINE/WEBROOT/APPHOST' -location "$WebsiteName" -filter "system.webServer/rewrite/allowedServerVariables" -name "." -value @{name="$serverVariable"}
Remove-WebConfigurationProperty -pspath "MACHINE/WEBROOT/APPHOST" -location "$WebsiteName" -name "." -filter "system.webServer/rewrite/outboundRules" -AtElement @{name="$RuleName"} -ErrorAction SilentlyContinue
Add-WebConfigurationProperty -pspath "MACHINE/WEBROOT/APPHOST" -location "$WebsiteName" -filter "system.webServer/rewrite/outboundRules" -name "." -value @{name="$RuleName"}
Set-WebConfigurationProperty -pspath "MACHINE/WEBROOT/APPHOST" -location "$WebsiteName" -filter "system.webServer/rewrite/outboundRules/rule[@name='$RuleName']/match" -name "serverVariable" -value $serverVariable
Set-WebConfigurationProperty -pspath "MACHINE/WEBROOT/APPHOST" -location "$WebsiteName" -filter "system.webServer/rewrite/outboundRules/rule[@name='$RuleName']/match" -name "pattern" -value ".*"
Add-WebConfigurationProperty -pspath "MACHINE/WEBROOT/APPHOST" -location "$WebsiteName" -filter "system.webServer/rewrite/outboundRules/rule[@name='$RuleName']/conditions" -name "." -value @{input='{HTTPS}';pattern='on'}
Set-WebConfigurationProperty -pspath "MACHINE/WEBROOT/APPHOST" -location "$WebsiteName" -filter "system.webServer/rewrite/outboundRules/rule[@name='$RuleName']/action" -name "type" -value "Rewrite"
Set-WebConfigurationProperty -pspath "MACHINE/WEBROOT/APPHOST" -location "$WebsiteName" -filter "system.webServer/rewrite/outboundRules/rule[@name='$RuleName']/action" -name "value" -value "max-age=31536000"
}
Według twórców modułu HTTP Strict Transport Security IIS samo dodanie niestandardowego nagłówka nie jest zgodne ze szkicową specyfikacją (RFC 6797).
W rzeczywistości należy zainstalować ten moduł IIS, aby włączyć HSTS w IIS 7.
Aktualizacja 26 okt 2014 : Dzięki komentatorowi ponownie przeczytałem stronę modułu, a konkretnie tę część, która uzasadnia użycie modułu zamiast dodawania niestandardowych nagłówków.
Host HSTS NIE MOŻE zawierać pola nagłówka STS w odpowiedziach HTTP przesyłanych niezabezpieczonym transportem.
Jeśli dodasz nagłówki tylko w HTTPS, a NIE w HTTP, nie potrzebujesz tego modułu i możesz użyć odpowiedzi Douga Wilsona. Nie używaj odpowiedzi Owena Blackera, ponieważ nie ma on warunku https.
Można to zrobić, dodając następujący blok w Web.Config:
<system.webServer>
<httpProtocol>
<customHeaders>
<add name ="CustomName" value="MyCustomValue"/>
</customHeaders>
</httpProtocol>
</system.webServer>
Musimy skonfigurować w IIS, który ma możliwość dostosowywania nagłówków do odpowiedzi:
Żeby dodać, widzę w komentarzach 2 osoby mówiące o 500 błędach, kiedy to robisz. Miałem to
Jeśli w usługach IIS pojawi się błąd 500, może to oznaczać, że dodałeś regułę zarówno na najwyższym poziomie, ustawiono na odziedziczony, jak i na poziomie witryny.
na przykład
Default Web Site <- here
Some Web Site <- here
Usługi IIS / Przeglądarka nie wydają żadnych informacji o tym, co zrobiłeś, niezależnie od ustawień obsługi błędów