【CA】eMudhra CA 私钥缺陷事件完整解读

✅ 事件背景

eMudhra 是印度一家获得全球主流浏览器信任的CA(数字证书颁发机构),它签发的HTTPS、代码签名证书,Chrome、Firefox、苹果、微软、安卓等系统默认信任。
这次不是传统“黑客偷走私钥文件”,而是密码学层面生成了极其弱小的私钥,任何人都可以在不到1秒算出私钥,等价于私钥公开泄露。

🔐 漏洞根本原因(核心漏洞)

  1. 使用椭圆曲线P‑384(secp384r1)生成中间CA私钥
  2. 人为/程序bug,私钥没有随机生成,直接用极小整数(比如4这类个位数)
    • ✅正常:P‑384私钥是一个巨大、几乎不可能暴力猜出来的超大随机数
    • ❌出事这批:私钥=很小的整数,拿到公钥就能瞬间反推出私钥
  3. 一共8张受影响中间CA证书:
    • 6张 → TLS/HTTPS网站证书签发
    • 2张 → 代码签名证书
    • 同时还被Sectigo交叉签名,连带多出8份交叉签名证书,合计16份受影响证书链

⚠️ 两个大类漏洞/风险

① TLS/HTTPS伪造证书漏洞(最出名)

  • ✅能力:拿到私钥后,可以随便给全世界任意域名伪造HTTPS证书,不限于印度网站
  • ✅攻击方式:中间人攻击(MITM)
    劫持流量之后,出示伪造、但是旧客户端会信任的证书,用户浏览器/APP不会弹出证书报错
  • ✅危害:
    • 窃取账号密码、Cookie、支付信息
    • 篡改网页内容,植入钓鱼、木马
  • ✅关键点(就是微博那条重点):跟网站属于哪个国家无关,只要你的客户端信任这条CA链,就能中招,不是只影响印度网站

② 代码签名伪造漏洞

2张受损中间CA是代码签名证书

  • ✅能力:攻击者可以给Windows平台程序伪造合法数字签名
  • ✅危害:
    • 恶意木马、病毒、后门程序带上“看起来合法”的签名
    • Windows、很多企业安全策略会放行带有效签名的程序,降低告警,更容易落地入侵

🧩 为什么浏览器拉黑了,但风险还没完全消失(长尾问题)

  1. ✅Chrome / Firefox / Safari / Edge 很快做了不信任(distrust)拉黑,更新后的主流浏览器会直接拒绝这些证书
  2. ❌但是大量其他环境不会自动更新信任列表(长尾):
    • 很多独立App、自研客户端
    • 老旧服务器、IoT物联网设备(摄像头、路由器、智能家居)
    • 开发语言内置证书库:Go / Python / Java / Rust旧版本
    • 内网设备、嵌入式系统、老旧容器镜像
      → 这些设备依旧信任这条CA,仍然存在被中间人攻击风险

📌 事件后续

  1. eMudhra承认密钥生成流程缺陷、人为失误
  2. 紧急停止受影响CA签发
  3. 直接宣布退出全球SSL/TLS证书业务

💡简单类比

CA就像全世界公认的公证处。正常公证处的印章密钥锁在保险柜。
这次公证处犯了低级错误:印章密码直接写成数字4,任何人一秒算出密码,可以随便伪造任何公司、任何网站的公证书。
主流浏览器(新版)已经不认这份公证处的章了,但是很多老设备、老APP还没更新黑名单,依旧认。

🛡️ 简单防护建议

  1. 系统、浏览器保持更新
  2. 服务器/客户端及时更新CA信任库、吊销列表
  3. 高安全场景可以启用证书锁定(HPKP/Certificate Pinning)、监控证书透明度日志CT Logs
  4. IoT、嵌入式设备重点排查

🛡️ 如何排查的防范?

1、P-384(secp384r1)为什么小私钥能瞬间破解

先简单回顾椭圆曲线签名的核心公式:

Q = d \cdot G

  • G:椭圆曲线基点(固定公开)
  • d:私钥(保密整数)
  • Q:公钥(对外公开)

正常场景: secp384r1 的合法私钥取值范围是 1 < d < n-1,n 是一个接近 2^{384} 的超大素数,随机生成的 d 接近384bit,暴力遍历在物理上不可能。

本次事故的问题: 这批中间CA的 d 是极小整数(d=2,3,4……这种)。 已知公钥Q,求d本来是椭圆曲线离散对数难题;但如果d本身很小,不需要复杂破解,直接循环试算:

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弱密钥事件,监控思路

  1. 目标:监控【被拉黑的那8个中间CA】下面,有没有新证书被签发、有没有伪造证书出现
  2. 常用工具&查询入口
    • 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 第一步:梳理资产,定位风险载体

风险载体 = 自带独立信任根证书库、不跟随系统浏览器信任库的组件:

  1. Java:cacerts(JDK内置证书库,极容易长期不更新)
  2. Python:certifi包、requests库自带根证书
  3. Go:Go runtime内置root trust bundle(老版本Go自带)
  4. Node.js
  5. 容器镜像(alpine、ubuntu基础镜像自带ca-certificates包)
  6. IoT、路由器、摄像头、工控设备固件内置根CA
  7. 自研APP、客户端(内置静态pem根包,很多项目写死不更新)
  8. 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 业务侧加固手段

  1. 证书锁定(Pinning) 高安全接口、支付、内部管理后台,开启证书pinning,只信任自己业务证书的公钥指纹。即使CA被攻破,伪造证书也无法通过校验。

    注意:Web端HPKP已经废弃,现在前端推荐 Expect-CT + JS pin;移动端/后端客户端自己实现pin。

  2. 证书透明度强制校验 对外HTTPS服务,配置服务端强制CT,不允许不带CT日志的证书接入。

  3. 中间人代理设备排查 内网透明代理、防火墙SSL卸载(深信服、F5等),很多这类设备内置独立根CA,版本老旧,要单独升级信任黑名单。

  4. 流量侧检测 在WAF、IDS增加规则:

  • 告警证书签发者为受影响eMudhra中间CA的TLS会话
  • 告警证书缺少CT日志信息

3.4 应急处置优先级

✅ P0(紧急):面向公网、用户输入账号密码、支付相关的自研客户端、IoT设备
✅ P1:后端服务之间HTTPS调用、微服务对外接口
✅ P2:内部运维平台、监控系统
✅ P3:纯内网、无对外交互、无敏感数据的系统


补充几个容易踩坑的误区(运维经常搞错)

  1. ❌ 误区:我浏览器已经更新了,业务就安全了 ✅ 纠正:Java、Python、容器、嵌入式程序自带独立证书库,和浏览器分开,浏览器拉黑不影响它。

  2. ❌ 误区:只有访问印度网站才危险 ✅ 纠正:私钥可以给任意域名签证书,baidu.com、你的公司域名都能伪造,是中间人攻击,和域名归属国无关。

  3. ❌ 误区:吊销证书(CRL/OCSP)能解决全部问题 ✅ 纠正:很多客户端不校验OCSP/CRL,依赖静态信任列表拉黑,这也是这次长尾风险的根源。

最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容