首页/安全/加密与证书速查/私钥口令处理规范

私钥口令处理规范

保护私钥的口令应按密钥材料同等级管理:足够长度与随机性、与其它系统口令区分、通过环境变量或文件描述符注入而非命令行参数,并支持轮换与应急取用。

加密与证书速查安全更新于 2026-10-13

私钥口令该怎么管

给私钥加口令只是把保护转移到了口令上:加密私钥文件落到别人手里后,剩下的防线就是口令强度与口令派生方式。因此口令要按密钥材料同等级管理——足够长度与随机性、与其他系统口令不共用、支持轮换、有应急取用路径。传递方式同样重要:OpenSSL 支持 env:、file:、fd: 等前缀,把口令放在环境变量、受限文件或文件描述符里,避免出现在命令行参数中。命令行明文写口令会同时进 shell 历史和进程列表。

基本信息

传递方式OpenSSL 支持 env:、file:、fd:、stdin 等前缀
风险做法命令行明文写口令,进入 shell 历史与进程列表
口令强度长度足够且随机,与业务口令区分
存放要求与加密私钥分离存放、权限受限、访问留痕
派生方式加密私钥的口令派生强度影响离线爆破难度
长期方向接入 KMS/HSM,取消人工口令环节

典型使用场景

  • 服务启动加载加密私钥:用文件描述符或密码文件注入口令。
  • CI 流水线签名:通过环境变量或密钥管理服务注入,不落明文。
  • 交接与应急:明确口令保管人、取用流程与轮换周期。
  • 安全审计:证明口令没有出现在脚本、历史文件或镜像中。
  • 暴力破解风险评估:确认口令强度足以抵御离线攻击。

口令注入示例

口令注入示例
# 通过环境变量注入,避免出现在命令行参数
openssl pkey -in enc.key -passin env:KEY_PASS -pubout > pub.pem
# 通过文件描述符注入,口令文件不出现在参数里
openssl pkey -in enc.key -passin fd:3 3< /run/secrets/keypass -pubout
# 不推荐:明文写在命令行,会留在 shell 历史与进程列表
# openssl pkey -in enc.key -passin pass:MyPass123 -pubout

口令传递方式对比

方式写法风险
环境变量-passin env:NAME进程环境对同机其他用户可能可见
受限文件-passin file:/run/secrets/p文件权限与备份范围必须收紧
文件描述符-passin fd:3 3< file相对更隐蔽,仍依赖文件保护
标准输入-passin stdin适合交互,脚本中需配合管道
命令行明文-passin pass:xxxx进 shell 历史与进程列表,禁止使用
简单口令可被离线暴力破解:加密私钥的实际强度取决于口令强度与所用口令派生方式,短口令在高性能硬件面前很快被穷举。

易错点

  • 在命令行明文写口令:泄露到 shell 历史与进程列表,事后清理也难保证覆盖。
  • 口令与加密私钥放在同一份备份中:等于没有加密。
  • 全公司共用同一口令:一处泄露牵连全部私钥,且无法单独轮换。
  • 没有应急取用路径:保管人不在时无法启动服务,被迫临时关掉加密。

数据来源与参考

  • OpenSSL 官方文档(-passin env:/file:/fd:)
  • NIST SP 800-57(密钥保护)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌