我们真的有必要全站 HTTPS 么?

2016-10-18 22:12:44 +08:00
 jybox

SSL 同时保证了数据不被窃听和不被篡改,但也导致了通过 HTTPS 的请求无法被网络中的代理节点缓存 —— 缓存和代理本来是 HTTP 中协议中很重要的部分,但如果使用 HTTPS ,中间节点连 HTTP 头都读不到。

对于包含用户数据的请求用 HTTPS 我觉得是没有问题的;但其实更多的请求是图片、样式表和脚本,这些请求 只需要防篡改,而不需要防窃听,因此完全没有必要使用 SSL 。

我觉得更好的方式是通过 HTTPS 发送主页面,主页面中包含了所有引用的资源的校验和,然后被引用的资源以 HTTP 传输,可以被网络中的代理节点缓存(例如运营商可以在小区的出口路由处部署一个带缓存功能的代理,可节省很多骨干网的带宽),然后浏览器收到资源后检查校验和,确保资源没有被篡改。

<script src='scripts.js' sha256-checksum='e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'></script>

<img src='logo.png' sha256-checksum='cd372fb85148700fa88095e3492d3f9f5beb43e555e5ff26d95f5a6adc36f8e6' />

其实这就像很多 Linux 发行版的仓库一样,包本身有单独的 GPG 签名来防篡改,因此文件本身可以通过 HTTP 传输,也可以被代理和缓存。但是现在有一些源都支持 HTTPS 了,感觉很是浪费资源呀,也增加了用户可以感受到的延迟。

当然,我也很清楚现在 HTTPS 的大势所趋很大原因是因为运营商不按照规则去做缓存,但我觉得全站 HTTPS 是一种我们不希望看到的、不得已的做法,因此在此讨论一种更理想的可能性。

15415 次点击
所在节点    SSL
84 条回复
jybox
2016-10-18 23:43:15 +08:00
@jigloo CSS 和 JS 按我的理解应该是不能边下载边执行的,图片的话确实是一个问题(估计这也是 Subresource Integrity 只支持了 script 和 link 的原因,见我在主贴上的附言)。缓存和代理应该尊重 HTTP 中代理相关的头,这本来就是 HTTP 标准的一部分,并不会影响语义。
@wevsty 我是希望浏览器能够支持校验和,前面有人指出有个叫 Subresource Integrity 的特性提供了非常类似的功能,链接见我主贴上的附言。
ldbC5uTBj11yaeh5
2016-10-18 23:48:15 +08:00
@jybox

1. css/js 你的理解不对。
2. 在互联网谈尊重标准,这思路太过清奇。套用一句话,“假如标准有用,那么要 SSL 干嘛?”
xbb7766
2016-10-18 23:50:44 +08:00
恩,用 http 然后在淘宝上买什么不可描述的东西的话,中间任何一个人都可以获取,要是公司局域网的话,嘿嘿😜……
以及 Checksum 怎么传输? http?有心想篡改还不是分分钟的事情。
yidinghe
2016-10-18 23:51:02 +08:00
签名可以用来防篡改没错。但是如果内容的生成是动态的话,到最后还要给内容加一个签名,非常麻烦。
yidinghe
2016-10-18 23:54:13 +08:00
还有一点就是签名只能在篡改事后检查,而 SSL 一开始就防止篡改的发生。要知道运营商篡改内容十分霸道,不会因为你加了签名就不改,改了以后你的资源在页面上无法正常展示,用户并不知道是运营商的原因,还是照样骂你。
jybox
2016-10-18 23:54:19 +08:00
@jigloo SSL ( TLS 和 PKI )不也是一个标准嘛,如果客户端不遵守标准去校验证书、如果 CA 不遵守标准(规则)去给网站签发证书、如果浏览器和操作系统不去审查 CA ,那 SSL 同样没有可靠性可言。
Osk
2016-10-19 00:02:19 +08:00
宽带运营商缓存背锅:
1. HTTP 被跳到某 ISP 的 ip 然后来个 404, HTTPS 正常。
2. 下个 exe 居然没数字签名?! 上 vps 下载一查,数字签名正常。从此再也不敢乱用软件的在线更新,宁可手动下载安装, 谁知道软件收到的更新是什么呢?万一没验证,管理员权限一跑,拜拜。

从此对非 HTTPS 恐惧了, 有缓存是快,但谁知道有没有乱缓存? 作为用户,我才不管什么浪费带宽.

Subresource Integrity 虽好,但送我个 404 照样不如 HTTPS
czb
2016-10-19 00:07:39 +08:00
@jybox 客户端不检查证书?我知道的恐怕只有 360 了(不知道现在如何),其他稍微严谨点的浏览器都会去检查。 CA 不遵守,坦白说这个是问题(不过现在有 CT HPKP , CA 的滥发成本和风险有点高,不过确实这个是一个问题)。系统不审查 CA 是什么意思? CA Root 是植入的 所以说真正有可能的是第二点, CA 的规范性。不过你用 JS 也不能解决这个问题啊。。。 JS 方案在没有 CA 担保的情况下 Key-Exchange 的安全性会有问题
IvanLing
2016-10-19 00:10:23 +08:00
App Store 审核要求,明年必须支持 https 。
zrj766
2016-10-19 00:12:26 +08:00
非 https 弹广告蛋疼啊
czb
2016-10-19 00:19:48 +08:00
@czb 忽略我最后一句,串题了。。。。
skydiver
2016-10-19 00:23:02 +08:00
HTTP 的缓存规则是给客户端(浏览器)看的,不是给中间节点看的,本来中间节点就不该缓存。

HTTPS 不影响客户端缓存资源
lslqtz
2016-10-19 00:27:19 +08:00
css 可以直接将其他元素设为 display:none ,然后覆盖一张图片。
js 这个自然不用多说。
图片的话感觉没什么大问题 虽然也可以改
monnand
2016-10-19 00:27:45 +08:00
运营商:对啊对啊,我还能多帮你缓存一份广告,你看!
lslqtz
2016-10-19 00:30:14 +08:00
@jybox 你提供给 cdn 证书, cdn 用这个证书做你到用户的加密,然后回源也做加密, cdn 持有证书,就是这样。
msg7086
2016-10-19 00:30:34 +08:00
@jybox 中间人攻击的前提是「攻击」。
CDN 本身就应该是用户配置的。
用户配置上私钥的话,中间人缓存是能做到的。
就算不配置私钥,也可以通过两段式加密解决。

至于路由和代理缓存……
对,这才是「中间人攻击」。
HTTPS 就是为了防止这些中间路由和代理窃听数据的。
(我从网站上下载的小黄图,凭什么要给你路由和代理看?
(我下载某某银行的安全控件,凭什么要让移动电信知道?

我猜想你这么说的原因是你认为:
1. 网站管理员不应该负有配置 CDN 的义务;
2. CDN 缓存应该由运营商或者中间路由、代理来做,而且是自动地,和站长无关地做;
3. 静态数据的地址泄露不会影响用户安全。

然而这几种观点和现在互联网上的主流观点是相悖的。

刚刚看到你主题里提到的 Linux 的 GPG 问题。
这你的理解就完全错了。 Linux 的 GPG 根本不是为了解决 HTTPS->HTTP 问题的。
Linux 的 GPG 签名是打包人签名,目的是防止文件在服务器硬盘上被篡改,而不是网络传输过程中被篡改。
和这种机制类似的有代码签名,目的也是防止二进制文件在硬盘上或者安装包里被篡改。
也就是说,他们是没有办法去应用到「网站」上的,因为网站上的文件并不是整个由站长来生成的。
lslqtz
2016-10-19 00:31:20 +08:00
@skydiver 中间节点也应该缓存资源,不然要 cdn 何用,直接发个缓存头就行了
skydiver
2016-10-19 00:53:04 +08:00
@lslqtz CDN 是经过网站所有者同意的,一个转发的服务,本身既是客户端也是服务端,自然也遵守客户端缓存头。这和运营商不经过同意的缓存是两码事。
msg7086
2016-10-19 00:57:32 +08:00
@lslqtz 互联网正常的中间节点都是交换机路由器。
带大块硬盘的所谓「能缓存资源的中间节点」反而是个少见的东西。
lslqtz
2016-10-19 02:13:46 +08:00
@msg7086 我以为是 CDN ,不是中间节点。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/313702

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX