HTTPS 一定安全么
HTTP 协议,本身是明文传输的,没有经过任何安全处理。那么这个时候就很容易在传输过程中被中间者窃听、篡改、冒充等风险。这里提到的中间者主要指一些网络节点,是用户数据在浏览器和服务器中间传输必须要经过的节点,比如 WIFI 热点,路由器,防火墙,反向代理,缓存服务器等。HTTP 协议,中间者可以窃听隐私,使用户的敏感数据暴露无遗;篡改网页,例如往页面插的广告内容,甚至进行流量劫持,比如有的时候你会发现域名没输错,结果却跑到了一个钓鱼网站上,因为被它劫持了。
此时,HTTPS 的价值就体现出来了。HTTPS 协议在应用层的 HTTP 协议和以及传输层 TCP 协议之间的会话层加入了 SSL/TLS 协议,用作加密数据包。在真正数据传输之前,进行握手通信,握手的信息交换主要包括:双方确认加密协议的版本,确认身份(其中浏览器客户端的身份有时是不需要确认的),确认传输真正数据的加密密码(对称加密)。在用作信息传输的加密密码确认之后,接下来的通信数据都会加密后再传输,从而达到防窃取的作用。原理剖析,可以参考我之前的文章《HTTPS原理剖析与项目场景》。
那么,使用了 HTTPS 就能确保安全传输了吗?理论上,是的,但是,现实却不是如此。
设计和实现 SSL/TLS 协议出现了漏洞,导致攻击者同样可以攻击一些旧版本的 SSL/TLS 协议。这其中就包括 SSL 3.0。
什么是 HTTPS 降级攻击
攻击者可利用 SSL 3.0 漏洞获取安全连接当中某些是SSL3.0加密后的明文内容。因为兼容性问题,当浏览器进行 HTTPS 连接失败的时候,将会尝试使用旧的协议版本,于是,加密协议由更加安全的协议,比如 TLS 1.2降级成 SSL 3.0。
如果服务器提供有漏洞的 SSL 3.0 协议的支持,同时,攻击者又能作为中间人控制被攻击者的浏览器发起漏洞版本的 HTTPS 请求,那虽然攻击者监听到的也是加密过的数据,但因为加密协议有漏洞,可以解密这些数据。攻击者可以利用此漏洞,截获用户的隐私数据,比如 Cookie,这样攻击者就可以拿到这些隐私数据,进行更深层次的攻击,进而造成了用户隐私的泄漏。
解决之道
目前,唯一解决问题的方法是禁用 SSL 3.0 加密协议,防止TLS 1.2 或者 TLS 1.1 或者 TLS 1.0降级到 SSL 3.0 加密协议。
禁用的策略有很多,这里主要讲解下 Nginx 如何防止 TLS 降级到 SSL 3.0 以下版本,从而防止 HTTPS 降级攻击。
原先的配置如下。值得注意的是,隐性默认是SSLv3 TLSv1 TLSv1.1 TLSv1.2。
- ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
禁用的操作很简单,现在改成这样即可。
- ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
总结
HTTPS 能确保安全传输了吗?答案是,不一定,因为旧的版本存在安全漏洞,可能会被攻击者进行 HTTPS 的降级攻击。所以,SSL 3.0 协议以下版本并不安全,因此,为了防止 HTTPS 的降级攻击,我们需要禁用它。