RSA 密钥对生成与指纹
在本机生成一对 RSA 密钥并导出各种常见格式,也可以反过来:贴一把现成的私钥或公钥,看它是多少位、指纹是多少。
密钥在本机生成,不会上传;但复制走之后怎么保管就是另一回事了。私钥文件权限设成 600,别放进 Git 或聊天工具。密钥一旦泄露,正确做法是重新生成并轮换。
解析已有密钥
支持 BEGIN RSA PRIVATE KEY(PKCS#1)、BEGIN PRIVATE KEY(PKCS#8)、BEGIN OPENSSH PRIVATE KEY(ssh-keygen 的默认新格式,未加密)、BEGIN PUBLIC KEY(SPKI)以及一行式的 ssh-rsa AAAA… 公钥。内容只在本机解析。
5 个容易踩的点
位长决定强度,也决定速度。RSA 的安全性来自大整数分解的难度。2048 位目前仍是工业标准的下限(NIST 建议至少用到 2030 年),3072 位大致相当于 128 位对称密钥的强度,4096 位更保守但生成和握手都明显更慢。一个常被忽略的代价是握手:4096 位的签名和验签在低配手机或 IoT 设备上会拖慢 TLS 建连,所以「越大越好」并不成立。
PKCS#1 和 PKCS#8 只差一层包装。两种格式的密钥内容完全一样,区别在外层结构。PKCS#1 直接是 RSAPrivateKey 序列,文件头写 RSA PRIVATE KEY;PKCS#8 在外面套了一层 PrivateKeyInfo,额外记录了算法标识,因此同一个文件可以装下 RSA、EC、Ed25519 各种密钥,文件头写 PRIVATE KEY。OpenSSL 可以互相转换:转换到 PKCS#8 用 openssl pkcs8 -topk8,换回 PKCS#1 用 openssl rsa -traditional。
两种指纹,认哪个都行。SSH 的现代指纹是 SHA256: 加 Base64(对应 ssh-keygen -lf 的默认输出),老的 MD5 指纹是 MD5: 加冒号分隔的十六进制(对应 ssh-keygen -E md5 -lf;很老的版本不带 MD5: 前缀,看到不带前缀的十六进制不要以为算错了)。两者算的都是公钥二进制块的摘要,不是模数的摘要,所以只能用来和 ssh-keygen 的输出对比,不能拿去和证书指纹对比。
公钥可以从私钥推出来,反过来不行。私钥里包含模数和私有指数,公钥的模数和公开指数就藏在其中,所以给一把私钥能立刻算出对应的公钥。反方向在数学上就是分解大整数,目前不可行。这个特性正好用来排查「服务器上装的是不是这把 key」:拿私钥算出公钥指纹,再去服务器上算一遍,一致就说明是同一把。
私钥的保管要求。私钥文件权限设成 600,只给需要的进程读。生成的私钥只在本机计算、不会上传,但复制走之后放在哪就是另一回事了。真要用在线上,建议生成后直接落到目标机器的正确路径,中间不要经过聊天工具、邮件或工单系统。如果密钥可能已经外泄,正确做法是重新生成并轮换,而不是换个文件名继续用。
生成之后怎么用
私钥落盘后立刻 chmod 600,只给需要的进程读。把公钥写进服务器的 authorized_keys 时,直接复制上面那行 OpenSSH 公钥即可,末尾的注释不参与验证,加不加都行。SSH 登录调试阶段可以看 ssh -v 的输出,它会打印实际用到的指纹,拿来和这里的结果比对最快。
要特别提醒:本页生成的密钥只在浏览器内存里,刷新页面就没了,务必先下载再关。真正用在生产环境的密钥,建议生成后直接写到目标机器的正确路径,中间不要经过聊天工具、邮件或工单系统——这几个地方都是密钥外泄最常见的入口。