私钥口令该怎么管
给私钥加口令只是把保护转移到了口令上:加密私钥文件落到别人手里后,剩下的防线就是口令强度与口令派生方式。因此口令要按密钥材料同等级管理——足够长度与随机性、与其他系统口令不共用、支持轮换、有应急取用路径。传递方式同样重要: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 历史与进程列表,禁止使用 |
简单口令可被离线暴力破解:加密私钥的实际强度取决于口令强度与所用口令派生方式,短口令在高性能硬件面前很快被穷举。