![在 IIS 7 中启用 HTTP 严格传输安全 (HSTS)](https://linux22.com/image/592809/%E5%9C%A8%20IIS%207%20%E4%B8%AD%E5%90%AF%E7%94%A8%20HTTP%20%E4%B8%A5%E6%A0%BC%E4%BC%A0%E8%BE%93%E5%AE%89%E5%85%A8%20(HSTS).png)
开启的最佳方式是什么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 6797,Strict-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;
}
}