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 验收标准

  1. 强度验证:通过 openssl rsa -pubout 或 openssl ec -pubout 确认密钥位长。
  2. 权限检查:私钥文件权限为 600,所属用户为专用服务账号。
  3. 密码保护:未提供密码短语时,任意工具无法读取私钥内容。
  4. 归档完整性:解压加密归档后,文件校验和与生成日志一致。
  5. 审计记录:所有操作日志已写入集中审计系统,内容无截断。
# 验收检查命令示例
# 检查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"
私钥生成与保护安全流程 1. 环境与熵源检查 2. 选定算法与强度 3. 密码短语策略 4. 执行私钥生成 5. 安全归档与备份 6. 强度与权限验收 安全红线 ▶ 禁止联网环境生成 ▶ 禁止截屏/录屏 ▶ 禁止剪贴板明文 ▶ 禁止root直连 ▶ 禁止复用同一密钥 输出:加密私钥(PEM) 输出:密码短语移交单 输出:归档加密包(.gpg)