06:装了一个证书,你的所有 HTTPS 就全裸了
大家好,我是毛衣哥。上一期我们把 HTTP 扒光了,这一期来看看加了锁的 HTTPS 又是怎么被一步步拧开的。准备好瓜子,七步拆完。
前几篇反复在说"装证书是关键"。但你有没有停下来认真想过——那个安装证书的弹窗,当你点了"确定"之后,到底发生了什么?
这篇不聊协议细节了,就聊一件事:你装在系统里的那个抓包 CA,到底有多大权力。
装一个 CA 证书 = 给了抓包工具一把万能钥匙
先跟你讲个故事。
2015 年,安全公司 Netcraft 发布了一份报告。他们在互联网上扫描了数百万个 HTTPS 网站,发现了一个奇怪的现象:
很多网站的证书是被同一个未知 CA 签发的。
这个 CA 不在任何操作系统预装的根证书列表里。它是一个"自定义的"CA,被安装在了数百万台电脑上——每次用户安装某款知名的"免费 WiFi 加速软件"时,就被一起装上了。
这款加速软件做的事情就是:中间人劫持你的 HTTPS 流量,注入数据压缩层。理论上它声称可以帮你节省流量。实际上它能看到你所有的 HTTPS 数据。
这个案例的后续是:安全社区发现了这个行为,通报了 Google。Chrome 开始对这款软件的证书发出警告。
但重点不是那个软件做了什么。重点是:你"自愿"安装了它的 CA。一旦装了,它什么 HTTPS 都能看到。
你装的那个抓包 CA 能做什么?我们一条条列出来
假设你装了 Charles 的 CA。
Charles 现在可以:
1. 完整看到你访问的所有网站的 URL
不只是域名。是完整路径。包括:
https://github.com/gongzhxu/dumpany-desktop/pull/123https://mail.google.com/mail/u/0/#inbox/xxxxxxxxhttps://www.yinlian.com/transfer?to=xxxx&amount=10000
SNI 只是域名。中间人拿到的是完整路径。
2. 完整看到你所有 POST 请求的内容
登录密码、支付金额、聊天内容、文件上传——解密之后全是明文的 JSON、表单数据、或者文件流。
3. 完整看到服务器返回的所有数据
你的个人资料、你的订单列表、你的聊天记录、你刷到的推荐内容——全部可见。
4. 看到所有的 Cookie、Session Token、API Key
一个 https 请求在 Header 里附带的Cookie: sessionid=xxxx——中间人拿到了,可以直接拿去冒充你登录。
5. 甚至能看到一部分"不应该看到"的数据
比如你访问某些网站时,网站会返回Set-Cookie: HttpOnly; Secure——设置为 HttpOnly 的意思是 JavaScript 不能读取这个 Cookie(防 XSS)。但中间人可不管这个——它不在浏览器里,它解密了 HTTPS 之后,所有的 Cookie 都是明文的,包括 HttpOnly 标记的 Cookie。
技术上,它看不到的是什么?
- 端到端加密的应用层数据(如 Signal 协议的内容——中间人只能看到 Signal 的加密 payload)
- 对证书做了固定(Certificate Pinning)的应用的流量
- 不走系统代理的应用的流量
但对于 99% 的普通用户来说,装了 CA 之后,所有 HTTP 相关的隐私对抓包工具来说都是完全透明的。
如果你用的抓包工具有后门
说一个更让人不安的。
Charles 是一个商业软件。Fiddler 是 Telerik 的产品。mitmproxy 是开源项目。
正常情况下,它们不会记录你的隐私数据上传。但假设——哪天 Charles 的某个版本被植入了一个后门(或者你用了一个破解版),
那么你在装 CA 之后,这个软件可以做的事情就是:
- 每当你访问银行网站时,记录你的登录凭证
- 每当你访问社交媒体时,记录你的私信内容
- 把你所有的 HTTPS 流量元数据回传到某个服务器
为什么这比"不发 CA 的恶意软件"更危险?
因为不装 CA 的恶意软件只能在非加密流量中找东西(HTTP、DNS、IP 信息)。装了 CA 之后,它就有了 HTTPS 内容的完整视图。
但注意,Charles 的官方正版不会做这事。这里说的是"如果"有人用了破解版或恶意版本。
Superfish 事件——一个经典的警示
2015 年,联想被曝光在部分消费级笔记本电脑上预装了一款叫Superfish的广告软件。
Superfish 做了什么?
- 在用户系统里安装了自己的 CA 根证书
- 劫持所有 HTTPS 流量,在网页中注入广告
- 最致命的是:Superfish 给所有受影响的电脑安装的是完全相同的 CA 私钥
安全研究员花了一会儿功夫,提取出了这个 CA 的私钥。然后发布到了网上。
这意味着什么?
任何安装了 Superfish 的电脑,都相当于对全世界公开了自己的 HTTPS 流量。因为任何人都可以用这个私钥去解密 Superfish CA 签发的流量。所有电脑用的是同一个 CA,一个 CA 的私钥被公开,等同于所有装了 Superfish 的用户的 HTTPS 对全天下都是透明的。
联想的后果:被集体诉讼,赔偿了 350 万美元。Superfish 被微软标记为恶意软件,通过 Windows Defender 自动移除。
这个事件的教训:
- 不要在用户电脑里装你自己的 CA(尤其是不告诉用户的时候)
- 即使是装 CA 做 MITM(比如企业防火墙),也要用唯一的、妥善保护的 CA 私钥
- 用户完全不知道"装一个 CA"意味着什么——他们看到的只是"不装这个证书你就没法上网"
企业级 MITM 的另一种规模
你可能没在中型以上公司待过,不知道企业 IT 部门做的事情。
很多公司会在员工电脑上安装企业的根证书。理由通常是 **“为了安全监控”**或"为了能正常使用公司内网"。
员工没得选,因为不装的话很多内部系统都打不开。
装了之后:
IT 部门可以通过 SSL 解密网关(比如 Zscaler、Symantec Web Security Service)看所有经过公司的网络流量。包括:
- 你上班时刷的知乎内容
- 你在淘宝买的东西
- 你发的邮件(Webmail)
- 你访问的个人网银(虽然不应该,但技术上确实能)
这里稍微说句公道话:大多数公司 IT 部门不会这么做——一是法律风险,二是他们没空看你每天刷什么。但也有公司确实会。如果不确定,可以假设公司里有人能看你的 HTTPS 流量,然后决定要不要在办公电脑上做私事。
既便如此,为什么我们还信任 CA 体系?
说了这么多恐怖的事,你可能想问:CA 体系是不是设计错了?
不是。CA 体系设计的目标是保护你的通信不被第三方攻击者破解。它不保护你主动安装恶意 CA 的情况——因为如果用户自己装了一个 CA,就相当于用户说"我信任这个东西"。
CA 体系的假设是:攻击者不能在你的系统里安装它的根证书。
所以:
- 你在公共 WiFi 上连了一个假热点?→ CA 能防住(假热点没法给你装 CA)
- 你的运营商劫持了你的 DNS?→ CA 能防住(运营商看不到你的加密内容)
- 你下载了一个破解版抓包工具并装了它的 CA?→ CA防不住(你主动装了)
所以,CA 体系在所有"攻击者不能碰你系统"的场景下都管用。一旦攻击者能碰你的系统(或者你自己装了什么东西),安全的防线就转移到"你装的东西靠不靠谱"上了。
那问题就成了:你知道你装的那个 CA 是靠谱的吗?
下期预告:非对称加密的饼。RSA 和 ECDHE——用颜料混合的比喻把一个加密领域最难的概念讲清楚。
DumpAny 怎么做:正因为知道 CA 权限有多大,DumpAny 在设计上做了一些自我约束:抓包数据只在本地处理,不会上传到任何云端;CA 私钥只保存在本地,不随产品更新替换;所有解密后的数据在抓包会话结束后可以选择自动清理。这些设计不是为了炫技,而是为了让用户在信任 DumpAny 时不至于后悔。
💬 聊几句:
- TLS 握手七步中,你觉得最关键的是哪一步?为什么?
- 你平时会去看 TLS 握手的细节吗?还是在用工具一键搞定?
- 如果有一天互联网的 CA 体系崩塌了,你觉得会发生什么?
- 你有没有遇到过证书相关的线上问题?怎么排查的?
