网站导航:首页-计算机网络知识-详解HSTS

详解HSTS

第一部分:为什么要使用HSTS

  超文本传输协议(HTTP协议)通常被用于在web服务器与浏览器之间的消息传递,但HTTP协议确实以明文的方式发送内容,他不提供任何方式的数据加密。在这种情况下如果传输的报文被攻击者在web服务器与客户端之间截取了,攻击者就能够直接读懂其中的信息,因此HTTP协议并不适合用来传输一些如信用卡卡号、密码等敏感信息。

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

  尽管如此,使用了HTTPS就一定是安全的么?答案并不是这样的,因为现在的浏览器默认都是用HTTP协议传输数据的,而网友们在输入网址的时候,通常不会输入协议名,所以即使网站配置了HTTPS协议,但网友访问时都会默认通过HTTP这种不安全的协议来传输的。为了解决这个问题,目前有两种方案:方案一,关闭web服务器上的HTTP传输协议,这样用户就只能通过HTTPS这种安全的协议来访问,但由于浏览器默认使用HTTP协议,所以这样做可能会导致部分用户无法正常访问网站;方案二,在HTTP协议中配置一次重定向,当浏览器发起一个HTTP请求的时候,浏览器返回重定向,浏览器再发起一次HTTPS请求,最终得到相应内容。但方案二中所有的这一切对于用户来说都是完全透明的,再用户眼里,在浏览器中直接输入了域名,却仍然可以用HTTPS协议和网站进行安全的通信,但其实,服务器和浏览器帮用户做了很多工作,如下图所示。

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

  在上图中,浏览器向网站发起一次HTTP请求后得到了一个重定向响应,而后浏览器再次发起HTTPS请求,最终得到服务器的响应内容。这所有的过程对用户而言是完全透明的,在用户眼里看来,在浏览器里直接输入域名却依然可以用HTTPS协议和网站进行安全的通信,是个不错的用户体验。

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

SSL剥离攻击图解

  • 第1步:浏览器发起一次明文HTTP请求,但实际上会被攻击者拦截下来
  • 第2步:攻击者作为代理,把当前请求转发给钓鱼网站
  • 第3步:钓鱼网站返回假冒的网页内容
  • 第4步:攻击者把假冒的网页内容返回给浏览器

  上述过程中攻击者直接劫持了浏览器发起的HTTP请求,并返回了虚假内容给浏览器,浏览器并没有同真实网站建立HTTPS连接,自然也就不会向用户报告当前的连接不安全。于是攻击者几乎可以神不知鬼不觉的对请求和响应动手脚。

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

第二部分:HSTS的作用及配置方法

一、HSTS的作用

  由于浏览器默认使用的是http协议,所以即使网站配置了https仍然有可能遇到降级攻击,这个降级攻击的精妙之处就是攻击者直接拦截了最初的http请求,并返回内容给浏览器,并没有给浏览器建立https链接的机会,浏览器会误认为网站就是通过http对外提供服务的,所以也就不会在向用户报告当前连接不安全,攻击者就可以在不知不觉中对请求与响应动手脚。

  由于连接被劫持的原因就是在https请求前有了一次http请求,所以我们希望当用户发起http请求的时候,浏览器直接将http请求转换为https请求,而不是通过http的重定向,从而规避风险,如下图所示。

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

  在这里面的过程如下:

  • 第1步:用户输入网站域名,浏览器判断到此域名需使用https协议进行通信;
  • 第2步:浏览器直接向网站发起https请求;
  • 第3步:网站返回相应内容。

  以上就是HSTS的作用之一,HSTS还有一个作用,就是强制浏览器拒绝不安全的连接。当使用https连接网站时,由于证书错误等原因浏览器会给出风险提示,告知用户本次访问存在风险,但此时用户仍然可以忽略风险提示继续访问网页,这样则可能会给用户带来损失,网站主办者为了防止给用户带来损失,也可以通过HSTS来阻止用户忽略浏览器的警告继续链接网站。

二、配置HSTS

  给网站配置HSTS就是在对应网页中增加一个HSTS的响应头,下面就介绍一下HSTS Header的语法规则。

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

  其中:

  max-age是必须存在的参数,这是一个以秒为单位的时间,代表着HSTS Header的过期时间,当第一次访问网站时,如果浏览器发现这个响应头,就会把域名保存起来,保存时间就是设置的max-age的时间,在这个时间过期前,浏览器始终用安全的https协议进行连接,始终不允许用户忽略浏览器经过,继续访问不安全的网页。如果设置为1年,则此值应为31536000

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

  preload是可选参数,这个参数关系到你是否允许将你的域名加入HSTS Preload List,包含此参数是加入HSTS Preload List的必要条件之一。关于HSTS Preload List,将在第三部分介绍。

第三部分:HSTS Proload List

一、攻击者仍有可乘之机

  即使我们已经部署好了HSTS,但攻击者仍有可乘之机,因为在HSTS中存在一个薄弱环节,那就是当浏览器还没有网站的HSTS信息时(通常是第一次访问此网站时),仍然是通过明文的HTTP请求和一次重定向才能切换到HTTPS并刷新HSTS信息。那么这次的HTTP请求的一瞬间,使得攻击者可以把这一次HTTP请求劫持下来,继续中间人攻击。

二、解决方法:HSTS Preload List

  针对这种攻击,HSTS也有应对的方案,那就是在浏览器中内置一个列表,只要是这个列表中的域名,无论任何时候,浏览器都只能使用HTTPS发起连接,这样即使在第一次访问网站时也可以直接通过HSTS来强制发起HTTPS连接了。

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

三、如何加入HSTS Preload List

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

  • 网站具有一个有效的证书
  • 如果接收HTTP请求,那么此请求要重定向到HTTPS
  • 域名的所有子域名均使用HTTPS
  • 在域名的HTTP响应头中,加入HSTS Header,且过期时间最短不得少于18周(10886400秒)、必须包含includeSubDomain参数、必须包含preload参数

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

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

总结

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

已经到本页底线啦,您可以:返回目录页|返回首页