欢迎光临众联科技,开始互联网之旅! 请〖登录〗 〖注册〗
IIS - 开启HSTS让浏览器默认以HTTPS访问(强制跳转HTTPS)
发布时间:2018/10/19 2:31:50   发布来源:众联科技

  在之前的文章中我介绍了如何通过配置 SSL 证书从而让网站实现 HTTPS 协议,还介绍了如何通过 URL 重写实现 HTTP 重定向到 HTTPS 上。经过前面的配置后,不管用户输入的是哪种地址,最终会跳转到 HTTPS 上。

    

    但这样做还是有存在个问题。由于我们采用的是 301/302 跳转方式来实现由 HTTP HTTPS 的跳转,但是这个过程总是会使用到 HTTP ,因此容易发生劫持,受到第三方的攻击,就像下面这张图显示的那样。

原文:IIS - 开启HSTS让浏览器默认以HTTPS访问(强制跳转HTTPS)


为了解决这个问题,就需要用到 HSTSHTTP 严格安全传输)。


一、HSTS 基本介绍

1,HSTS 简介

  • HSTSHTTP Strict Transport Security)是国际互联网工程组织 IETF 发布的一种互联网安全策略机制。

  • 采用 HSTS 策略的网站将保证浏览器始终连接到该网站的 HTTPS 加密版本,不需要用户手动在 URL 地址栏中输入加密地址,从而减少会话劫持风险。


2,HSTS 原理

HSTS 主要是通过服务器发送响应头的方式来控制浏览器操作:

  • 当客户端通过 HTTPS 发出请求时,服务器会在返回的 HTTP 响应头中包含 Strict-Transport-Security 字段。

  • 浏览器接收到这样的信息之后,在一定期限内对该网站的任何请求都会以 HTTPS 发起,而不会以 HTTP 发起再由服务器重定向到 HTTPS


3,HSTS 响应头格式

1
Strict-Transport-Security: max-age=expireTime [; includeSubDomains] [; preload]

参数说明:

  • max-age(单位是秒):用来告诉浏览器在指定时间内,这个网站必须通过 HTTPS 协议来访问。也就是对于这个网站的 HTTP 地址,浏览器需要先在本地替换为 HTTPS 之后再发送请求。

  • includeSubDomains(可选参数):如果指定这个参数,表明这个网站所有子域名也必须通过 HTTPS 协议来访问。

  • preload(可选参数):一个浏览器内置的使用 HTTPS 的域名列表。


4,浏览器支持情况

(1)桌面浏览器

  • Chrome:完美支持

  • Firefox:完美支持

  • SafariSafari 7 起开始支持(2013年)

  • IEIE11 起开始支持(包括后面的 Edge

  • Opera:完美支持


(2)移动设备

  • iOSiOS 7.1 起开始支持

  • AndroidAndroid 4.4 起开始支持


二、HSTS部署

1,操作步骤

(1)由于 HSTS 策略只能在 HTTPS 响应中进行设置,所以首先我们还是要做个 http https 的重定向。让用户第一次访问的时候会自动跳转到 https 地址上。具体方法参考下方这篇文章:


(2)接着我们要开启 IIS HSTS 功能(以 IIS7 + 为例)。打开网站目录下的 web.config 这个文件,在相应的位置添加上针对 https 响应的 url 重写规则(高亮部分),并保存。

  • max-age 我们这里设置为 365 天。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <defaultDocument>
            <files>
                <add value="index.php" />
            </files>
        </defaultDocument>
        <staticContent>
            <remove fileExtension=".htm" />
            <remove fileExtension=".html" />
            <mimeMap fileExtension=".html" mimeType="text/html;charset=utf-8" />
            <mimeMap fileExtension=".htm" mimeType="text/html;charset=utf-8" />
            <mimeMap fileExtension=".mp4" mimeType="application/octet-stream" />
        </staticContent>
        <rewrite>
            <rules>
                <rule name="redirect to HTTPS" enabled="true" stopProcessing="true">
                    <match url="(.*)" />
                    <conditions>
                        <add input="{HTTPS}" pattern="^OFF$" />
                    </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>
    <location path="favicon.ico">
        <system.webServer>
            <staticContent>
                <clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="31.00:00:00" />
            </staticContent>
        </system.webServer>
    </location>
</configuration>



2,测试

(1)我们打开浏览器,输入 www.hangge.com 回车。可以看到首次的 HTTP 请求仍然是通过 301 跳装到 HTTPS 上。

原文:IIS - 开启HSTS让浏览器默认以HTTPS访问(强制跳转HTTPS)


(2)但只要访问过这一次后,以后我们再进行 HTTP 请求,浏览器内部就会直接进行 307 跳转。这说明 HSTS 生效了。

原文:IIS - 开启HSTS让浏览器默认以HTTPS访问(强制跳转HTTPS)


三、HSTS 预载入列表(HSTS Preload List)

虽然 HSTS 可以很好的解决 HTTPS 降级攻击,但是对于 HSTS 生效前的首次 HTTP 请求,依然无法避免被劫持。浏览器厂商们为了解决这个问题,提出了 HSTS Preload List 方案。


1,HSTS Preload List 介绍

  • 浏览器内置一份可以定期更新的列表,对于列表中的域名,即使用户之前没有访问过,也会使用 HTTPS 协议。

  • 目前这个 Preload List Google Chrome 维护,ChromeFirefoxSafariIE 11 Microsoft Edge 都在使用。


2,加入条件

如果要想把自己的域名加进这个预载入列表,需要满足以下条件:

(1)提供有效的证书。

(2)将所有 HTTP 流量重定向到 HTTPS

(3)确保所有子域名都启用了 HTTPS,特别是 www 子域。

(4)输出 HSTS 响应头:

  • max-age 至少需要 1 年(31536000 秒)。

  • 必须指定 includeSubdomains 参数;

  • 必须指定 preload 参数;

  • 如果您正在从 HTTPS 站点提供额外的重定向,则该重定向必须仍具有 HSTS 标头(而不是其重定向到的页面)。


3,加入方法

当上面的条件满足后,我们可以通过下面这个地址申请加入预载入列表,或进行状态查询。

注意:

  • 即便满足了上述所有条件,也不是一定就能进入 HSTS Preload List

  • 提交的申请并不是自动处理的,人工处理也许需要一周到几周。

  • 即便你已经列入到这个列表,但是依旧需要几个月才能逐渐从 Chrome canary 更新通道更新到 dev beta 等通道,直到最后的 stable 通道。


4,请确定是否要加入

    如果你并不能确定你的网站从此以后一直使用 HTTPS,那还是不要加入的好。因为,加入后很难撤销,你可以要求撤销,但是这个数据重新更新到稳定版的 Chrome 同样需要几个月,而别的浏览器是如何处理这个撤销数据的,则无法保证。

    换句话说,只有 HTTPS 骨灰粉才应该考虑加入。



========================

如果https与http绑定在不同的IIS站点上,直接在https站点的web.config中添加如下配置:

<system.webServer>
    <httpProtocol>
        <customHeaders>
            <add name="Strict-Transport-Security" value="max-age=31536000" />
        </customHeaders>
    </httpProtocol>
    </system.webServer>

如果在同一个IIS站点,需要针对https响应添加如下的url重写规则(详见How to enable HTTP Strict Transport Security (HSTS) in IIS7+):

<system.webServer>
    <rewrite>
        <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>


(责任编辑:众联科技)
微信公众号
微信公众号 关注有礼
  • 服务支持
  •