3. 私钥生成与保护
私钥是Keystore体系的信任根。私钥泄露等效于身份被完全接管。本章定义私钥从算法选型到存储归档的标准化作业流程,确保私钥具备足够的抗暴力破解强度,并全生命周期内保持机密性。
核心原则:私钥必须“生成于安全环境,存储于专用介质,使用于受控通道”。任何时候不得以明文形式出现在日志、配置文件、数据库或代码仓库中。
3.1 适用场景
- 为TLS/SSL服务器证书生成根CA或终端实体私钥。
- 为代码签名、JAR签名、APK签名生成私钥。
- 为SSH认证、Git操作生成用户私钥。
- 为区块链钱包或硬件安全模块(HSM)初始化密钥对。
- 为内部CA或证书管理系统签发私钥。
3.2 前置条件
| 条件项 | 要求 |
|---|---|
| 操作系统 | Linux / macOS / Windows WSL2,确保无后门或恶意程序。 |
| 工具链 | OpenSSL 1.1.1+ 或 Keytool (JDK 11+)。 |
| 熵源 | 确认系统熵池充足(/proc/sys/kernel/random/entropy_avail > 256)。 |
| 物理环境 | 离线或隔离网络环境,无屏幕录像、键盘记录风险。 |
| 权限 | 使用专用服务账号操作,禁止 root 直连操作。 |
3.3 操作步骤
步骤1:环境准备与熵源检查
# 检查熵池
cat /proc/sys/kernel/random/entropy_avail
# 若低于256,安装熵服务(Linux)
sudo apt-get install haveged
sudo systemctl enable --now haveged
输出物:熵池值记录 entropy_check.log。
步骤2:选定密钥算法与强度
| 算法 | 最小强度 | 推荐强度 | 适用证书类型 |
|---|---|---|---|
| RSA | 2048 bit | 3072 bit | SSL/TLS、代码签名 |
| ECDSA | P-256 | P-384 | TLS 1.3、区块链 |
| Ed25519 | — | 固定256 bit | SSH、Git、内部CA |
禁止项:严禁使用 RSA 1024 bit 及以下、DSA 算法、EC 曲线 secp256k1 以外未标准化曲线。
步骤3:密码短语策略
- 长度:不少于16个字符。
- 复杂度:包含大小写字母、数字、至少1个特殊符号(
!@#$%^&*)。 - 防猜测:避免字典词、生日、键盘连续序列(如
qwerty123)。 - 存储:立即写入密码保险箱(如KeePass、Bitwarden企业版),不留在剪贴板或文本文件。
# 生成高强度密码短语示例(使用OpenSSL随机数)
openssl rand -base64 24
# 输出类似: 4R7oP2kLxz9QwY0VnJmT3sB=
步骤4:执行私钥生成
方式A:OpenSSL 生成 RSA 私钥
openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:3072 \
-aes-256-cbc -pass pass:"你的密码短语" \
-out /etc/pki/private/server.key
chmod 600 /etc/pki/private/server.key
方式B:OpenSSL 生成 ECDSA P-384 私钥
openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:P-384 \
-aes-256-cbc -pass pass:"你的密码短语" \
-out /etc/pki/private/ecdsa.key
chmod 600 /etc/pki/private/ecdsa.key
方式C:Keytool 生成 JKS 私钥(内置Keystore)
keytool -genkeypair -alias server -keyalg RSA -keysize 3072 \
-keystore /etc/pki/keystore.jks -storepass "存储密码" \
-keypass "私钥密码" -dname "CN=example.com,O=Example,C=CN"
输出物:受密码保护的私钥文件,权限 600。
步骤5:私钥安全归档
| 存储介质 | 适用性 | 冗余副本数 |
|---|---|---|
| HSM / 安全加密机 | 生产环境根私钥 | 2~3份(不同物理位置) |
| 加密U盘(LUKS/VeraCrypt) | 备份与离线归档 | 2份 |
| 密码保险箱 | 开发、测试环境 | 1份+加密备份 |
# 使用加密压缩归档(示例)
tar czf private_key_backup.tar.gz /etc/pki/private/
gpg --symmetric --cipher-algo AES256 \
--passphrase "归档密码" private_key_backup.tar.gz
rm private_key_backup.tar.gz
# 将 .tar.gz.gpg 复制至离线U盘
3.4 输入输出物
| 类型 | 名称 | 格式 | 保管责任 |
|---|---|---|---|
| 输入 | 密码短语策略文档 | Markdown / PDF | 安全负责人 |
| 输出 | 私钥文件(加密) | PEM / DER | 密钥管理员 |
| 输出 | 熵检查日志 | 文本 | 运维工程师 |
| 输出 | 密钥生成操作记录 | CSV / Syslog | 安全审计员 |
3.5 责任边界
- 运维工程师:执行生成步骤,确保环境隔离与熵源充足。
- 密钥管理员:保管密码短语并将其注入密码保险箱,负责私钥介质物理安全。
- 安全审计员:复核生成日志、权限设置、归档加密强度,出具合规报告。
- 开发/应用负责人:接收公钥或证书,无权接触私钥明文。
3.6 记录材料
| 记录项 | 内容 | 保留期限 |
|---|---|---|
| 生成操作日志 | 时间、操作人、算法、指纹、校验和 | ≥证书有效期+2年 |
| 密码短语交接单 | 经双方签字的加密移交记录 | 永久 |
| 归档清单 | 介质编号、位置、加密算法、最后验证日期 | 永久 |
3.7 异常处理
| 异常场景 | 处理动作 | 责任人 |
|---|---|---|
| 熵源不足(<256) | 安装 haveged/rng-tools,等待熵池恢复后再执行 | 运维工程师 |
| 密码短语遗忘 | 必须重新生成密钥对,旧私钥立即吊销 | 密钥管理员 |
| 生成过程中断 | 删除不完整文件,检查磁盘空间,重新执行完整步骤 | 运维工程师 |
| 算法不匹配错误 | 核对OpenSSL/Keytool版本,更新工具至支持推荐曲线的版本 | 运维工程师 |
3.8 验收标准
- 强度验证:通过
openssl rsa -pubout或openssl ec -pubout确认密钥位长。 - 权限检查:私钥文件权限为
600,所属用户为专用服务账号。 - 密码保护:未提供密码短语时,任意工具无法读取私钥内容。
- 归档完整性:解压加密归档后,文件校验和与生成日志一致。
- 审计记录:所有操作日志已写入集中审计系统,内容无截断。
# 验收检查命令示例
# 检查RSA密钥位长
openssl rsa -in server.key -passin pass:"密码短语" -pubout | openssl rsa -pubin -text -noout | grep "Key"
# 检查私钥权限
ls -la /etc/pki/private/server.key
# 应显示 -rw------- 1 svc_tls svc_tls ... server.key
# 密码短语保护验证(不提供密码应报错)
openssl rsa -in server.key -pubout 2>&1 | grep -i "bad decrypt\|error"