Reed's News
← 返回精选

破解90年代证书颁发机构的RSA密钥

Tech 64 ahlCVA 2026/9/8 864 字 原文 ↗

……来自90年代的故事

最近我一直在思考RSA的安全性问题。RSA加密的核心,在于大素数乘积的因式分解难度,但“多大才算大”是个值得玩味的问题。早在十多年前,网页公钥基础设施(PKI)就弃用了1024位RSA。虽然目前尚无公开案例表明有人成功破解过该长度的密钥,但对于掌握大量计算资源的政府或机构而言,这已具备理论可行性。就在几天前,有人成功分解了RSA因式分解挑战中的862位密钥RSA-260,这是我所知已被破解的最长密钥。如今全球普遍采用至少2048位的RSA,但受未来量子计算机的威胁,这一标准也即将被淘汰。

这让我萌生了一个想法:小型RSA密钥,哪怕是普通台式电脑也能破解。而在网页PKI发展初期,既无统一标准,也没有最低密钥长度要求。Netscape于1994年推出SSL支持,IE紧随其后。当时加密技术还受出口管制限制。那有没有足够小、我自己就能破解的密钥呢?这么做没有实际意义,但想想就觉得有趣。

答案当然是肯定的,但首先得找到合适的破解目标。

幸运的是,早期浏览器安装包中预装了根证书,而archive.org网站上保存着Internet Explorer和Netscape的历史版本存档。这些存档虽不完整,但足以覆盖大部分早期根证书颁发机构(CA)。我下载了两类存档,借助Claude Code提取出所有根证书,并将这些“远古”根证书托管在一个由Claude生成的网页上——点击查看全部旧根证书。虽然我尚未验证大语言模型生成的内容是否完全可靠,但整体看起来可信度很高。

通过该网站的筛选功能,我们可以找到被信任用于SSL的小密钥。

筛选出的512位RSA根证书列表,其中包含Netscape 4.51预装的E-Certify RSA 512 Gold根证书

有目标了!1999年3月,Netscape 4.51预装了两枚512位RSA根证书:一枚用于SSL,另一枚用于S/MIME。这两枚证书都来自现已倒闭的加拿大证书机构E-Certify。

同年晚些时候,512位的RSA-155被成功破解。可见即便在当时,512位密钥也已属于高危级别,本就不该被预装到浏览器中。

2002年,Netscape移除了这两枚E-Certify 512位根证书。遗憾的是,IE似乎从未预装过用于SSL的512位根证书,所以我们的“破解游戏”只能限定在Netscape的这一小段历史版本中。

对根证书中的公钥进行因式分解,就能得到重构私钥所需的两个素数。我在自己的Ryzen 9 5950X台式机上运行了CADO-NFS:破解用于SSL的E-Certify RSA 512 Gold Server耗时32小时,破解用于S/MIME的E-Certify RSA 512 Gold Client耗时29小时。你可以在下方获取生成的私钥。

按照说明安装CADO-NFS后,操作十分简单。首先需要从证书中提取待分解的模数,用一段Python代码即可实现:

from cryptography import x509
f = open("gold-server.pem", "rb").read()
pubkey = x509.load_pem_x509_certificate(f).public_key()
print(pubkey.public_numbers().n)

得到的N值就是要传入CADO-NFS的参数,运行命令如下:

./cado-nfs.py $N -t 32 --workdir /data/cert1

如果你能设法运行Netscape 4.51,并且将系统时钟设置在E-Certify根证书过期时间(2003年10月16日)之前,就可以用这些私钥签发证书。当然,现实中几乎没人会这么做——除了我搭建的这个虚拟机。

验证签发的证书能否在Netscape 4.51中正常工作,本身就是一场挑战:Netscape 4.51的TLS能力与任何现代TLS协议栈完全不兼容。于是我再次借助Claude Code,用Go语言编写了一个适配旧协议的定制化TLS服务器。该服务器已公开部署在e-certify.fly.dev,你可以用自己的Netscape版本尝试访问,但现代浏览器无法打开这个网站。

Netscape 4.51证书查看器显示,e-certify.fly.dev的证书由E-Certify RSA 512 Gold Server签发

如果你想用这些“复古”密钥搭建自己的网站,所有密钥和工具都托管在这个代码仓库:https://github.com/mcpherrinm/ancientroots。或者你可以搞点更“坏”的操作,比如对那些把时钟调回25年前的Netscape 4.51用户实施SSL中间人攻击……

C=CA, O=E-Certify, OU=RSA Gold Server, CN=E-Certify RSA 512 Gold Server
-----BEGIN CERTIFICATE-----
MIIByjCCAXSgAwIBAgIBATANBgkqhkiG9w0BAQQFADBjMQswCQYDVQQGEwJDQTES
MBAGA1UEChMJRS1DZXJ0aWZ5MRgwFgYDVQQLEw9SU0EgR29sZCBTZXJ2ZXIxJjAk
BgNVBAMTHUUtQ2VydGlmeSBSU0EgNTEyIEdvbGQgU2VydmVyMB4XDTk4MTAxNjEz
Mzc1M1oXDTAzMTAxNjEzMzc1M1owYzELMAkGA1UEBhMCQ0ExEjAQBgNVBAoTCUUt
Q2VydGlmeTEYMBYGA1UECxMPUlNBIEdvbGQgU2VydmVyMSYwJAYDVQQDEx1FLUNl
cnRpZnkgUlNBIDUxMiBHb2xkIFNlcnZlcjBcMA0GCSqGSIb3DQEBAQUAA0sAMEgC
QQDNVQ93Ev7zgNaJAR1Z7gCydU6mky1e/B4EbY1NsdtfsitU9cELqg5uRJDPA40n
CDPeOyil1lJ5N8hekcqJAkkXAgMBAAGjEzARMA8GA1UdEwEB/wQFMAMBAf8wDQYJ
KoZIhvcNAQEEBQADQQB09SV6OeeDEP8Je3DOLNZ24U98NHqIBTDyB4sRpDmNdHum
+3rm4AYtznBxG5hEShO89bcWi3yJtBITGuTRDnMq
-----END CERTIFICATE-----
-----BEGIN RSA PRIVATE KEY-----
MIIBOgIBAAJBAM1VD3cS/vOA1okBHVnuALJ1TqaTLV78HgRtjU2x21+yK1T1wQuq
Dm5EkM8DjScIM947KKXWUnk3yF6RyokCSRcCAwEAAQJAWZ2FOWf+A9K4T2VAJS69
+SU/pW3YwHrysuYJZN56K0Iz+Hqd1hBhCeJ3/T+/cvXq+ctD0x3uOxU1rDSeCoMO
KQIhAPdbc1wTm3twWDYi1iXmRBXz97MYxRFld/KFr8x5+tK9AiEA1IG09a+oVg6j
NMDj6GD7spaD4q9t1wk/Nyq/MTLPkmMCIEzzYjvuzZvlI0wUIlLAA8Zgk1pgBk6X
Jm2IMVyHRgRxAiEAjZKgCTHuVu7HgiSjcTPzW0X1NTckWSc66zjaSR+Ns/sCICxT
yXoTXWQCWL6BMpf2no7IlvoEnBIrED2Frq3PxlEA
-----END RSA PRIVATE KEY-----
C=CA, O=E-Certify, OU=RSA Gold Client, CN=E-Certify RSA 512 Gold Client
-----BEGIN CERTIFICATE-----
MIIByjCCAXSgAwIBAgIBAjANBgkqhkiG9w0BAQQFADBjMQswCQYDVQQGEwJDQTES
MBAGA1UEChMJRS1DZXJ0aWZ5MRgwFgYDVQQLEw9SU0EgR29sZCBDbGllbnQxJjAk
BgNVBAMTHUUtQ2VydGlmeSBSU0EgNTEyIEdvbGQgQ2xpZW50MB4XDTk4MTAxNjEz
MzQwOFoXDTAzMTAxNjEzMzQwOFowYzELMAkGA1UEBhMCQ0ExEjAQBgNVBAoTCUUt
Q2VydGlmeTEYMBYGA1UECxMPUlNBIEdvbGQgQ2xpZW50MSYwJAYDVQQDEx1FLUNl
cnRpZnkgUlNBIDUxMiBHb2xkIENsaWVudDBcMA0GCSqGSIb3DQEBAQUAA0sAMEgC
QQBwCcT1iYlNyKPywB/kffD8esiCzGYJxSnTXQjU6ej/XxnA+9yqjzAMPtqFd094
wM89Vsmz9YOWSO6Qn6wOAs45AgMBAAGjEzARMA8GA1UdEwEB/wQFMAMBAf8wDQYJ
KoZIhvcNAQEEBQADQQAdktdM5AzW+0o96eHCHwD3UfzxPvjKxPEjiI/QTn+njHt/
BEJb9yZatONRckglVc9v8P8Dy8HZGQD0+Pn0uxhW
-----END CERTIFICATE-----
-----BEGIN RSA PRIVATE KEY-----
MIIBOQIBAAJAcAnE9YmJTcij8sAf5H3w/HrIgsxmCcUp010I1Ono/18ZwPvcqo8w
DD7ahXdPeMDPPVbJs/WDlkjukJ+sDgLOOQIDAQABAkASXZeaxFPsm0I8zb+snfR9
/saVolnrqhVEH5EODdXy3nSm6fpdrsDwQDDg52biXjIUizQYdd3OourOn0/PyyiB
AiEAyW4gFFgM0dJ+Y//vrIyQutLeH/5c/Vq3Lbcxv7R908kCIQCOZAAv8OCG/2oH
yKaYj/EoxcFZ9csVh/kjicO/JIX+8QIhAMEzAkvhBDLALYAmvDCJBkxa8rhHFdPf
jbCodGwGZ2WZAiB//XmBnlZkYl/PoVfGmNRgHun+0AZ9UxzqCeJvBQiBMQIgHWlr
0Sh1a8K2pQP2ktgmL3RH5+1Qd2wLx/hhGWtwPvU=
-----END RSA PRIVATE KEY-----

额外补充:Internet Explorer 3.02预装了一枚代码签名证书机构,名为OU=Test VeriSign Commercial Software Publisher CA。我不确定它的具体用途,但破解难度同样很低。远古根证书仓库中还有其他几枚看似用于测试的512位RSA密钥,你可以尝试破解它们,或是探索它们能派上什么用场!

Steve Weis曾用GPU集群仅耗时约一小时就破解了这枚密钥:

L=Internet, O=VeriSign, Inc., OU=Test VeriSign Commercial Software Publisher CA
-----BEGIN CERTIFICATE-----
MIIByDCCAXKgAwIBAgIQIsTi2AgEp+1OkpqVLROnazANBgkqhkiG9w0BAQQFADBl
MREwDwYDVQQHEwhJbnRlcm5ldDEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xNzA1
BgNVBAsTLlRlc3QgVmVyaVNpZ24gQ29tbWVyY2lhbCBTb2Z0d2FyZSBQdWJsaXNo
ZXIgQ0EwHhcNOTYwNTAyMTcwMTUyWhcNOTcwNTAyMTcwMTUyWjBlMREwDwYDVQQH
EwhJbnRlcm5ldDEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xNzA1BgNVBAsTLlRl
c3QgVmVyaVNpZ24gQ29tbWVyY2lhbCBTb2Z0d2FyZSBQdWJsaXNoZXIgQ0EwXDAN
BgkqhkiG9w0BAQEFAANLADBIAkEA1XqTpg1hQWq6IKvBXLor12GBTH6y4BHyOJjy
MJISn0ZWBqkbZiEfoWgaWXhEwrvxMWonLA2vYFHijofFG4YIjwIDAQABMA0GCSqG
SIb3DQEBBAUAA0EAKxuR/KPJPDNJgw0ORqqM7SlvIeqnVP71OEFytqPaZw/3TPEi
9oK6PzBvPdLBZlnjRd/hf58FW2+/PXxsFl78Mg==
-----END CERTIFICATE-----
-----BEGIN RSA PRIVATE KEY-----
MIIBOwIBAAJBANV6k6YNYUFquiCrwVy6K9dhgUx+suAR8jiY8jCSEp9GVgapG2Yh
H6FoGll4RMK78TFqJywNr2BR4o6HxRuGCI8CAwEAAQJAYM8tlegLarcToS1CiuKC
bzHwiNgMFkENL01sx0n21/MhmA6pBiSwVn3Pu6yvx6EMB1zbCsaBHs/VTyofMbRW
QQIhAOqdAX3bVZwAlZ5FDWyfGwgE0FXEIQ85kjcihrFeDs49AiEA6PBfC0YuNMSa
M135mH+MEY1GEmQe9xHcXpiYAPazCrsCIQDDtuw6oJEfDYHCwRn8xhGXs+RT18Q4
Xi9yXRP9vFgfhQIhAIYUTfD0XYZcIBIvJosj56D2u328iaJXcow0s1Hirp4fAiAG
bza0Qcc27d/0OzKOqep3JrDl/L5HidTj2XEqEXmnXw==
-----END RSA PRIVATE KEY-----

最后值得一提的是,SSL Labs给我的测试网站打出了“好评”。

SSL Labs报告显示e-certify.fly.dev评级为F,存在多项安全问题