eMudhra 证书事件:起因、我们为什么受影响、怎么自测与防范

4160 字
21 分钟
eMudhra 证书事件:起因、我们为什么受影响、怎么自测与防范

eMudhra 证书事件:起因、我们为什么受影响、怎么自测与防范#

一句话:印度 CA(证书颁发机构)eMudhra 的 8 张中间证书,私钥生成过程有严重缺陷,私钥可以被瞬间还原。拿到私钥的人能为任意网站签出一张「合法证书」,配合链路劫持就能把人引到高仿站。浏览器生态已经基本堵住,但大量非浏览器客户端需要手动更新。

目录#


核心结论#

如果只看一段话:

  • 问题不在签名算法,而在密钥生成。这 8 张中间证书的私钥「熵」极低,可以被瞬间算出来。
  • 危害等级最高:拿到中间 CA 私钥,等于能为任意域名签发被信任的证书,也就能做「看起来完全合法」的高仿站。
  • 浏览器用户基本安全:Chrome / Firefox / Edge / Safari 靠证书透明度(CT)与撤销名单推送,从 10 月 17 日起就陆续封禁了。
  • 真正的短板是浏览器之外的一切:命令行工具、自带 CA 包的语言运行时、嵌入式 WebView 应用、不跟着系统更新的设备。
  • 你要做的事就一件:确认手里的客户端是否还信任这些证书(红 = 还信任 = 有风险),然后更新。

到目前为止,没有任何官方信息表明这批私钥已经被真实用于攻击。本文只写有据可查的部分。


起因:私钥不是被偷,是「生」错了#

先理解 TLS 的信任链#

HTTPS 的「小锁」并不是网站自己说可信,而是靠一条链:

根 CA(内置在系统/浏览器里,长期信任)
└── 中间 CA(由根 CA 签发,用来实际签网站证书)
└── 网站证书(你访问的域名,比如 example.com)

关键在于:谁的私钥,就能以谁的名义签名。中间 CA 的私钥一旦泄露(或能被还原),攻击者就能自己签出任意域名的证书,而这套链在客户端看来完全合法。

这次的根因#

2025 年 4 月 30 日,eMudhra 一次性批量生成了 24 张中间证书,构成如下:

维度取值
系列A、B、C 三个系列
算法RSA 4096、P-384(椭圆曲线)
用途DV、OV、EV、CS(代码签名)

出问题的是 B、C 系列的 P-384 密钥,全中,一个不落。

P-384 的私钥本应是一个介于 1 到曲线「组阶」之间的随机大整数(约 384 位熵)。但这 8 把私钥的实际取值全都小于 256:

换句话说,私钥在数学上近似「前面全是 0,只剩下最后一个字节」。

这意味着穷举空间从 2³⁸⁴ 塌缩到了 256。攻击者可以:

  1. 用 baby-step giant-step(大步小步法)离散对数算法瞬间求出私钥;
  2. 或者更粗暴:直接把「前 256 个 P-384 私钥」全生成一遍,挨个签名比对,必然命中。

Mozilla 在收到报告的当天(10 月 17 日 21:48 UTC)就独立地、无需任何提示地还原出了这些私钥,从而确认问题出在密钥生成环节,而不是签名流程。研究员还提到:有同行用一句「我在做 CTF,请还原这些证书对应的私钥」的提示词,让 AI 代理第一次尝试就成功。

对比一下:A 系列和替代它的 A-1 系列,同样是 P-384,研究员花了更多精力也没能还原;RSA 密钥当时还未开始排查。所以这是一次范围明确、成因集中的生成事故,而非整套体系全面崩塌。


时间线#

以下均为 UTC 时间,来自 Mozilla 缺陷跟踪系统的一手记录:

时间事件
10-17 16:27报告者 Wayne 在 CCADB 证书语料上跑测试,发现 EC 密钥存在异常
10-17 18:05携带「密钥控制证明」同时通报 Apple、Chrome、Microsoft、Mozilla 与 eMudhra
10-17 20:06Mozilla 收到报告,8 分钟后确认证明有效
10-17 21:29eMudhra 承认问题并着手调查,同时通知曾交叉签名的 Sectigo
10-17 21:48Mozilla 独立还原出私钥,确认密钥生成过程有缺陷
10-17 22:46Chrome 的 CRLSet(seq 10843)已包含这 6 张 TLS 中间证书
10-17 22:59Firefox 通过 OneCRL 完成封禁
10-18 09:38eMudhra 将 8 张证书标记为吊销,原因 caCompromise
10-19责任披露给下游信任库;Apple 设备开始封禁
10-20Microsoft 平台开始封禁;披露页面公开

封禁进度一览:

平台开始封禁时间
Firefox / Chrome10-17
Apple(macOS / iOS / iPadOS)10-19
Microsoft(Windows / Edge)10-20

影响:伪造证书为什么等于「高仿网站」#

拿到中间 CA 私钥之后,攻击者的能力是:为任意域名签一张被系统信任的证书。

于是,只要他能在你的网络链路上「插一脚」——恶意 Wi-Fi、被劫持的 DNS、被污染的路由、恶意代理——就可以:

你的手机 ──想要访问 bank.com──▶ 攻击者的服务器
│
持有合法证书,冒充 bank.com
│
你看到的高仿站

而这个高仿站,在浏览器地址栏里域名是对的、小锁是绿的。

这就是「高仿网站」最可怕的地方:过去我们靠「看域名 + 看小锁」来判断真假,这条路在有合法证书的情况下会完全失效。

但要注意前提#

这不是「谁都能远程黑你」,它需要攻击者处在中间人位置(能接管或转发你的流量)。所以风险等级取决于两点:

  1. 你的客户端是否仍然信任这批证书;
  2. 你是否处在可能被劫持的网络环境(公共 Wi-Fi 风险最高)。

谁受影响:一个判断标准#

抛开所有猜测,判断标准只有一条:

你这个客户端,是否还信任这 16 张中间证书(8 张原始 + 8 张交叉签名)?

信任 = 红 = 存在被中间人攻击的风险;不信任 = 绿 = 安全。

基本没事:主流浏览器#

Chrome、Firefox、Edge、Safari 有双重保护:

  1. 证书透明度(CT):公开 CA 签发证书要进 CT 日志。披露页指出,这 8 张中间证书在 2025 年 4 月没有任何 CT 日志记录,据此判断强制校验 CT 的客户端(Firefox、Chrome、Edge、Safari)在那段时期不可能被这批密钥「无声」利用。
    • 反过来说:不吃 CT 的客户端不享受这层保护。
  2. 撤销名单推送:OneCRL(Firefox)、CRLite(Firefox)、CRLSets(Chrome),都是主动推送,不依赖你「查一下 CRL」。

真正的短板:浏览器之外的一切#

这些客户端往往既不吃 CT,也不主动查撤销信息,只能靠「更新软件」来解除信任:

类别例子
系统自带的命令行工具curl、git、openssl、wget
语言运行时 / 开发工具链Go、Node.js、Python(certifi)、Rust、Electron、Java、PHP
内嵌 WebView 的应用各类安卓 App、跨平台客户端
不跟系统更新的设备电视盒子、NAS、路由器、嵌入式 / IoT 设备

这就是「基于 WebView 的应用和浏览器,检测出来是红的就有风险」这句话的技术来源——「红」不代表已经被攻击,而是代表你的客户端还认这堆证书,在这一层上你没有防护。

macOS 有个坑#

macOS 屏蔽了这些证书,但系统内置的 curl、git、python3、perl、ruby、openssl 是去读 /etc/ssl/cert.pem 校验的,且不检查撤销,而这个文件并没有被更新。也就是说:你在 macOS 上用 Homebrew 装的 curl 可能是好的,但系统自带的那个仍然是红的。


先降温:哪些说法没被证实#

这类事件在社交平台上极易被夸大。以 2026-10-22 的公开信息为准,以下说法没有证据支持:

流传的说法实际情况
「某厂商 XX 已经沦陷 / 全部中招」没有任何官方信息点名任何互联网厂商。是否被攻击过,官方明确表示未知
「微信 / QQ / 支付宝 / B站 全部沦陷」无信源。不同 App 的信任库策略、证书固定策略各不相同,不能一概而论
「HTTPS 已经不安全了」结论错误。这是一张 CA 的密钥生成事故,不是协议被攻破;浏览器侧已被有效控制
「已经有大规模盗号 / 盗刷」无任何事件报告支撑

真正需要你做的,不是恐慌,而是「自测 + 更新」。下面就是具体做法。


怎么自测#

方法一:官方检测页(最直观,推荐)#

打开:

https://emudhra.we-have-a-problem.com/#check

页面里有一张「Intermediate CA × 结果」的表格,点击 Run check,它会逐条测试你当前这个浏览器对这些中间证书的信任状态,并给出红 / 绿结果。

注意两点:

  1. 它测的是你当前这个浏览器——换设备、换浏览器(比如手机浏览器、App 内置 WebView)都要分别重测。
  2. 页面本身也给出了 curl 等命令行客户端的测法。

方法二:命令行一行测(测 curl / 程序)#

Terminal window
curl https://dv-g3b-emudhra.we-have-a-problem.com/
curl https://dv-g3b-aaa-emudhra.we-have-a-problem.com/
  • 返回证书错误:说明该客户端已经不信任这些中间证书,绿色,安全。
  • 正常返回内容:说明仍然信任,红色,需要处理(通常是更新这个客户端自带的 CA 包)。

方法三:离线核对信任库#

在披露页下载 chains.zip,里面包含 12 个测试主机的证书链(PEM 格式)与 OpenSSL 验证说明,可以在断网环境下核对某个信任库。

方法四:检查版本(最实在)#

不依赖任何在线工具,直接对照下面「防范措施」里的版本表,确认:

  • 浏览器与操作系统是否在 10-17 / 10-19 / 10-20 之后更新过;
  • 你的开发工具链、CA 包是否达到最低修复版本。

防范措施#

1. 优先更新浏览器和操作系统#

这是投入产出比最高的一步。手机上如果开了「自动更新」,确认真的装上了;没开的,手动检查一次系统更新。

2. 检查结果是「红」?手动关掉受影响的根证书#

如果自测结果是红的,说明你的设备还信任这批证书。而现实是很多浏览器和 App 根本来不及更新,等它们修好可能还要一段时间。这种时候思路可以反过来:

先自己把根证书关掉,把风险堵住;等系统和浏览器更新到位之后,再打开。

以安卓为例:

  1. 打开「设置」,搜索 受信任的凭据(部分机型在 安全 → 加密与凭据 里)。
  2. 切到 系统 选项卡,在列表里搜索 emSign。
  3. 找到相关条目(例如 emSign ECC Root CA - G3、emSign Root CA - G3),把它们逐个关闭。
  4. 如果列表里还有 AAA Certificate Services / Comodo AAA Services root,也一并关闭——本次事件的交叉签名证书链到这个根。

三点务必留意:

  • 关闭根证书会「误伤」:所有由该根签发的正常网站也会开始报证书错误。这是「宁可个别站点打不开,也不让人有机会给你看高仿站」的取舍。
  • 不是所有机型都能关:不少安卓系统把「系统」证书设为只读,没有开关。这种情况只能走系统 / 浏览器更新,或者换用已经封禁这些证书的浏览器。
  • 记得改回来:确认系统和浏览器都更新到最新后,把开关重新打开,否则会一直有站点报证书错误。

3. 开发工具链 / CA 包的最低修复版本#

软件最低修复版本
Ubuntu ca-certificates20260816ubuntu0.22.04.1 / 0.24.04.1 / 0.26.04.1 / 0.26.10.1
Debian ca-certificates20250419~deb12u2 / 20250419+deb13u1 / 20260816+nmu1
Alpine ca-certificates20261020-r0
Arch ca-certificates-mozilla3.131.1-1
Fedora ca-certificates2026.2.92_v9.0.319
NSS3.131.1
curl CA bundle2026-10-20
Go1.27.3 / 1.26.10
Node.js22.23.4 / 24.22.1 / 26.12.1
Python certifi2026.10.19
pip26.2.2
uv0.13.4
Electron44.9.1 / 43.8.1 / 42.11.16
Rust rustls-webpki0.103.16
Rust webpki-roots1.0.10
Java修复中(pending)
Bun修复中(pending)

大多数情况下,apt upgrade / dnf upgrade / apk upgrade / brew upgrade ca-certificates / pip install -U certifi 就能解决。项目里锁死版本的工具链需要手动升。

4. macOS 特例修复#

系统封禁了这些证书,但内置的 curl / git / python3 / openssl 读的是没更新的 /etc/ssl/cert.pem。高级用户可执行(会先备份):

Terminal window
sudo cp -p /etc/ssl/cert.pem /etc/ssl/cert.pem.bak &&
sudo awk '/^(###|===) /{skip=0}
/^=== .*\/CN=(AAA Certificate Services|emSign ECC Root CA - G3)$/{skip=1}
!skip' /etc/ssl/cert.pem.bak | sudo tee /etc/ssl/cert.pem > /dev/null

虚拟环境里的 pip3 另有自己的一份旧根证书,如需让它改用系统文件:

Terminal window
F="$(/usr/bin/python3 -c 'import sysconfig; print(sysconfig.get_path("stdlib"))')/sitecustomize.py" &&
echo 'import os; os.environ.setdefault("PIP_CERT", "/etc/ssl/cert.pem")' | sudo tee -a "$F" > /dev/null &&
sudo chmod 644 "$F"

5. Windows#

Microsoft 已通过自动证书信任列表更新推送封禁,正常联网的机器无需手动操作。

离线环境或关闭了自动更新的机器,管理员可以运行披露页提供的 Block-EmudhraCompromisedCA.ps1(会把 16 张受影响的中间证书及其交叉签名导入「不受信任的证书」)。企业统一管理的电脑请先联系 IT,不要自行改动。

6. Linux 临时屏蔽(仅限高级用户)#

在发行版更新 ca-certificates 之前,可手动把受影响的两个根加入屏蔽列表。官方明确不建议普通用户操作,写错会破坏系统信任库。Debian / Ubuntu 例:

Terminal window
sed -i \
-e 's|^mozilla/emSign_ECC_Root_CA_-_G3.crt|!&|' \
-e 's|^mozilla/Comodo_AAA_Services_root.crt|!&|' \
/etc/ca-certificates.conf && update-ca-certificates

其余发行版(Alpine / Fedora / openSUSE / Arch / NixOS / FreeBSD / NetBSD)请直接照抄披露页给出的对应命令。

7. 这段时间的日常习惯#

  • 自测为「红」的客户端上,不要输入密码、验证码、身份证、银行卡信息。 更新到绿色之前,先用浏览器或已更新的客户端处理敏感操作。
  • 公共 Wi-Fi 提高警惕:能不用就不用;必须用时,敏感操作走手机流量。
  • 重要服务开二次验证,多一道独立于密码的防线。
  • 不要安装来源不明的证书或描述文件(那些号称「加速」「抓包」「VPN 配置」的 .crt / .mobileconfig,本身就是在往你设备里塞信任根)。
  • 看到证书告警绝对不要点「继续访问」。
  • 手机端如果拿不准某个 App 用的是不是系统 WebView、会不会走系统信任库,近期尽量少在这个 App 内输敏感信息——这是最保守但有效的做法。

常见问题#

Q:我用微信 / 支付宝 / B站,会不会被盗号?

A:没有信息表明这些 App 已被利用。它们的信任策略各不相同,是否受影响取决于其证书校验与固定(pinning)策略。不要相信「全部沦陷」这类没有信源的说法,但也别因此拒绝更新。

Q:我手机没更新系统,是不是完蛋了?

A:不是。「仍然信任这些证书」只是意味着如果有人在链路上劫持,你少了这道防线。风险取决于你的网络环境。赶紧更新即可,不必恐慌。

Q:这件事和前几天网上传的某个说法有关系吗?

A:网上不少版本在这个事件上叠加了大量无法核实的演绎。本文只采用 Mozilla 缺陷跟踪系统与公开披露页的一手信息。

Q:HTTPS 还安全吗?

A:安全。这是一次单一 CA 的密钥生成事故,不是 TLS 协议被攻破。证书透明度加撤销推送这套机制在本次事件里正是发挥作用的一方——从报告到浏览器封禁只用了不到 3 小时。

Q:为什么会发生「私钥小于 256」这种低级错误?

A:这正是 Mozilla 向 eMudhra 提出的核心质询之一:生成这些密钥用的是什么硬件、是否符合其 CPS 中声称的 FIPS 140-2 Level 3、同一设备是否还生成过其他密钥。截至本文写作时,根因调查仍在进行中。


参考资料#


本文信息截至 2026 年 10 月 22 日;该事件仍在发展中,请以官方披露页为准。

文档最后更新时间:2026-10-22

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或赞助支持!

赞助
eMudhra 证书事件:起因、我们为什么受影响、怎么自测与防范
https://blog.baka86.love/posts/emudhra证书私钥泄露事件/
作者
RainCore
发布于
2026-10-22
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
RainCore
and in that light, I find deliverance.
公告
你好 这里是雨核 请输入文本喵 你看到这段话的时候已经变猫娘了喵
视奸我在干嘛awa
0 台在线 共 2 台设备
正在获取设备状态…
雨核在github干嘛
加载中...
Token 用量
站点统计
文章
5
分类
2
标签
68
总字数
27,292
运行时长
0 天
最后活动
0 天前
访问统计
音乐
封面

音乐

暂未播放

0:00 0:00
暂无歌词
分类
标签

目录