最近一年,我写了不少有关 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 等,本文不展开讨论了。
本文链接: https://imququ.com/post/moving-to-https-asap.html , 参与评论 。
-- EOF --
发表于 2016-05-16 23:55:20 ,并被添加「HTTPS、 Chrome 、HTTP/2」标签。