使用https协议,在数据传输之前会进行握手通信,服务器和客户端交换的信息内容主要包括:

1、加密协议的版本;

2、身份确认;

3、传输数据的加密密码。

在信息传输的加密密码确认之后,接下来的通信数据都会加密传输,从而达到防止信息泄露的目的。握手过程中确认加密协议版本过程如下:

1、由客户端(如浏览器)发送第一个数据包 ClientHello,这个数据包中保存着客户端支持的加密协议版本。

2、服务器收到这个ClientHello数据包,查看里面客户端支持的加密协议版本,然后匹配服务器自己支持的加密协议版本,从而确认双方通信所使用的加密协议版本。

3、服务器发送ServerHello数据包给客户端,告诉客户端要使用什么加密协议版本。

上述过程中,如果客户端发送给服务器的ClientHello数据包中说自己仅支持某个有漏洞的旧版本加密协议(比如仅支持SSLv3.0),服务器有两种可能的响应:

1、服务器支持很多版本,其中包括有漏洞的旧版本(如SSLv3.0协议),那么服务器会认可使用有漏洞的旧版本协议,从而同意客户端使用有漏洞的旧版本安全协议(如同意使用SSLv3.0)。

2、服务器不支持有漏洞的旧版本,拒绝客户端的这次请求,握手失败。

对于攻击者,作为中间人只能监听到加密过的数据,如果这些数据通过没有漏洞的加密协议版本加密,攻击者难以获取明文信息。但是,如果服务器提供有漏洞的旧版本加密协议的支持,而同时攻击者又能作为中间人控制受害者的浏览器发起漏洞版本的https请求,那么攻击者可以针对监听到的加密数据,利用加密协议漏洞,解密这些数据。对攻击者而言,加密数据和明文传输没有什么差别,这就是https协议降级攻击。

通常人们解决https降级攻击的方式有很多比如-HSTS(HTTP Strict Transport Security)

在网站全站 HTTPS 后,如果用户手动敲入网站的 HTTP 地址,或者从其它地方点击了网站的 HTTP 链接,依赖于服务端 301/302 跳转才能使用 HTTPS 服务。而第一次的 HTTP 请求就有可能被劫持,导致请求无法到达服务器,从而构成 HTTPS 降级劫持。

这个问题可以通过 HSTS(HTTP Strict Transport Security,RFC6797)来解决。HSTS 是一个响应头,格式如下:

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

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

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

HSTS 这个响应头只能用于 HTTPS 响应;网站必须使用默认的 443 端口;必须使用域名,不能是 IP。而且启用 HSTS 之后,一旦网站证书错误,用户无法选择忽略。

可以看到 HSTS 可以很好的解决 HTTPS 降级攻击,但是对于 HSTS 生效前的首次 HTTP 请求,依然无法避免被劫持。浏览器厂商们为了解决这个问题,提出了 HSTS Preload List 方案:内置一份可以定期更新的列表,对于列表中的域名,即使用户之前没有访问过,也会使用 HTTPS 协议。

目前这个 Preload List 由 Google Chrome 维护,Chrome、Firefox、Safari、IE 11 和 Microsoft Edge 都在使用。如果要想把自己的域名加进这个列表,首先需要满足以下条件:

拥有合法的证书(如果使用 SHA-1 证书,过期时间必须早于 2016 年);

将所有 HTTP 流量重定向到 HTTPS;

确保所有子域名都启用了 HTTPS;

输出 HSTS 响应头:

max-age 不能低于 18 周(10886400 秒);

必须指定 includeSubdomains 参数;

必须指定 preload 参数;

即便满足了上述所有条件,也不一定能进入 HSTS Preload List,更多信息可以看这里。通过 Chrome 的 chrome://net-internals/#hsts 工具,可以查询某个网站是否在 Preload List 之中,还可以手动把某个域名加到本机 Preload List。

这样,就能很好的解决https降级攻击了。

当你第一次访问的时候,你的浏览器就收到了来自服务器的请求,输出HSTS响应头并进行保存,用户无法删除,当服务器未使用https且ssl证书无法验证时,浏览器就会马上停止握手,保护你的数据。在购物时,如果浏览器未使用https加密验证,请手动开启https

若平台不支持,不妨换个购物平台试试吧,毕竟一个不可靠的平台何以见得能保护你的信息呢?


小煜

一个可能很温柔也可能很暴躁的钢铁直男!