Google Chrome新安全策略:https网页只能加载http资源

2019-12-06 21:25:46
每天都在使用Google Chrome的Canary金丝雀版,金黄色的Logo,总能在冬日里给人以很暖的感觉,以及比较高的逼格。

对比Beta版,Canary的升级频率,几乎每天一次,然而在最近的一次更新中,我发现原来在https页面可以播放的视频,全部都无法播放了,而资源服务器运转正常。

F12打开Chrome的控制台,你会看到Chrome阻止(block)了http视频链接的加载。

·https下不能加载http内容

原则如上,然而,在实际执行过程中,Chrome等浏览器都适当做了变通。变通的规则异常简单:

  1. 对于图片、图标、背景图、CSS和JS等直接在网页内引用的静态资源文件,如果网页链接的协议是https,则这部分资源的协议也必须是https,并且能够提供有效的证书。
  2. 对于部分图片、音乐、视频等较大的文件,https的网页可以直接加载http的内容,但会地址栏的锁头图标,会变成 不安全 字样,打开控制台可见,该网页包含不安全的内容。Chrome把这部分内容称作 混合内容
  3. 如果从https页面,链接到http的页面,包括下载文件,则不会受到安全策略的限制。

·为什么要制定上面的规则

原因简单而实际,因为早期https的普及率很低,由于网站结构的复杂性,相当多的网站,虽然网页应用了https协议,而其中的图像、视频、音频依然使用的是http。特别是对于大型的静态资源和流媒体内容,部分基础服务供应商对于https的请求,采用了区别于http的计费方式,https流量单价往往更高。

如果贸然阻止所有的混合内容,势必会影响用户体验,让用户无法正常浏览网站的内容。

然而,混合内容,使得用户无法完整享受https带来的安全体验,用户的隐私依然可能通过这些https网页上的http内容泄漏出去。使得加密变得不那么有效,让用户依然处于安全威胁之下。 GitHub中国见面会深圳站演讲现场的秦始皇兵马俑卡通形象

·Google决定简化Chrome的安全策略,针对https网页的新规则公布

蓦然回首,距离上述安全策略的规则制定,已经过去了数个年头。Google在推行https上,一直表现得很谨慎,事实上,几乎没有采用任何激进的策略,从对https的网页提示安全,到对http网页提示不安全,最显著的改变也不过如此。

2019年10月,Google终于决定调整Chrome针对https的网页安全策略,新策略回归初心,只有一条规则:

https页面将只能加载https子资源

混合内容将成为过去式,这意味着,如果你的网站采用了https协议,那么网站对应的所有资源文件,也需要采用https协议,并且需要保证证书有效。

不符合规则的内容,将不再被加载。而Chrome决定采用熟悉的时间表方式,来推进新规则的应用。

GitHub中国见面会深圳站演讲现场的铺满GitHub和ECharts卡通贴纸

·Google Chrome新规则推行时间表

Chrome79版本,默认会阻止https页面下所有http资源的加载,但是同时会提供一个设置项,允许用户开启混合内容,即加载被阻止的http资源。

Chrome80版本,会自动将https页面中的视频和音频的http请求,自动升级为https请求,如果视频和音频无法通过https协议访问,则会被阻止。Chrome80稳定版,预计将于2020年1月发布。

Chrome81版本,会自动将https页面中的图片的http请求,自动升级为https请求,如果图片无法通过https协议访问,则会被阻止。Chrome81稳定版,预计将于2020年2月发布。

GitHub中国见面会深圳站提供的甜点

·我们能做点什么

为应对全新的https的网页安全策略,我们需要对网站的所有资源文件进行检查,确保这部分资源都支持https协议。注意,仅仅监听资源服务器的443端口,是没有用的,你需要给资源的域名部署可信的SSL证书。

1. SSL证书的选择:

对于昂贵的EV证书,大部分网站使用DV证书就可以满足需求,这里推荐Let's Encrypt的证书,一次申请,只能获得三个月的有效期,但看看项目的赞助商Mozilla、Cisco、Akamai、IdenTrust、EFF,你就可以预见这款证书的兼容性有多好了。当然,国内还有大量提供免费证书的服务商。

需要注意的是,根据小宇的实际的部署经验,建议将证书和根证书放到一起。这样能够提高免费证书在部分浏览器的兼容性。有些浏览器没有内置免费服务商的根证书,依然会报证书不安全的提示。

GitHub中国见面会深圳站提供的甜点,巧克力饼干,水果

2. 第三方资源的调用:

事实上,很多网站部署的https协议,面临的最大困难,不是自身,还是第三方资源本身不支持https协议,这样的情况,包括使用了资源库的影视站,各种依靠采集部署的站群,以及依靠第三方云服务,如图床等托管静态资源的网站。

对于这些网站,除了将资源采集到本地,联系云服务商升级https协议之外,自食其力的做法,就是对部分资源采用反向代理的方式,缓存到https域名下,进行加载。整个步骤实施起来,其实也很容易,但与本文关联不大,就不再赘述具体步骤了。

·写到最后

你一定已经注意到本文的截图了,这些截图来自GitHub中国见面会,深圳站,总之是一次非常友善,好吃,并且能够收集贴纸的会议。这次见面会特别选择了秦始皇兵马俑作为卡通代言人,足见GitHub对中国年轻人的重视。