RSA 密钥对校验与公钥提取

贴一把私钥,再贴公钥、证书、OpenSSH 公钥或者 JWK,直接告诉你两者是不是同一对。也可以只用私钥,把对应的公钥导出来。

  • 判断依据是数学,不是文件名。RSA 公钥就是模数 n 和公开指数 e,私钥里存的也是同一个 n 和 e,所以比完整模数就能确定是不是同一对。这里不做「开头结尾各 16 位」这种模糊比较。
  • 内容不上传。解析和指纹都在本机用 node-forge 算完。带口令的私钥需要填密码才能读出模数,密码同样只在本机使用。

5 个容易搞混的地方

「是不是一对」只看模数。RSA 的密钥对由三个数决定:模数 n、公开指数 e、私有指数 d。公钥是 (n, e),私钥是 (n, d) 加上几个加速用的中间值。两边共享同一个 n,所以判断是否配套只需要比 n。指纹、位长、注释这些都不参与判断:注释可以随便改,位长只能说明范围,指纹是从公钥算出来的所以必然一致——它们只是让人更容易核对,不能替代模数比较。

证书里的公钥要单独抽出来看。一张 X.509 证书本身不是密钥,它是「公钥 + 身份信息 + CA 签名」的打包。证书里真正和私钥有关的部分叫 SubjectPublicKeyInfo,本页就是从证书的 tbsCertificate 里把这一项抽出来,再和私钥比模数。所以「证书能配得上这把私钥」和「证书是可信的」是两件事:前者是数学问题,后者要看签发链和有效期,本页只回答前者。

加密私钥需要密码才能比。带密码的私钥在磁盘上是一段密文,密码不对就解不出模数,也就无从比较。本页支持 PKCS#8 的 ENCRYPTED PRIVATE KEY(OpenSSL 3 的默认产物)和传统的 Proc-Type / DEK-Info 写法。密码错误的提示会明确说是密码问题,而不是「密钥不匹配」——这两件事的排查方向完全不同。

对不上时先怀疑拿错了文件。实际运维里「不匹配」最常见的原因根本不是密钥损坏,而是拿了另一套环境的文件:预发和生产的私钥长得一模一样,文件名都是 server.key;或者证书更新过一轮,私钥还没换。看清楚证书里的主体和有效期能不能对上你部署的域名,比反复核对模数更省时间。

SSH 和 TLS 用的是两套公钥写法。同一把 RSA 密钥,装到服务器上给 SSH 用时写成 authorized_keys 里的一行 ssh-rsa,给 Nginx 用时写成 PEM 的 SPKI,给 JWK 体系用时写成 JSON。三种写法的模数完全一样,本页都能读出来并比对,所以不用为了比对再把这些格式互相转换一遍。