共343 次浏览

HSTS(http严格安全传输协议)

由于http协议是明文传输的,所以内容都暴露了出来,一旦遭遇到了中间人攻击,或者拦截到了数据包。就可以直接得知里面的内容。https就是比较好的解决了这一点,通过ssl的三个随机数来生成一个密钥,加密会话过程。但是https也不是绝对安全的,仍然存在危险。于是HSTS出现了,一个基于https来进一步巩固安全性的“升级”

HSTS的全程为HTTP严格安全传输协议(HTTP Strict Transport Security),它要求浏览器在一开始就要使用https协议来进行传输。既然要了解这个https的升级版,我们先来看一下目前https仍然存在什么风险。

一、https的风险

我们先来看一下为什么说https仍然不安全,下面是我们去访问一个陌生网站的过程:

我们在访问一个陌生的网站的时候,是不知道它是否使用的是https协议。我们的习惯都是在浏览器的地址栏中输入域名,比如www.baidu.com,然后直接回车去访问。此时浏览器默认的访问形式是http://www.baidu.com,会用http的形式去访问目标地址的80端口这个过程仍然是明文的,透明的,危险的。随后www.baidu.com的服务器由于使用的是https,对于发来的http自然不去理会。会将请求重定向到443,让浏览器重新用https协议去访问443端口。然后浏览器用https去访问443端口,服务器返回200状态码,链接就建立起来了。

虽然后续都是用https来进行加密传输,看似很安全,但是在一开始浏览器却是用http去访问的地址,可以把这个过程看作一个试探。我试一试你是不是http协议的呀?不是的话你就告诉我改用https,如果是那么你就直接回复200状态码给我,一举两得的一件事。

但是正是这个试探,让攻击者有了可乘之机。如果你的访问受到了中间人攻击,浏览器发出的这个试探性的包被攻击者截获,那么攻击者就可以将这个数据包发送给钓鱼网站。钓鱼网站返回一个http的数据包和200状态码,然后攻击者再将这个钓鱼网站的信息发送给你。你就和钓鱼网站建立了链接,而且是明文传输的链接。攻击者可以随心所欲的看到你的信息。并且巧妙的是,由于你经过了攻击者这个代理直接访问了钓鱼网站,并且你发出去的第一个试探性的包返回的是200状态码,浏览器会认为这就是正确的回包。所以不会去报隐私错误的问题,这使得你毫无察觉之间就进入了钓鱼网站。

私密链接报警提示

 

二、HSTS怎么运作的

如果我们在访问的时候不事先加上https://的话,每次访问都会默认以http去访问,那么浏览器每次都要去进行一开始的试探。这样就给了攻击者的可乘之机。HSTS的运作思路是,只需要在第一次去访问这个陌生网站的时候需要用到一开始的试探性的http数据包,随后这个网站会在http的回报中包含几个字段,其中有一个表明的就是持续的时间,比如3600秒。这就意味着在接下来的3600秒中,浏览器都可以默认用https协议去访问网站,而不需要每次先用http去试探。

HSTS最核心的也就是http回报中包含的字段,它定义了浏览器在加下来多久的时间内默认使用https来访问网站。并且在发现链接不安全后,强制拒绝用户的访问。

HSTS Header的语法如下:
Strict-Transport-Security: <max-age=>[; includeSubDomains][; preload]
其中:
max-age是必选参数,是一个以秒为单位的数值,它代表着HSTS Header的过期时间,通常设置为1年,即31536000秒。
includeSubDomains是可选参数,如果包含它,则意味着当前域名及其子域名均开启HSTS保护。
preload是可选参数,只有当你申请将自己的域名加入到浏览器内置列表的时候才需要使用到它。

HSTS可以让浏览器默认使用https进行链接。假如max-age字段的时间设置为一年,那么在一年以内,浏览器都会用https去访问这个网站。并且这个max-age是会存在于每一个从网站发出的数据包中,只要用户不停的和网站进行交互,那么这个一年的时限就会不断的刷新。只要用户与网站的两次交互不超过一年,那么HSTS就会一直处于有效期内。

HSTS还有一个特点,就是在发现链接不安全的时候会强制拒绝用户的访问。我们以谷歌浏览器为例,当你用谷歌浏览器去访问一个不安全的https链接,或者网站证书有问题的https链接时,谷歌浏览器会有错误信息提示给你,就像上面的图片那样。这个时候你理应要提高警惕,这个网站可能存在问题,或者你与网站之间的链接存在风险。但是如果你点击下面的高级按钮,就会出现继续访问的选项。你仍然可以继续访问这个网站。一旦HSTS生效就没有这么幸运了。在高级按钮中继续访问的选项会消失,浏览器会强制你无法进行访问。

三、没有绝对的安全

人们总是想让事情变得更加牢靠。虽然HSTS已经很严格了,出现不安全的链接会强制拒绝你的访问。但是仍然存在问题。在面对一个完全陌生的网站时,由于浏览器中没有存储其HSTS信息,尤其是max-age字段的值。也就自然要像文章一开始描述的一样,先用http去试探。获取到了max-age信息后再开启HSTS。但就是这一试探,仍然存在一个安全隐患。

人们不想这样,于是新的应对策略应运而生

我们可以在浏览器中内置一个列表,在列表中的网址直接默认开启HSTS,且没有过期时限。永远都默认使用https协议去访问。这也就是谷歌正在维护的一个列表,叫做Preload List。你可以将自己的站点申请进入这个列表,以获得更好的安全保护。

但是需要注意的是,一旦站点开启HSTS,那么就要保证https不要出问题。假如某个站点开启了HSTS,时限为1年,而恰巧这个站点的证书出现了问题。那么一个用户在一年的时间里都彻底访问不到这个站点。直到一年时限过去或者证书问题得到解决。如果这个站点加入了谷歌的Preload List,那后果更糟糕。毕竟这个列表里的HSTS可是没有时间限制的。

 

tips:如何申请加入Preload List
根据官方说明,你的网站在具备以下几个条件后,可以提出申请加入到这个列表里。
·具备一个有效的证书
·在同一台主机上提供重定向响应,以及接收重定向过来的HTTPS请求
·所有子域名均使用HTTPS
·在根域名的HTTP响应头中,加入HSTS Header,并满足下列条件:
·过期时间最短不得少于18周(10886400秒)
·必须包含includeSubDomains参数
·必须包含preload参数
当你准好这些之后,可以在HSTS Preload List的官网上(https://hstspreload.org)提交申请,或者了解更多详细的内容。

 

 

 

 

 

 

 

此条目发表在学习总结分类目录,贴了, 标签。将固定链接加入收藏夹。