./cado-nfs.py $N -t 32 --workdir /data/cert1
$N 是从一张 1999 年的证书里读出来的模数,-t 32 是线程数。剩下的事交给机器自己跑。
有人真这么干了。Matthew McPherrin 把 Netscape 4.51 里那两张 512 位的根证书拆了,SSL 那张 32 小时,S/MIME 那张 29 小时,用的是他自己的 Ryzen 9 5950X。
Netscape 4.51 是 1999 年 3 月发的。安装包里塞了两张受信任的根证书:
C=CA, O=E-Certify, OU=RSA Gold Server, CN=E-Certify RSA 512 Gold Server
C=CA, O=E-Certify, OU=RSA Gold Client, CN=E-Certify RSA 512 Gold Client
E-Certify,一家加拿大的 CA,早没了。512 位。
关键在这:1999 年晚些时候,512 位的 RSA-155 被分解。同一年。这两张证书被塞进浏览器安装包的时候,512 位在公开文献里已经是死的。不是十年后才变得不安全,是发布当天就站不住。
那它为什么还能发出来?
因为那时候根本没有"最低密钥长度"这种东西。Netscape 1994 年推 SSL,IE 跟上,那是加密出口管制的年代,密钥长度本身是个政治问题,不是工程问题。没有标准,也没有底线,谁想发多少位就发多少位。Web PKI 一直拖到十多年前才把 1024 位弃掉。
所以"当年技术就那样"这个说法我不接受。缺的不是算力,缺的是一个写下来的规定:不许发 512 位。算力早就够判断了,只是没人愿意把它变成一条规则。一条规则的成本是零,写下来就完了。可写规则的人得替那条线负责,而发一张 512 位的证书,当时谁都不用负责。
前几天的新闻:RSA-260,862 位,被分解了,作者说这是他见过规模最大的一次。再看这两张证书:消费级台式机,两个通宵加一个白天。
两件事放一起,"多大才算大"这个答案一直在往下掉。512 位在 2026 年不是"理论上不安全"——它是一个人关掉手机、吃两顿外卖就能做完的活。谁都做得起。
拿到 p 和 q,私钥就是一行:
d = pow(e, -1, (p - 1) * (q - 1))
然后你就拥有一张浏览器信任的根证书的私钥了。理论上到此结束,实操上才刚开始。
第一道坎是时间。这张证书的到期日是 2003 年 10 月 16 日。想拿私钥签任何东西,先把跑 Netscape 4.51 那台机器的系统时钟拨回那一天之前。这个动作本身就是全部说明——这套东西存在的方式,是把你锁死在某一个具体时刻上,别的地方它不认。证书上那个日期不是建议,是硬边界。
第二道坎更硬。Netscape 4.51 和现代 TLS 实现之间,没有任何一处 cipher 交集。不是"默认不启用",是一个都没有。现代 Go 的 crypto/tls 早把 SSLv3 和那几个套件删得干干净净。删得对——留着才是灾难。副作用是这套玩意儿从此彻底成了孤岛,岛上只有它自己。
于是你手里有一把能用的私钥,但没有任何现成的服务端愿意跟那个客户端说一句话。你得自己写一个。
作者用 Go 写了个仿古 TLS 服务器,只为了跟这一个客户端握手。现代浏览器加载不了这个站点,这是设计的一部分。
写这个服务端的活是 Claude Code 干的。
这里把边界说清楚。让模型从 archive.org 的安装包归档里把全部根证书扒出来、让它写一个只服务一个古董客户端的 TLS 服务端——这类活给 AI 是对的。边界清楚,结果可验证,错了就直接握手失败。你不需要信任它,跑一次就知道对不对。作者自己也说了,那个展示老证书的网页还没验证过模型输出的完全可靠性,只是看着挺可信。这个态度是对的,扒证书这种活就该复核。
但"这两张证书值不值得拆""这个实验有什么意义"——这种判断别交给模型。它没有一个握手能告诉你对错。判别标准就一条:跑一次能判真伪的活给模型,跑多少次都未必有答案的判断自己扛。
私钥和工具全开源在 ancientroots 仓库,别人可以自建站点。
作者还留了几个看起来是测试用的 512 位密钥在仓库里,招呼读者去拆。顺着这条线翻出来一个东西:IE 3.02 里带了个代码签名 CA,名字叫 Test VeriSign Commercial Software Publisher CA。
Test。二十多年了,它还在安装包归档里躺着,还受信任。Steve Weis 用 GPU 集群大约一小时就把它拆了。
这些不是漏洞。漏洞是有意为之的东西破了个口子。这些是垃圾——我们从来没清理过的、被遗忘的、默认信任的垃圾。垃圾的麻烦之处是它不响。漏洞会被报出来,垃圾只会在某个安装包里一直躺着,等下一个翻归档的人撞见。清理它们的成本低到一个人一个下午,有 GPU 集群的话,一小时。
一条规则,发证书之前先问一句:这把密钥今天拆起来要多久。答案是"一个通宵",就不该发。当年那个答案也是"一个通宵"级别的,只是没人问。规则得短到能被人一次读懂,不然它挡不住任何东西。
说句题外话。
这件事最扎我的地方不是那张证书有多弱。是这整个实验的成本——一台台式机、两个晚上、一个命令行、一个自己写的小服务端。一个人从头做到尾,中间没有任何一个环节需要第二个人的批准。
我捣鼓那个小键值存储的时候也是这个感觉。当一个东西的复杂度低到你能在脑子里把它整个装下,你才真的能判断它。这个实验的全部说服力就来自这里——它没有被任何一层间接隔开,从模数到私钥,每一步你都看得见。
我们后来给 PKI 加的那些东西,HSM、密钥托管、审计、合规流程,挡的