原文链接:https://imququ.com/post/moving-to-https-asap.html
为什么我们应该尽快升级到 HTTPS?
最近一年,我写了不少有关 HTTPS 和 HTTP/2 的文章。很多同学都问我,HTTPS 真的有那么好吗,我的 WEB 服务需要迁移到 HTTPS 吗?对此我的观点是:HTTPS 早就不是锦上添花的可有可无项,它已经逐渐成为 WEB 服务的标配,推荐大家尽早升级。
HTTPS 可以给用户带来更安全、更好隐私保护的网络体验,这些好处大家都耳熟能详,本文不再赘述。目前各大浏览器都在积极推进 HTTPS 的普及,我们重点来说说这个。
HTTP/2 通过引入二进制分帧层,将 HTTP 的请求和响应报文拆分为二进制帧,从而实现了多路复用、优先级、Server Push 等诸多新特性,大大提升了 WEB 性能。HTTP/2 还引入了基于静态字典和动态字典的头部压缩算法 —— HPACK,有效减少了 HTTP 协议头部开销。现阶段,所有浏览器都只支持 HTTP/2 Over TLS,也就是说浏览器中的 HTTP/2 必须基于 HTTPS 部署。
一些 HTML5 API 可以用来获取用户地理位置、摄像头音视频等隐私数据。尽管网站在使用这些权限前需要获得用户授权,但由于 HTTP 很容易被劫持,通过 HTTP 传输这些隐私数据将会十分危险。
于是,Chrome 启用了 Deprecating Powerful Features on Insecure Origins 计划,今后以下 API 必须在安全环境(Secure Contexts)中才能使用:
其中,列表中的 Geolocaiton 和 getUserMedia 在 Chrome 50 中已经只能用于安全环境。也就是说在最新的 Chrome 中,要想通过 HTML5 API 获取用户位置,或者要用 WebRTC 实现视频聊天,都需要先部署 HTTPS。
EME 全称是 Encrypted Media Extensions(加密媒体扩展),它扩展了 HTMLMediaElement,提供了一组 API 用于控制受保护的文档,实现 HTML 媒体的数字版权保护能力。EME 是一个比较冷门的 API。
AppCache 功能已经被废弃,不推荐继续使用,类似需求建议用 Service Workers 来实现。更多说明请看 MDN 这篇文档。
至于什么是安全环境(Secure Contexts),W3C 这份文档进行了详细的解释。简而言之,HTTP 页面一定不是安全环境;HTTPS 页面不一定是安全环境。尤其需要注意的是,在 HTTP 页面中打开的 HTTPS 页面,如果 window.opener 不为空,不属于安全环境。
至于大家担心的本地调试问题,Chrome 也有考虑:
localhost
会被认为是安全的环境,所以可以继续使用localhost
域名测试上述 API;- 通过
--user-data-dir=/test/only/profile/dir
参数创建一个新的 Profile 后,可以通过--unsafely-treat-insecure-origin-as-secure="http://example.com
参数让 Chrome 信任指定的网站;
另外,Mozilla 公司在一年前也明确表态会逐步淘汰不安全的 HTTP,详见:Deprecating Non-Secure HTTP。
在往 HTTPS 迁移的过程中,大家普遍有一些担心,我挑选了一些有代表性的看法进行讨论。
HTTPS 会增加系统复杂性?首先,部署 HTTPS 确实会引入很多新工作,例如证书、SSL 配置、全站资源替换等等,确实会给开发和运维同学增加工作量。从 HTTP 切换到 HTTPS 的过程是比较麻烦,但一旦完成了切换,之后就不需要投入太多精力在这上面。通常,部署 HTTPS 只需要改造直接跟用户打交道的 HTTP 接入层,内部系统之间的调用无需改造。推荐阅读系列文章:启用 HTTPS 的经验分享。
HTTPS 证书会增加成本?首先,对于个人及小公司来说,有很多零费用的证书方案可供选择,其中以 Let’s Encrypt 最为出名,足够简单好用。而对于中大型公司来说,相比其他开销,HTTPS 证书采购成本基本可以忽略不计。
HTTPS 会导致性能下降?HTTPS 增加了 TLS 握手环节,再加上 HTTPS 应用数据传输需要经过对称加密,HTTPS 确实给性能优化提出了更大的挑战。好在随着服务器、浏览器以及 SSL 库在性能上的大幅提升,经过良好优化后 HTTPS 带来的性能损耗完全可以接受。更重要的是,部署了 HTTPS 意味着可以使用 HTTP/2,从而带给用户更好的性能体验。如果对 TLS 优化细节有兴趣,推荐阅读 TLS 握手优化详解,还可以访问 Google 性能优化专家 Ilya Grigorik 创办的 Is TLS Fast Yet? 网站。
非敏感内容不需要 HTTPS?很多人觉得只有银行、电商等跟钱打交道的网站才需要部署 HTTPS,其实不然。首先,非 HTTPS 网站很容易被劫持并插入广告,影响用户体验;其次,即使你的网站上没有交易支付等敏感功能,但只要有用户登录,帐号密码被第三方盗取也可以用来社工或撞库;最后,一些流量很大的网站,如果不部署 HTTPS 很容易被别有用心的人利用,例如 2015 年某大型网站的 JS 就被人劫持用来 DDoS 攻击 Github。
最后纠正一个误区:并不是说部署了 HTTPS,安全方面就可以高枕无忧。HTTPS 解决的只是数据传输过程的安全性和保密性,如果 WEB 程序或者服务器有安全漏洞,或者用户电脑中病毒了,那安全性无从谈起。最后,要让 HTTPS 发挥最大作用,往往还需要结合其它技术一起使用,例如 HSTS、HPKP 等,本文不展开讨论了。