Was ist die beste Methode, um HTTP Strict Transport Security auf einem IIS 7-Webserver zu aktivieren?
Kann ich einfach über die GUI den richtigen HTTP-Antwortheader hinzufügen oder sollte ich appcmd verwenden und wenn ja, welche Schalter?
Was ist die beste Methode, um HTTP Strict Transport Security auf einem IIS 7-Webserver zu aktivieren?
Kann ich einfach über die GUI den richtigen HTTP-Antwortheader hinzufügen oder sollte ich appcmd verwenden und wenn ja, welche Schalter?
Antworten:
IIS kann Antworten benutzerdefinierte Header hinzufügen . Dies scheint der einfachste Weg zu sein, dies zu tun.
Gemäß der Dokumentation auf IIS.net können Sie diese Header über den IIS-Manager hinzufügen:
- Wechseln Sie im Bereich Verbindungen zu der Site, der Anwendung oder dem Verzeichnis, für die bzw. das Sie einen benutzerdefinierten HTTP-Header festlegen möchten.
- Doppelklicken Sie im Bereich Startseite auf HTTP-Antwortheader.
- Klicken Sie im Bereich HTTP-Antwortheader im Bereich Aktionen auf Hinzufügen ....
- Legen Sie im Dialogfeld Benutzerdefinierten HTTP-Antwortheader hinzufügen den Namen und den Wert für Ihren benutzerdefinierten Header fest, und klicken Sie dann auf OK.
Auf diese Weise können wir sowohl die HTTP-Umleitung als auch den Strict-Transport-Security-Header zu HTTPS-Antworten mit einer einzigen IIS-Site hinzufügen (das URL-Rewrite-Modul muss installiert sein):
<?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" />
um einen Pass auf hstspreload.org zu bekommen
https://somedomain.com/https://somedomain.com/relatedpath
wird der Pfad gelöscht.
Um die Antwort von voretaq7 zu ergänzen , können Sie auch die Datei Web.config verwenden (Hinweis: Nur für SSL-Sites, da der Header für HTTP- und HTTPS-Antworten hinzugefügt wird, was der RFC 6797-Spezifikation entspricht. Bitte beachten Sie die Erklärung unten) - fügen Sie einen Block wie folgt hinzu:
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Strict-Transport-Security" value="max-age=31536000"/>
</customHeaders>
</httpProtocol>
</system.webServer>
Offensichtlich haben Sie möglicherweise bereits einen system.webServer
Block in Ihrer Web.config, fügen Sie diesen also hinzu, falls dies der Fall ist. Wir ziehen es vor, die Dinge in der Web.config zu behandeln, anstatt in der GUI, da dies bedeutet, dass die Konfigurationsänderungen in unser Git-Repository übernommen werden können.
Wenn Sie die HTTP-zu-SSL-Umleitung wie von Greg Askew erwähnt durchführen möchten , ist dies möglicherweise einfacher, wenn Sie eine separate Website in IIS verwenden. So gehen wir mit der Anforderung von SSL für einige Client-Sites um. Diese Site enthält nur eine HTTP-Umleitung und einige Korrekturen zur Offenlegung von Informationen in der Datei "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>
Dies ist aus mehreren Gründen unsere bevorzugte Lösung. Wir können umgeleiteten Datenverkehr problemlos separat protokollieren (da er sich in einem anderen IIS-Protokoll befindet). In Global.asax.cs ist kein weiterer Code enthalten (wir haben keinen Code) drin, was für eine Umbraco-Site etwas praktischer ist) und vor allem bedeutet dies, dass sich die gesamte Konfiguration noch in unserem GIT-Repo befindet.
Bearbeitet, um hinzuzufügen: Um RFC 6797 zu erfüllen , darf der Strict-Transport-Security
benutzerdefinierte Header NICHT zu Anforderungen hinzugefügt werden, die über unverschlüsseltes HTTP erfolgen. Um RFC6797-kompatibel zu sein, MÜSSEN Sie zwei Standorte in IIS haben, wie ich nach dem ersten Codeblock beschrieben habe. Wie Chris betont, enthält RFC 6797:
Ein HSTS-Host DARF das STS-Headerfeld NICHT in HTTP-Antworten enthalten, die über einen nicht sicheren Transport übertragen werden.
Daher würde das Senden des Strict-Transport-Security
Kunden-Headers als Antwort auf eine Nicht-SSL-Anforderung nicht der Spezifikation entsprechen.
Ich würde das Beispiel aus dem Wikipedia-Link verwenden, auf den Sie verwiesen haben, und die Aktivität in global.asax für die Site ausführen. Dies ermöglicht es, die Anforderung zu einer HTTPS - URL umgeleitet, und dann den Header in die Antwort einzufügen.
Dies liegt daran, dass der HSTS-Header ignoriert werden muss, wenn er nicht in einer https-Antwort enthalten ist.
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;
}
}
Dies scheint eine ziemlich ausfallsichere Methode zu sein. Fügen Sie diesen Code in Global.asax hinzu - das Application_BeginRequest-Ereignis wird zuerst im Asp.net-Anforderungslebenszyklus ausgelöst: http://msdn.microsoft.com/en-us/library/system.web.httpapplication.beginrequest(v=vs. 110) .aspx
Laut Spezifikation dürfen http-Anforderungen nicht mit dem Header antworten, sodass dieser Code ihn nur für https-Anforderungen hinzufügt. Das Höchstalter ist in Sekunden angegeben, und es ist normalerweise eine gute Idee, hier einen großen Wert anzugeben (IE - 31536000 gibt an, dass auf der Site SSL nur für die nächsten 365 Tage ausgeführt wird).
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;
}
}
Anhand des von Doug Wilson bereitgestellten Beispiels habe ich die folgenden beiden PowerShell-Funktionen erstellt, um Regeln zum Umleiten von URLs zu HTTPS und zum Hinzufügen von HSTS-Headern hinzuzufügen.
Diese wurden unter Windows 2012 und Windows 2012 R2 getestet.
Sie müssen lediglich den Namen der Website angeben. Sie können den Regeln optional einen anderen Namen geben, wenn Sie die Standardeinstellungen nicht mögen.
Beachten Sie, dass die Servervariablen aus meinen Tests zur Zulassungsliste hinzugefügt werden müssen, bevor sie in den Antwortköpfen angezeigt werden. Die Funktionen erledigen das für Sie.
BEARBEITEN: Siehe Verweis auf Url Rewrite für HTTP-Header hier: 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"
}
Laut den Herstellern des IIS-Moduls für strenge HTTP-Transportsicherheit entspricht das Hinzufügen des benutzerdefinierten Headers nicht dem Entwurf der Spezifikation (RFC 6797).
Sie müssten dieses IIS-Modul tatsächlich installieren , um HSTS auf IIS 7 zu aktivieren.
Update 26. Oktober 2014 : Dank des Kommentars unten habe ich die Modulseite noch einmal gelesen und speziell den Teil, der die Verwendung des Moduls durch das Hinzufügen von benutzerdefinierten Headern rechtfertigt.
Ein HSTS-Host DARF das STS-Header-Feld NICHT in HTTP-Antworten enthalten, die über einen nicht sicheren Transport übertragen werden.
Wenn Sie sicherstellen, dass die Header nur in HTTPS und NICHT in HTTP hinzugefügt werden, benötigen Sie dieses Modul nicht und können die Antwort von Doug Wilson verwenden. Verwenden Sie die Antwort von Owen Blacker nicht, da die https-Bedingung nicht erfüllt ist.
Dies kann durch Hinzufügen des folgenden Blocks in Web.Config erfolgen:
<system.webServer>
<httpProtocol>
<customHeaders>
<add name ="CustomName" value="MyCustomValue"/>
</customHeaders>
</httpProtocol>
</system.webServer>
Wir müssen auf IIS konfigurieren, das die Möglichkeit hat, benutzerdefinierte Header für die Antwort festzulegen:
Um es hinzuzufügen, ich sehe in den Kommentaren 2 Leute, die über 500 Fehler sprechen, wenn Sie dies tun. Ich hatte das
Wenn in IIS ein Fehler von 500 angezeigt wird, liegt dies möglicherweise daran, dass Sie die Regel sowohl auf der obersten Ebene als auch auf der Websiteebene als geerbt festgelegt haben.
z.B
Default Web Site <- here
Some Web Site <- here
IIS / Der Browser scheint Ihnen keine Informationen darüber zu geben, dass Sie dies getan haben, unabhängig von Ihren Einstellungen für die Fehlerbehandlung