✅ 事件背景
eMudhra 是印度一家获得全球主流浏览器信任的CA(数字证书颁发机构),它签发的HTTPS、代码签名证书,Chrome、Firefox、苹果、微软、安卓等系统默认信任。
这次不是传统“黑客偷走私钥文件”,而是密码学层面生成了极其弱小的私钥,任何人都可以在不到1秒算出私钥,等价于私钥公开泄露。
🔐 漏洞根本原因(核心漏洞)
- 使用椭圆曲线P‑384(secp384r1)生成中间CA私钥
-
人为/程序bug,私钥没有随机生成,直接用极小整数(比如4这类个位数)
- ✅正常:P‑384私钥是一个巨大、几乎不可能暴力猜出来的超大随机数
- ❌出事这批:私钥=很小的整数,拿到公钥就能瞬间反推出私钥
- 一共8张受影响中间CA证书:
- 6张 → TLS/HTTPS网站证书签发
- 2张 → 代码签名证书
- 同时还被Sectigo交叉签名,连带多出8份交叉签名证书,合计16份受影响证书链
⚠️ 两个大类漏洞/风险
① TLS/HTTPS伪造证书漏洞(最出名)
- ✅能力:拿到私钥后,可以随便给全世界任意域名伪造HTTPS证书,不限于印度网站
- ✅攻击方式:中间人攻击(MITM)
劫持流量之后,出示伪造、但是旧客户端会信任的证书,用户浏览器/APP不会弹出证书报错 - ✅危害:
- 窃取账号密码、Cookie、支付信息
- 篡改网页内容,植入钓鱼、木马
- ✅关键点(就是微博那条重点):跟网站属于哪个国家无关,只要你的客户端信任这条CA链,就能中招,不是只影响印度网站
② 代码签名伪造漏洞
2张受损中间CA是代码签名证书
- ✅能力:攻击者可以给Windows平台程序伪造合法数字签名
- ✅危害:
- 恶意木马、病毒、后门程序带上“看起来合法”的签名
- Windows、很多企业安全策略会放行带有效签名的程序,降低告警,更容易落地入侵
🧩 为什么浏览器拉黑了,但风险还没完全消失(长尾问题)
- ✅Chrome / Firefox / Safari / Edge 很快做了不信任(distrust)拉黑,更新后的主流浏览器会直接拒绝这些证书
- ❌但是大量其他环境不会自动更新信任列表(长尾):
- 很多独立App、自研客户端
- 老旧服务器、IoT物联网设备(摄像头、路由器、智能家居)
- 开发语言内置证书库:Go / Python / Java / Rust旧版本
- 内网设备、嵌入式系统、老旧容器镜像
→ 这些设备依旧信任这条CA,仍然存在被中间人攻击风险
📌 事件后续
- eMudhra承认密钥生成流程缺陷、人为失误
- 紧急停止受影响CA签发
- 直接宣布退出全球SSL/TLS证书业务
💡简单类比
CA就像全世界公认的公证处。正常公证处的印章密钥锁在保险柜。
这次公证处犯了低级错误:印章密码直接写成数字4,任何人一秒算出密码,可以随便伪造任何公司、任何网站的公证书。
主流浏览器(新版)已经不认这份公证处的章了,但是很多老设备、老APP还没更新黑名单,依旧认。
🛡️ 简单防护建议
- 系统、浏览器保持更新
- 服务器/客户端及时更新CA信任库、吊销列表
- 高安全场景可以启用证书锁定(HPKP/Certificate Pinning)、监控证书透明度日志CT Logs
- IoT、嵌入式设备重点排查
🛡️ 如何排查的防范?
1、P-384(secp384r1)为什么小私钥能瞬间破解
先简单回顾椭圆曲线签名的核心公式:
-
:椭圆曲线基点(固定公开)
-
:私钥(保密整数)
-
:公钥(对外公开)
正常场景: secp384r1 的合法私钥取值范围是 ,
是一个接近
的超大素数,随机生成的
接近384bit,暴力遍历在物理上不可能。
本次事故的问题: 这批中间CA的 是极小整数(d=2,3,4……这种)。 已知公钥
,求
本来是椭圆曲线离散对数难题;但如果
本身很小,不需要复杂破解,直接循环试算:
for d_test in 2,3,4,5...:
if d_test * G == Q:
找到私钥d
只需要很少次数迭代,毫秒级算出私钥。
⚠️ 注意:不是椭圆曲线算法本身有漏洞!是证书机构密钥生成逻辑写崩了,没有做随机安全采样,直接硬编码/错误取了极小值,属于CA流程灾难,不是密码算法破了。
补充区分:RSA弱密钥一般是素数选得不好;ECC这个问题是私钥取值空间没有随机、落在极小区间,属于密钥生成(KGD)bug。
2、CT日志(Certificate Transparency)怎么监控伪造证书
2.1 CT是什么
CT 是一套公开、不可篡改的证书日志系统,所有合规的HTTPS证书签发时必须写入CT日志。目的是:任何人都可以检索,发现异常、未授权签发的证书。 浏览器会校验证书是否在CT日志里(现代Chrome/Safari强制要求)。
2.2 针对本次eMudhra弱密钥事件,监控思路
- 目标:监控【被拉黑的那8个中间CA】下面,有没有新证书被签发、有没有伪造证书出现
- 常用工具&查询入口
- crt.sh(最常用):https://crt.sh
- certstream:实时CT流推送(适合企业自建告警)
- Google CT日志、Cloudflare CT日志等公开日志源
crt.sh 查询示例
把受影响的中间CA的指纹输入,查询它下面签发过的所有证书:
fingerprint: "这里填入受影响eMudhra中间CA SHA256指纹"
可以批量看:
- 证书域名
- 签发时间
- 证书序列号
- 是否TLS证书 / 代码签名证书
Certstream实时监控(运维常用Python简单demo)
# pip install certstream
from certstream import CertStreamClient
def callback(message, context):
if message['message_type'] == "certificate_update":
cert = message['data']['leaf_cert']
# 判断issuer匹配eMudhra受影响CA
issuer = cert['issuer']
if 'eMudhra' in str(issuer):
print(f"[ALERT] 发现eMudhra签发证书:{cert['all_domains']}")
client = CertStreamClient(callback, url="wss://certstream.calidog.io")
client.run()
局限:就算攻击者用弱私钥离线伪造证书,如果他不提交到CT日志,crt.sh/certstream看不到。CT只能抓到“正常走签发流程、提交日志”的证书,抓离线MITM伪造、不进CT的证书。 👉 所以CT是辅助告警,不能替代证书校验、证书锁定。
2.3 怎么判断是不是伪造证书
正常证书:由CA在线签发、带CT日志入口; 攻击者用偷来的私钥离线造的证书:
- 大概率没有CT日志记录
- 证书时间、序列号诡异
- 浏览器在新版信任库拉黑CA后,直接报 NET::ERR_CERT_REVOKED / 不信任
3、企业应急排查清单(适合运维/安全团队,可直接落地)
场景:你的业务服务器、容器、IoT、Java/Python/Go应用、内网系统,是否还信任这一批eMudhra中间CA
3.1 第一步:梳理资产,定位风险载体
风险载体 = 自带独立信任根证书库、不跟随系统浏览器信任库的组件:
- Java:
cacerts(JDK内置证书库,极容易长期不更新) - Python:
certifi包、requests库自带根证书 - Go:Go runtime内置root trust bundle(老版本Go自带)
- Node.js
- 容器镜像(alpine、ubuntu基础镜像自带ca-certificates包)
- IoT、路由器、摄像头、工控设备固件内置根CA
- 自研APP、客户端(内置静态pem根包,很多项目写死不更新)
- Nginx/OpenSSL服务端、curl/wget命令行(依赖系统ca-bundle)
重点:Windows/Chrome/Firefox是单独一套信任库,浏览器更新就拉黑;业务程序很多自带一套独立证书列表,不受浏览器控制!
3.2 排查命令(直接复制执行)
1)查看系统信任包版本(Linux)
# Debian/Ubuntu
apt list --installed ca-certificates
# RHEL/CentOS
yum list installed ca-certificates
升级:
apt update && apt install ca-certificates
2)Java 检查 & 更新 cacerts
# 查看JDK cacerts里面有没有eMudhra相关证书
keytool -list -keystore $JAVA_HOME/jre/lib/security/cacerts -storepass changeit | grep -i emudhra
${JAVA_HOME}/bin/keytool -list -v -keystore ${JAVA_HOME}/jre/lib/security/cacerts -storepass changeit 2>/dev/null \
| awk '/^Alias name:/{a=$0;sub(/^Alias name: /,"",a)} /^Owner:/{if(a!=""){print a"\t"$0;a=""}}' \
| grep -iE 'emudhra|emsign'
如果存在,方案:删除这条证书,或者升级JDK。
3)Python certifi
pip list | grep certifi
pip install --upgrade certifi
4)OpenSSL 校验:测试是否还信任该CA证书链
拿到受影响中间CA的PEM,执行:
openssl verify -CAfile /etc/ssl/certs/ca-certificates.crt emudhra-bad-intermediate.crt
- 如果输出
OK:当前环境仍然信任,风险很高 - 如果输出
error 19 at 0 depth lookup:self signed certificate/ 不信任:已经拉黑,安全
3.3 业务侧加固手段
-
证书锁定(Pinning) 高安全接口、支付、内部管理后台,开启证书pinning,只信任自己业务证书的公钥指纹。即使CA被攻破,伪造证书也无法通过校验。
注意:Web端HPKP已经废弃,现在前端推荐
Expect-CT+ JS pin;移动端/后端客户端自己实现pin。 证书透明度强制校验 对外HTTPS服务,配置服务端强制CT,不允许不带CT日志的证书接入。
中间人代理设备排查 内网透明代理、防火墙SSL卸载(深信服、F5等),很多这类设备内置独立根CA,版本老旧,要单独升级信任黑名单。
流量侧检测 在WAF、IDS增加规则:
- 告警证书签发者为受影响eMudhra中间CA的TLS会话
- 告警证书缺少CT日志信息
3.4 应急处置优先级
✅ P0(紧急):面向公网、用户输入账号密码、支付相关的自研客户端、IoT设备
✅ P1:后端服务之间HTTPS调用、微服务对外接口
✅ P2:内部运维平台、监控系统
✅ P3:纯内网、无对外交互、无敏感数据的系统
补充几个容易踩坑的误区(运维经常搞错)
❌ 误区:我浏览器已经更新了,业务就安全了 ✅ 纠正:Java、Python、容器、嵌入式程序自带独立证书库,和浏览器分开,浏览器拉黑不影响它。
❌ 误区:只有访问印度网站才危险 ✅ 纠正:私钥可以给任意域名签证书,baidu.com、你的公司域名都能伪造,是中间人攻击,和域名归属国无关。
❌ 误区:吊销证书(CRL/OCSP)能解决全部问题 ✅ 纠正:很多客户端不校验OCSP/CRL,依赖静态信任列表拉黑,这也是这次长尾风险的根源。