RSA 私钥口令管理
给私钥加口令、换一个新口令,或者把口令彻底去掉。改完之后页面会用新口令自己解一遍,确认生成的文件真的能打开。
新生成的私钥文件只在浏览器内存里,切走页面就没了,务必先下载再关。口令不会上传,但页面也不会帮你保存——忘了就是真的打不开了。
要做什么
私钥
加密参数
5 个需要先想清楚的点
私钥加口令有意义,但别当成保险箱。口令保护解决的是「文件被拿走」这个风险:备份盘丢了、笔记本被顺手牵走、代码仓库误提交,这时候有口令至少不会让对方立刻用上。但它在密钥已经加载进内存的服务器上起不到任何作用,也挡不住在同一台机器上读进程内存的攻击。所以正确做法是两者叠加:磁盘上的私钥加口令,生产环境再用 HSM 或密钥管理服务托底。
迭代次数是「安全性和方便性」之间的旋钮。口令本身不是加密密钥,而是通过 PBKDF2 反复哈希才得到真正的密钥。迭代次数越高,攻击者每试一个口令的代价越大,但你自己每次打开私钥时的等待也等比例增加。2048 次是 OpenSSL 1.x 的老默认值,放在今天偏低;十万次是多数场景的合理起点;到了六十万次,每次打开要两三秒,只适合把密钥离线存档、一年用几次的情况。
Proc-Type 那个老写法为什么还要留着。带 Proc-Type 和 DEK-Info 两个头部行的写法是 OpenSSL 早期版本的产物,密钥派生函数是它自己那套,迭代次数固定为 1。安全性明显弱于 PBES2,但它能存在的原因是兼容性:一些老版本的 Java、工控设备和嵌入式工具链根本读不懂 PKCS#8 的 PBES2 结构。新部署一律用 PKCS#8,只有对接这类老东西时才切过去。
换口令和轮换密钥是两件事。换口令保护的是同一个私钥文件;轮换密钥是生成一对新的、替换掉线上的旧密钥。前者用于「口令可能被人瞄到过」这类情况,后者用于「私钥本身可能已经泄露」。常见误区是:私钥泄露之后换口令就安全了——完全没有用,泄露指的是私钥内容已经出去,旧密钥在数学上就应该当作失效。正确动作是尽快签发新证书、更新服务器配置、清理旧密钥。
口令忘了就是密钥没了。PEM 的口令保护没有「找回」或「重置」通道,这是设计如此。忘记口令等于这把私钥作废,能做的只有用原来的 CSR 重新签一份证书(前提是 CA 允许),否则就要走完整的重新签发流程。所以口令本身也需要备份——放进团队的密码管理器,而不是记在私钥文件旁边的 txt 里。
和命令行的对应关系
加口令:openssl pkcs8 -topk8 -in plain.key -out enc.key -aes256 -iter 100000。去口令:openssl pkcs8 -topk8 -nocrypt -in enc.key -out plain.key。改成传统写法:openssl rsa -in enc.key -aes256 -traditional -out legacy.key。本页做完的就是这三件事,只是不用去记参数位置。
有一点命令行和这里不同:OpenSSL 会在原地覆盖或多写一个文件,而这里只在内存里生成内容,需要你自己点下载。想比较新旧文件是否只是包装不同,可以用同样的方法算指纹——上面的 SHA256 指纹在改口令前后应当完全一致。