Frage Aktivieren Sie die HTTP-Strict-Transport-Sicherheit (HSTS) in IIS 7


Was ist der beste Weg zum Einschalten? HTTP Strict-Transportsicherheit auf einem IIS 7-Webserver?

Kann ich einfach über die GUI den richtigen HTTP-Response-Header hinzufügen oder sollte ich appcmd verwenden und wenn ja, was schaltet?


69
2017-08-13 21:23


Ursprung


Davon hängt viel ab Wie Sie generieren die Dinge, die IIS bereitstellt (zum Beispiel können Sie den Header in PHP- oder ASP.NET-Seiten innerhalb Ihrer Anwendung festlegen). Können Sie uns mehr über Ihren Anwendungsfall erzählen? - voretaq7


Antworten:


IIS hat die Möglichkeit, den Antworten benutzerdefinierte Header hinzuzufügen. Dies scheint der einfachste Weg zu sein.

Laut der Dokumentation auf IIS.net Sie können diese Header über den IIS-Manager hinzufügen:

  • Navigieren Sie im Bereich Verbindungen zur Site, Anwendung oder zum Verzeichnis, für 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-Antwort-Header hinzufügen den Namen und Wert für Ihre benutzerdefinierte Kopfzeile fest, und klicken Sie dann auf OK.

17
2017-08-13 21:37



Dies ist auch in der Web.config möglich, die Sie möglicherweise bevorzugen. Ich habe die Details als neue Antwort veröffentlicht, da sie ohne die Formatierung des Quellcodes, die in Kommentaren nicht verfügbar ist, sehr schwer zu lesen sind. - Owen Blacker
Laut den Machern von Striktes Transportsicherheits-IIS-Modul für HTTPDas Hinzufügen des benutzerdefinierten Headers entspricht nicht dem Entwurfsspezifikation (RFC 6797). Sie müssten dieses IIS-Modul tatsächlich installieren. - Chris
@Chris Sie sind (irgendwie) falsch. Nicht über die Spezifikation - sie sind absolut richtig - aber über die Tatsache, dass es keine "einfache" Möglichkeit gibt, neben ihrem Modul zu bestehen: Erstellen Sie einfach zwei Seiten, eine für SSL (mit der Kopfzeile) und eine für nicht-SSL ( ohne den Header). Sicherlich ist das Modul ein bisschen mehr elegant, aber es ist nicht notwendig (und nicht gerechtfertigt, wenn Ihre Website nur https ist und Sie keine einfachen HTTP-Antworten liefern). - voretaq7
@Chris Du solltest eine Antwort hinzufügen, die auf dieses Modul verweist - kostenlose upvotes! (Ich war mir seiner Existenz nicht bewusst, und für viele Leute ist es wahrscheinlich eine leichtere / bessere Option als das benutzerdefinierte Header-Zeug) - voretaq7


Dadurch können wir sowohl die HTTP-Umleitung verarbeiten als auch den Strict-Transport-Security-Header zu HTTPS-Antworten mit einer einzelnen 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}/{R:1}"
                        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" />
                </rule>
            </outboundRules>
        </rewrite>
    </system.webServer>
</configuration>

102
2017-09-18 17:05



Danke, das ist die beste Antwort! Fügt den Header im Gegensatz zum programmatischen Ansatz auch statischen HTML-Dateien hinzu. Und fügt nicht zu HTTP hinzu und entspricht somit dem Standard. - Jeow Li Huan
Wenn ich das zu meinem <system.webServer> Abschnitt von web.config hinzufüge, erhalte ich einen 500-Fehler auf meinen asp.net-Seiten. Es scheint kein <rewrite> -Kind für diesen Knoten zu geben (msdn.microsoft.com/en-us/library/ms689429.aspx). - Mathemats
@Mathemats Haben Sie URL Rewrite in IIS installiert? - Doug Wilson
Nein, nach weiteren Recherchen habe ich herausgefunden, dass das Rewrite-Tag von der Erweiterung (d'oh) bereitgestellt wird. Alle Antworten, die ich finden konnte, erwähnen die Erweiterung nicht als Abhängigkeit, vielleicht könnten Sie einen einzigen Liner in Ihre Antwort werfen, der sagt, dass Sie ihn brauchen. - Mathemats
hstspreload.org möchte, dass der Benutzer `; includeSubDomains; Vorspannung nach dem Höchstalterswert. Optionen. Die vollständige Zeile lautet: <action type="Rewrite" value="max-age=31536000 ;includeSubDomains; preload" /> einen bekommen bestehen auf hstspreload.org - JP Hellemons


Zu ergänzen voretaq7Antwort: Sie können dies auch mit der Datei Web.config tun (NB: Nur für SSL-Sites zu verwenden, da der Header sowohl für HTTP- als auch für HTTPS-Antworten hinzugefügt wird, was gegen die RFC 6797-Spezifikation ist 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 hast du vielleicht schon eine system.webServer Blockieren Sie in Ihrer Web.config, also fügen Sie das hinzu, wenn dem so ist. Wir bevorzugen es, die Dinge in der Web.config und nicht in der GUI zu behandeln, da dies bedeutet, dass die Konfigurationsänderungen an unser Git-Repository übergeben werden können.

Wenn Sie die HTTP-zu-SSL-Umleitung bearbeiten möchten, z Greg Askew erwähnt, könnte es einfacher sein, das mit einer separaten Website in IIS zu tun. So behandeln wir SSL für einige Client-Sites. Diese Site enthält nur eine HTTP-Weiterleitung und einige Offenlegung von Informationen Fixes, alle in der 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) dort, was für eine Umbraco-Site ein wenig praktischer ist) und, was noch wichtiger ist, es bedeutet, dass die gesamte Konfiguration noch in unserem GIT-Repository gespeichert ist.

Bearbeitet um hinzuzufügen: Um klar zu sein, um zu entsprechen RFC 6797, das Strict-Transport-Security benutzerdefinierter Header DARF NICHT zu Anforderungen hinzugefügt werden, die von unverschlüsseltem HTTP gestellt werden. Um RFC6797-konform zu sein, MÜSSEN Sie zwei Sites in IIS haben, wie ich nach dem ersten Codeblock beschrieben habe. Wie Chris weist darauf hin, RFC 6797 enthält:

Ein HSTS-Host DARF NICHT Fügen Sie das STS-Headerfeld in HTTP-Antworten ein, die über nicht sicheren Transport übertragen werden.

also sende die Strict-Transport-Security Kunden-Header als Antwort auf eine Nicht-SSL-Anfrage würde nicht mit der Spezifikation übereinstimmen.


36
2018-03-20 15:06



Um die Owen Blacker-Antwort hinzuzufügen, verwende ich für IIS URLScan 3.1 und lasse den SERVER global von der Antwort entfernen, indem ich RemoveServerHeader = 1 festlege. Der Rest der Einstellungen muss in jeder web.config-Datei der Site enthalten sein. Ich bevorzuge es, den Wert einfach auszublenden. - KeyOfJ
URLScan ist eine sehr allgemeine Lösung und, ich würde vorschlagen, eine bessere als die, die ich vorschlage. Aber es ist nicht immer die bequemste Lösung: o) - Owen Blacker
Wichtig zu beachten, dass das Hinzufügen zu einer Site mit aktiviertem HTTPS und HTTP (so dass es umgeleitet werden kann) die Seite BREAKEN wird! Sie erhalten eine informationslose 500, auch mit CustomErrors Mode = "Aus", ohne Fehler in den Protokollen. - Chris Moschini
@ChrisMoschini Ich hätte klarstellen sollen, dass die erste Web.config-Zeile für eine SSL-only-Site sein sollte. - Owen Blacker
Warum ist die Strict-Transport-Security nicht in SSL erlaubt? Es wäre ein Indikator für den Browser, um zu https zu wechseln. Ein Fehler in der Spezifikation oder gibt es einen bestimmten Grund? - Lenne


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 das Weiterleiten der Anfrage an eine https-URL, und dann Fügen Sie den Header in die Antwort ein.

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;
    }
}

8
2017-08-13 23:40





Dies scheint ein ziemlich ausfallsicherer Weg 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

Gemäß der Spezifikation dürfen HTTP-Anfragen nicht mit dem Header antworten - daher fügt dieser Code nur für HTTPS-Anfragen hinzu. Max-Alter ist in der Anzahl der Sekunden, und es ist normalerweise eine gute Idee, einen großen Wert hier zu setzen (IE - 31536000 zeigt an, dass die Site SSL nur für die nächsten 365 Tage ausführen 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;
  }
}

3
2018-03-20 03:20





Laut den Herstellern des HTTP Strict Transport Security-IIS-Moduls ist das Hinzufügen des benutzerdefinierten Headers nicht konform mit der Entwurfsspezifikation (RFC 6797).

Sie müssten das tatsächlich installieren IIS-Modul Aktivieren von HSTS auf IIS 7.

Update 26. Oktober 2014: Dank des unten stehenden Kommentars lese ich die Modulseite erneut und speziell den Teil, der die Verwendung des Moduls über das Hinzufügen von benutzerdefinierten Headern rechtfertigt.

Ein HSTS-Host darf das STS-Header-Feld NICHT in HTTP-Antworten einschließen, die über 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 Sie können die Antwort von Doug Wilson verwenden. Verwenden Sie nicht die Antwort von Owen Blacker, da sie nicht die HTTPS-Bedingung hat.


1
2018-03-03 21:14



Also lösen einige der anderen Antworten, die nur den Header an HTTPS-Anfragen senden, dieses Problem ebenfalls? Oder macht Ihr Modul etwas anderes / anderes, als die anderen Lösungen nicht? - slolife
@slolife Ich habe meine Antwort aktualisiert. Sie können den Code in Doug Wilsons Antwort verwenden. Sie benötigen dieses Modul nicht. Ich sehe jetzt, dass dies auch in den Kommentaren der angenommenen Antwort diskutiert wird. Ich bin mir nicht bewusst, dass dieses Modul etwas anderes macht, als die anderen Lösungen. Aber ich habe den Bericht nicht vollständig überprüft Quellcode entweder. - Chris
Ich hätte klarer sein sollen, dass die erste Web.config in eine SSL-only-Site implementiert werden sollte. Ich werde meine Antwort bearbeiten, um das zu klären. - Owen Blacker


Mit dem von Doug Wilson bereitgestellten Beispiel habe ich die folgenden zwei PowerShell-Funktionen erstellt, um URL-Umschreibungsregeln für die Umleitung zu HTTPS hinzuzufügen und HSTS-Header 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.

Eine Sache, die zu beachten ist, ist, dass die Servervariablen bei meinen Tests der Zulassungsliste hinzugefügt werden müssen, bevor sie in den Antwortheadern enthalten sind. Die Funktionen tun 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"

}

1
2018-02-04 16:51





Dies kann durch Hinzufügen des folgenden Blocks in Web.Config erfolgen:                                 

Wir müssen auf IIS konfigurieren, das die Möglichkeit hat, benutzerdefinierte Header zu beantworten:

  • Wechseln Sie zu Internetinformationsdienste (IIS) -Manager.
  • Konfigurieren Sie Antwortheader, die der Antwort vom Server hinzugefügt werden.
  • Fügen Sie jetzt Ihren benutzerdefinierten Header-Namen und benutzerdefinierten Wert hinzu (Name und Wert des benutzerdefinierten Headers sollten identisch mit dem in Web.Config sein). Sie finden auf Blog

0
2017-12-15 13:39