HTTPS 早就不是锦上添花的可有可无项,它已经逐渐成为 WEB 服务的标配。——JerryQu
HTTPS 是什么
HTTPS 是 Hypertext Transfer Protocol Secure
的缩写。HTTPS 利用SSL/TLS来加密数据包。HTTPS开发的主要目的,是提供对网络服务器的身份认证,保护交换数据的隐私与完整性。
HTTP 的安全性问题
众所周知,对 web 服务启用 HTTPS 普遍地比 HTTP 安全。HTTP 协议固然简单方便,易于部署,但是在设计之初也没有考虑安全性,所有内容都是使用明文传输,也就为现在的安全问题埋下了隐患。用户在基于 HTTP 协议的 web 应用上的传输内容都可以被中间者轻易查看和修改。
这里所谓的中间者是指网络传输内容需要经过的网络节点,既有硬件也有软件,比如代理服务器、DNS、路由、通信基站 . . . . . .这里面最容易拿到用户内容的就是各种通信服务运营商和二级网络带宽提供商。
我们身边就时常发生中间人攻击,比如:
- 使用移动数据浏览网页时运营商添加的流量球
- 浏览网页时底部莫名冒出来的广告
- 在下载文件时却得到了另外别的文件
- 等等等等 . . . .
HTTPS 为什么更加安全
通俗一点讲,HTTPS 有以下一些安全方面的优势。
- 内容在传输过程中使用了对称加密,所以不会被第三方查看到。就像快递员运输的包裹都进行了封装,别人无法知道里面装了什么东西。
- 数据完整性。及时发现被第三方篡改的传输内容。就像快递员虽然不知道包裹里装了什么东西,但他有可能中途掉包,数据完整性就是指如果被掉包,我们能轻松发现并拒收。
- 身份校验。保证数据到达用户期望的目的地。就像我们邮寄包裹时,虽然是一个封装好的未掉包的包裹,但必须确定这个包裹不会送错地方。
HTTPS 的劣(wu)势(qu)
在种种反对 HTTPS 的呼声中,我挑选了一些具有代表性的看法列举在这里,并加以讨论——
HTTPS 导致性能下降?
HTTPS 链接和 HTTP 链接都建立在 TCP 协议之上。HTTP 链接比较单纯,使用三个握手数据包建立连接之后,就可以发送内容数据了。但是HTTPS 链接在这三步结束以后,它还有一个 SSL/TLS 握手的环节,再加上 HTTPS 应用数据传输需要经过对称加密。所以使用 HTTPS 连接的过程的确会比 HTTP 复杂。
但是,随着服务器、浏览器在性能上的大幅提升,经过良好优化后 HTTPS 带来的性能损耗完全可以接受。更何况,部署 HTTPS 便可以启用 HTTP/2,大大提升 WEB 性能。所有浏览器都只支持 HTTP/2 Over TLS。也就是说,浏览器可以使用的 HTTP/2 必须基于 HTTPS 部署。
HTTPS 并不非常可靠?
是的。但是,并没有任何一种协议和加密方式是彻底安全的。HTTPS 在一定程度上,依旧可以保证用户传输数据的安全。
HTTPS 的几个常见安全问题:
- web 服务提供商没有做自动从 HTTP 跳转到 HTTPS,所以用户可能还是会通过不安全的 HTTP 访问提供的 web 服务。
- 就算 web 服务提供商设置了从 HTTP 用 301 或者 302 跳转到 HTTPS,首次连接也需要使用 HTTP,中间人依然可以在第一次连接时发起攻击。
- 就算启用了 HSTS,让浏览器在以后访问该站点时都默认永久在浏览器本地预先用 307 做好从 HTTP 跳转到 HTTPS,并杜绝不安全的 HTTPS 链接,但第一次访问时浏览器才可能得到 HSTS 响应头,中间人甚至可以在第一次连接时入侵并劫持和替换成攻击者自己的证书(心血漏洞)。
心血漏洞的一个典型案例就是,在今日头条的官网下载手机客户端,就算已使用 HTTPS 访问,每次按下下载按钮下载下来的安装包的 MD5 检验都是不一样的(由 WJXXBSH 发现)
目前我的域名已经加入了 HSTS Preload List,内置在现代的浏览器内,通过浏览器更新分发到全球各地。这是目前唯一可以避免心血漏洞的办法。
启用 HTTPS 很复杂?
从 HTTP 切换成 HTTPS 确实会引入很多新工作,例如生成 CSR 和获取证书、SSL 配置、全站资源替换、配置 web 服务端环境,等等等等。从 HTTP 切换到 HTTPS 的过程是比较麻烦,但是一旦完成了所有工作,之后就不需要投入太多精力在这上面。
我切换 HTTP 到 HTTPS 花了我一晚上,我觉得是绝对值得的。
HTTPS 成本很高?
为了让浏览器确认你的 HTTPS 安全,你的证书必须要从根证书颁发机构购买浏览器和客户端能够识别的 SSL 证书。但是对于个人来说,有很多零费用的证书方案可供选择,比如 Let’s Encrypt。而对于中大型企业来说,HTTPS 证书采购成本基本可以忽略不计。
我的博客就采用了 Let’s Encrypt 的 SSL 证书,
我的个人主页则是用 TrustAsia 的 SSL 证书(个人主页更换主机商,已经主动将 TrustAsia 的免费 SSL 吊销。现在旗下所有网站都在用 Let’s Encrypt)。我用的这些证书都是免费的。
我的网站没有敏感内容,所以不需要 HTTPS
这就是 “一句” 的开发者所坚持的 “HTTPS 无用论” 观点的核心内容。
实际上,并不是只有银行、电商等跟钱打交道的网站才需要部署 HTTPS。首先正如我之前列举和说明的,非 HTTPS 网站很容易被劫持和攻击、插入广告,严重影响用户体验。再比如,一些流量很大的热门网站,如果不部署 HTTPS 很容易被别有用心的人利用,例如 2015 年国内某著名大型网站的 JS 就被某些“自己人”主动劫持,用来 DDoS 攻击 Github。
在 2017 年,再一次出现了百度统计的 JS 被劫持后用来攻击法轮功境内镜像网站的事件,详情可看 V2EX 这篇帖子。
当然,如果你的站点根本不在乎用户体验,当然我们也无话可说。
当然,并不是说部署了 HTTPS 就可以高枕无忧。HTTPS 解决的只是数据传输过程的安全性和保密性。用户客户端被病毒感染、服务端被入侵、使用有漏洞的证书签发商签发的 SSL 证书(如沃通漏洞事件和 CNNIC 滥签事件),SSL 证书过期或者失效,都会引起 HTTPS 环境的不安全。
简而言之,HTTPS 页面不一定是安全环境。但是无论如何,HTTP 页面一定不是安全环境。
如今,Chrome 已经 开始 主动把 HTTP 页面标记为 不安全, Safari 也开始推进 HTTPS。现在的 HTTPS,正如 JerryQu 所说,HTTPS 已经不再是锦上添花的可有可无项,它已经逐渐成为 WEB 服务的标配。