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

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

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

我是否可以仅通过 GUI 并添加正确的 HTTP 响应标头,还是应该使用 appcmd,如果是的话,应该使用什么开关?

答案1

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

根据文件互联网信息服务您可以通过 IIS 管理器添加这些标头:

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

答案2

这样我们就可以通过一个 IIS 站点来处理 HTTP 重定向并将 Strict-Transport-Security 标头添加到 HTTPS 响应中(必须安装 URL Rewrite 模块):

<?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>

答案3

为补充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>

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

如果你想处理 HTTP 到 SSL 重定向,格雷格·阿斯库如上所述,您可能会发现使用 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>

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

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

HSTS 主机一定不在通过非安全传输传送的 HTTP 响应中包含 STS 标头字段。

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

答案4

这似乎是一种非常安全的方法。在 Global.asax 中添加此代码 - Application_BeginRequest 事件在 Asp.net 请求生命周期中首先触发:http://msdn.microsoft.com/en-us/library/system.web.httpapplication.beginrequest(v=vs.110).aspx

根据规范,http 请求不得使用标头进行响应 - 因此此代码仅为 https 请求添加标头。Max-age 以秒为单位,通常最好在此处输入较大的值(IE - 31536000 表示网站将在接下来的 365 天内仅运行 SSL)

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

相关内容