网站导航:首页-计算机网络知识-HTTP严格传输安全(HSTS)详解

HTTP严格传输安全(HSTS)详解

最近更新:2018-12-28

HTTP存在的问题

超文本传输协议(HyperText Transfer Protocol,HTTP)通常被用于web服务器与浏览器之间的消息传递,但HTTP是以明文的方式发送内容,他不提供任何方式的数据加密。在这种情况下如果传输的报文被攻击者在web服务器与客户端之间截取了,攻击者就能够直接读懂其中的信息,因此HTTP协议并不适合用来传输一些如信用卡卡号、密码等敏感信息。同时HTTP也无法验证得到的响应是否来自所请求的服务器(无法判断数据有没有被中间人篡改),因此甚至有可能得到一些假信息。


HTTPS

为了解决HTTP的这种缺陷,就需要另一种更安全的协议,即HTTPS(Hypertext Transfer Protocol Secure)。HTTPS是一种以安全为目标的HTTP通道,它在HTTP的基础上加入了SSL层,SSL是HTTPS的安全基础,SSL依靠数字证书来验证服务器的身份,并为浏览器和服务器之间进行通信的加密。

HTTP与HTTPS的差异

应用HTTPS中存在的问题

尽管HTTPS可以有效的防止数据被窃听或被篡改,但由于目前的浏览器默认是使用HTTP,而用户在输入网址的时候,通常不会主动输入协议名,所以有很多流量都是以HTTP的形式来传输的。如果彻底关闭HTTP而强制使用HTTPS将可能导致部分流量的损失。

为了解决这个矛盾,通常是在收到HTTP的请求后,不直接响应网站内容,而是响应一次重定向,要求浏览器重新发起一次HTTPS请求。但由于这一切对于用户来说都是完全透明的,再用户眼里,在浏览器中直接输入了地址,却仍然可以用HTTPS与网站进行安全的通信,但其实,在这个过程中,服务器和浏览器帮用户做了很多工作,如下图所示。

通过http协议访问重定向至https网站图解

在用户眼里看来,在浏览器里直接输入域名却依然可以用HTTPS协议和网站进行安全的通信,是个不错的用户体验。

但它其实并不像看起来的那么的完美,由于在建立起HTTPS连接之前存在一次明文的HTTP请求和重定向,使得攻击者可以以中间人的方式劫持这次HTTP请求,从而进行后续的攻击,例如窃听数据,篡改请求和响应,跳转到钓鱼网站等。这种攻击方法被称为SSL剥离攻击,也叫作降级攻击,如下图所示。

SSL剥离攻击图解

上述过程中攻击者直接劫持了浏览器发起的HTTP请求,几乎可以神不知鬼不觉的对请求和响应动手脚。


HSTS的作用

为了解决这个问题,国际互联网工程组织IETF正在推行HTTP严格传输安全(HTTP Strict Transport Security,HSTS),HSTS的作用是强制客户端(如浏览器)使用HTTPS与服务器创建连接。

在用户通过HTTP访问网站时,浏览器首先检查所访问的域名是否在浏览器的HSTS列表中,如果不在则正常发送HTTP请求,如果在列表中,则浏览器会自动通过HTTPS发送请求,由于从HTTP替换为HTTPS是在浏览器端执行的,自然也就不存在中间人攻击的可能,如下图所示。

浏览器直接将http请求转换为https请求

在这里面的过程如下:

除此之外,HSTS还有一个作用,就是强制浏览器拒绝不安全的连接。当使用HTTPS连接网站时,由于证书错误等原因浏览器会给出风险提示,告知用户本次访问存在风险,但此时用户仍然可以忽略风险提示继续访问网页,但如果这个网站的域名在浏览器的HSTS列表中,浏览器会阻止用户忽略浏览器的警告继续链接网站。


如何为网站配置HSTS

给网站配置HSTS就是在对应网页中增加一个HTTP Header,其语法规则如下:

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

其中:

max-age是必须存在的参数,这是一个以秒为单位的时间,代表着HSTS的过期时间,当用户访问网站时,如果浏览器发现这个响应头,就会把域名保存到HSTS列表中,保存时间就是设置的max-age的值,在它过期前,浏览器始终用安全的HTTPS协议进行连接,始终不允许用户忽略浏览器警告,继续访问不安全的网页;

includeSubDomain是可选参数,如果包含这个参数,则当前域名及其所有子域名都受到HSTS的保护,否则将只对有当前域名进行保护;

preload是可选参数,包含此参数是加入HSTS Preload List的必要条件。(什么是HSTS Preload List


攻击者仍有可乘之机

即使网站已经部署好了HSTS,但攻击者仍有可乘之机,因为在HSTS中存在一个薄弱环节,那就是当浏览器还没有网站的HSTS信息时(通常是第一次访问此网站时)发起的HTTP请求不会被浏览器自动替换为HTTPS,那么这次的HTTP请求,仍然可以被中间人攻击。


HSTS Preload List

针对这种攻击,HSTS也有应对的方案,那就是HSTS预加载列表(HSTS Preload List),这个列表中的域名被内置到浏览器的HSTS列表中,使得用户下载到浏览器时就含有相关网站的HSTS信息,也就避免了中间人攻击的情况。

目前HSTS Preload List由Google Chromium维护,FireFox、Safari等主流浏览器都在使用这个列表。


如何加入HSTS Preload List

根据官网文档的说明,加入HSTS Preload List的必要条件为:

上述条件中有一条是在HSTS Header中必须包含preload参数,这是因为在加入这个预加载列表的时候并不会像申请SSL证书那样去验证域名的所有权,所以为了防止他人恶意为别人的网站申请加入HSTS Preload List,所以才令所有需要加入这个列表的地址都要配置preload参数。换句话说,如果你不希望自己的网站加入HSTS Proload List,那么就不要在header中添加这个参数。

当网站满足这些必要条件后,就可以到HSTS Preload List官网上提交申请,提交申请后,首先系统会自动检查你的网站是否满足条件,如果不满足,网站会给出修改提示,如果满足则进入人工审核阶段。从自动审核通过到人工审核完成,成功加入到HSTS Proload List需要等待几天到几周不等的时间。此时也可以通过HSTS Preload List官网来查询申请状态。


总结

随着越来越多的网站开始使用HTTPS,甚至是全站开启HTTPS,数据在传输过程中的安全性能够得到极大的保障。与此同时,通过HSTS的帮助,避免中间人攻击使得数据通信变得更加安全。希望通过本文对HSTS的解析,让更多的开发团队了解到HSTS,并运用到自己的项目中。

到底线啦,请:返回目录页|返回首页