在 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)
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 响应标头”对话框中,设置自定义标头的名称和值,然后单击“确定”。
我将使用您引用的维基百科链接中的示例,并在 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)
| 归档时间: |
|
| 查看次数: |
78446 次 |
| 最近记录: |