在 IIS 7 中启用 HTTP 严格传输安全 (HSTS)

Bob*_*Bob 77 iis-7

在 IIS 7 Web 服务器上打开HTTP 严格传输安全的最佳方法是什么?

我可以只通过 GUI 并添加正确的 HTTP 响应标头,还是应该使用 appcmd,如果可以,切换什么?

Dou*_*son 117

这允许我们使用单个 IIS 站点处理 HTTP 重定向并将 Strict-Transport-Security 标头添加到 HTTPS 响应(必须安装 URL 重写模块):

<?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>
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,这是最好的答案!与编程方法不同,还将标题添加到静态 HTML 文件中。并且不添加到HTTP,因此符合标准。 (7认同)
  • @Mathemats 您是否在 IIS 中安装了 URL Rewrite? (4认同)
  • 不,经过更多研究,我发现重写标签是由扩展程序(d'oh)提供的。我能找到的所有答案都没有将扩展名作为依赖项提及,也许您可​​以在答案中添加一个衬里,说您需要它。 (3认同)
  • https://hstspreload.org/ 希望用户添加 ` ;includeSubDomains; 在 max-age 值之后预加载`。选项。整行将是:`&lt;action type="Rewrite" value="max-age=31536000 ;includeSubDomains; preload" /&gt;` 以在 hstspreload.org 上获得 **pass** (2认同)
  • 具有模式 (.*) 的捕获组 R:1 匹配整个 URL、协议和所有内容,并且尝试连接 {HTTP_HOST}/{R:1} 意味着您得到 `https://somedomain.com/https:/ /somedomain.com/relatedpath`,结果是路径被丢弃。 (2认同)

Owe*_*ker 40

为了补充voretaq7的答案,您还可以使用 Web.config 文件(注意:仅用于 SSL 站点,因为它将为 HTTP 和 HTTPS 响应添加标头,这违反了 RFC 6797 规范,请看下面的解释)——添加一个块如下:

<system.webServer>
    <httpProtocol>
        <customHeaders>
            <add name="Strict-Transport-Security" value="max-age=31536000"/>
        </customHeaders>
    </httpProtocol>
</system.webServer>
Run Code Online (Sandbox Code Playgroud)

显然,您system.webServer的 Web.config 中可能已经有一个块,因此如果是这样,请将其添加到该块中。我们更喜欢在 Web.config 而不是 GUI 中处理事情,因为这意味着可以将配置更改提交到我们的 Git 存储库。

如果您想处理 HTTP 到 SSL 的重定向,正如Greg Askew 所提到的,您可能会发现在 IIS 中使用单独的网站更容易做到这一点。这就是我们处理某些客户端站点需要 SSL 的方式。该站点仅包含一个 HTTP 重定向和一些信息泄露修复,所有这些都在 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>
Run Code Online (Sandbox Code Playgroud)

这是我们首选的解决方案,原因有几个——我们可以轻松地单独记录重定向的流量(因为它在不同的 IIS 日志中),它不涉及 Global.asax.cs 中的更多代码(我们没有任何代码在那里,这对于 Umbraco 站点来说更方便一些),重要的是,这意味着所有配置仍然保存在我们的 GIT 存储库中。

编辑补充:要明确,为了符合RFC 6797中,Strict-Transport-Security自定义标题不得被添加到通过未加密的HTTP的请求。要符合 RFC6797,您必须在 IIS 中有两个站点,正如我在第一个代码块之后所述。正如克里斯指出的那样,RFC 6797 包括:

一个HSTS主机一定不能包括在HTTP的STS头字段的响应传达了非安全传输。

因此发送Strict-Transport-Security客户标头以响应非 SSL 请求将不符合规范。


vor*_*aq7 17

IIS能够向响应添加自定义标头。这似乎是最简单的方法。

根据IIS.net上的文档,您可以通过 IIS 管理器添加这些标头:

  • 在“连接”窗格中,转到要为其设置自定义 HTTP 标头的站点、应用程序或目录。
  • 在主页窗格中,双击 HTTP 响应标头。
  • 在 HTTP Response Headers 窗格中,单击 Actions 窗格中的 Add...。
  • 在“添加自定义 HTTP 响应标头”对话框中,设置自定义标头的名称和值,然后单击“确定”。

  • 也可以在您可能更喜欢的 Web.config 中执行此操作。我已将详细信息作为新答案发布,因为如果没有注释中不可用的源代码格式,它们将很难阅读。 (5认同)
  • 根据 [HTTP Strict Transport Security IIS Module](http://hstsiis.codeplex.com/) 的制造者的说法,仅添加自定义标头不符合草案规范(RFC 6797)。您实际上需要安装此 IIS 模块。 (4认同)

Gre*_*kew 9

我将使用您引用的维基百科链接中的示例,并在 global.asax 中为该站点执行活动。这允许将请求重定向到 https url,然后将标头插入响应中。

这是因为如果 HSTS 标头不在 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;
    }
}
Run Code Online (Sandbox Code Playgroud)