Mathew McPherrin 最近做了一件很"手痒"的事:把一家 90 年代根证书机构(CA)的 RSA 私钥完整分解了出来,还顺手搭了个只能被 Netscape 4.51 访问的网站证明它真的能用。这不是炒作,是实打实的密码学考古——从 archive.org 挖出老浏览器的安装包,用 CADO-NFS 在自己的 Ryzen 台式机上跑 61 个小时,重建出两把早已被"吊销"却从未被真正销毁的私钥。
整件事的起点是一个朴素的问题:RSA 的安全性建立在"大数分解很难"上,但"大"到底多大才算大?几天前有人分解了 RSA-260(862 位),这是目前公开已知的最大分解记录。1024 位 RSA 十多年前就被 Web PKI 弃用,2048 位是今天的主流,而它也快因为量子计算的风险被淘汰了。顺着这个思路往下想:早期 Web PKI 没有标准、没有最低强度要求,1994 年 Netscape 首发 SSL 时还处在加密技术出口管制的年代——那有没有小到能被个人电脑分解的根证书?答案是有。
找到目标:从浏览器安装包里挖根证书
根证书当年是随浏览器安装包分发的,archive.org 上有 Internet Explorer 和 Netscape 的历史版本归档。McPherrin 把两套归档都下下来,让 Claude Code 把里面所有的根证书提取出来,整理成一个可检索的网页,专门用来筛选"哪些小密钥曾经被信任过做 SSL"。
结果很快出来了:1999 年 3 月,Netscape 4.51 内置了一家早已倒闭的加拿大 CA「E-Certify」的两个 512 位根证书——一个 RSA 512 Gold Server 用于 SSL,一个 RSA 512 Gold Client 用于 S/MIME。512 位 RSA 在当时已经不算安全了:同样 512 位的 RSA-155 在 1999 年 8 月就被分解。换句话说,这两张根证书在出生的同一年就已经是废纸,Netscape 直到 2002 年才把它们移除。
这里有个值得注意的细节:Internet Explorer 从未内置过 512 位的 SSL 根证书,所以这个"可攻击窗口"只存在于 1999 到 2002 年间的 Netscape 用户。攻击面很小,但真实存在过。
分解过程:CADO-NFS + 桌面 CPU
找到目标后就是纯粹的算力问题。他用的工具是 CADO-NFS,这是目前事实上的开源数域筛(NFS)实现,专门用来分解整数。硬件是 Ryzen 9 5950X(16 核桌面 CPU,不是集群):
E-Certify RSA 512 Gold Server(SSL):32 小时E-Certify RSA 512 Gold Client(S/MIME):29 小时
把根证书里的公钥分解成两个素数之后,剩下的就是小学数学:用这两个素数就能重建完整的私钥。他把两把私钥都公开在了 github.com/mcpherrinm/ancientroots 仓库里。
为什么 512 位能被个人电脑分解?这是 RSA 密钥强度的直接体现。分解难度随位数指数级增长,512 位在 1999 年就需要数百台机器协同数个月(RSA-155 当年就是这么干的),而今天一台桌面 CPU 跑两天就够了。这二十年算力的增长,比密钥长度的线性扩展快得多。
复活一个死去的 CA
拿到私钥只是第一步。要证明这些私钥"真的能用",得能签发证书,而且签出来的证书要被 Netscape 4.51 信任。这本身又是一次考古:
- 假设你运行着 Netscape 4.51,且系统时钟调回 E-Certify 根证书过期日(2003-10-16)之前,就能用这两把私钥签发证书
- 世界上符合条件的人数是零,于是他直接建了一台虚拟机
- 但 Netscape 4.51 与现代 TLS 协议栈零重叠——它只支持 SSL 2.0/3.0 时代的老协议,现代服务器根本没法跟它握手。于是又让 Claude Code 用 Go 写了一个"复古" TLS 服务器,专门按老协议的方言跟 Netscape 4.51 通信
这个服务就托管在 e-certify.fly.dev,你可以用自己的 Netscape 4.51 副本去试,但现代浏览器一律打不开。仓库里的密钥和工具都能复现整个流程。
附带发现:一小时的 VeriSign 测试 CA
除了 E-Certify,他还发现 Internet Explorer 3.02 内置过一个 OU=Test VeriSign Commercial Software Publisher CA 的代码签名 CA,同样是 512 位。Steve Weis 用 GPU 集群大约一小时就把它分解了。测试用的密钥被当真密钥信任,这在早期 PKI 里并不罕见——测试证书、内部 CA、占位符密钥混进信任链,是那个年代的真实状态。
这件事的现代意义
这不是一个"笑话,512 位早没人用了"的怀旧故事。它有几个仍然成立的结论:
-
密钥强度的时效性远比想象中短。 512 位从"安全"到"桌面可破"只用了二十年。2048 位 RSA 从 2015 年起就不再被 NIST 推荐用于长期保护,量子计算一旦落地,RSA 和 ECDSA 会整体退场。任何"现在够用"的密钥长度,都要按"未来二十年算力"来评估。
-
信任链里的"死钥匙"不会自动失效。 E-Certify 的根证书 2002 年就从 Netscape 移除了,但 archive.org 上永远存着这份包含私钥的安装包。任何仍把这些旧根证书当信任锚的系统,都在为一个理论上可分解的密钥兜底。审计自己系统的信任存储,看看有没有 512 位或 1024 位的遗留根证书,是个低成本高价值的动作。
-
归档不是攻击面,但归档暴露攻击面。 这个研究能成立,恰恰因为浏览器安装包被完整归档了。这提醒我们:任何"历史遗留"的密钥材料——测试证书、过期根、内部 CA——只要曾经进入过信任链,就可能被翻出来分解。密钥轮换不能只是"换新的",还得确保旧的真的失效且不可用。
我的做法
如果是自己做类似的密码学实验,我会注意三点:
- 复现用 CADO-NFS 比自写筛法省心得多。 装好依赖后一条命令就能跑,它会自动处理多项式选择、筛分、线性代数、平方根这几步。512 位在单机上跑,
tasks.linalg.bwc.threads之类的参数按核心数调一下就行,默认配置已经能直接出结果。 - 证书解析用
openssl x509 -in cert.pem -text -noout看位数,用openssl x509 -modulus -noout导出公钥模数。 分解完用openssl rsa -in key.pem -check验证私钥自洽,这是重建私钥后必做的一步。 - 拿老协议做实验用虚拟机隔离。 复古 TLS 服务只在 VM 里跑,别挂到现代网络环境里,老协议的明文缺陷可能顺手把你的测试环境搭进去。
这个故事最打动我的不是"分解了一个 512 位密钥",而是整个链条的完整:从历史归档定位目标,到算力分解,到重建私钥,再到用一个只能跟 25 年前软件握手的老式服务器证明它真能用。它把"密码学考古"从概念变成了一个可复现的实验——这才是安全研究该有的样子。
⚠️ 网络安全免责声明
本文内容仅供技术研究与安全学习之用。文中描述的密钥分解、私钥重建和证书签发过程均基于公开披露的安全研究,旨在帮助开发者理解 RSA 密钥强度的时效性、提升对遗留信任链风险的认识。
请勿将本文所述技术用于任何未经授权的密钥分解、中间人攻击或伪造证书等非法用途。任何因滥用本文信息而造成的法律后果,由使用者自行承担,与本文作者无关。
如发现系统中存在强度不足或遗留的根证书,请通过合法渠道向相关厂商或平台报告,共同维护网络安全生态。
参考:Mathew McPherrin, "I've factored the RSA keys of a Certificate Authority..." (2026-09-07) — https://mcpherrin.ca/2026/09/07/rsa.html
浙公网安备 33010602011771号