2. 为根 CA 生成受密码保护的私钥

为根 CA 生成受密码保护的私钥 学习卡片

为什么根 CA 私钥必须加密存储

根 CA 的私钥是整个信任链的信任锚点:一旦泄露,攻击者可以签发任意伪造证书,且所有下级证书的吊销与重建成本极高。因此根 CA 私钥在磁盘上必须以加密形式保存,只有在签名操作时才短暂解密到内存中。OpenSSL 生成私钥时通过对称加密算法(如 AES-256-CBC)对 PKCS#8 私钥结构加密,口令经 PBKDF2 派生密钥,文件头会明确标注加密算法。

根 CA 私钥文件的安全边界:
磁盘上的密文(受口令保护) → 内存中的明文(仅签名瞬间) → 离线介质冷存储(推荐)

生成受密码保护的 RSA 私钥

使用 openssl genpkey 生成 4096 位 RSA 私钥,并用 AES-256-CBC 加密。相比旧命令 openssl genrsa -aes256,genpkey 支持更现代的算法标识与 PKCS#8 格式,是当前推荐方式。

# 生成 AES-256-CBC 加密的 4096 位 RSA 私钥
openssl genpkey \
  -algorithm RSA \
  -pkeyopt rsa_keygen_bits:4096 \
  -aes-256-cbc \
  -out rootCA.key.pem

# 执行时会提示输入并确认口令(至少 4 字符,建议 16 字符以上)
# Enter PEM pass phrase:
# Verifying - Enter PEM pass phrase:

生成后立即检查文件头,确认加密算法已生效:

head -3 rootCA.key.pem
# -----BEGIN ENCRYPTED PRIVATE KEY-----
# MIIFLTBXBgkqhkiG9w0BBQ0wSjApBgkqhkiG9w0BBQwwHAQI...
# -----END ENCRYPTED PRIVATE KEY-----

若文件头为 -----BEGIN PRIVATE KEY-----(无 ENCRYPTED 字样),说明私钥未加密,必须重新生成或补加密。

不同加密算法的保护效果对比

OpenSSL 支持多种对称加密算法保护私钥,选择时需权衡安全强度与兼容性。以下为同一 4096 位 RSA 私钥分别用不同算法加密后的实测对比(示例数据,基于 OpenSSL 3.x 环境):

加密算法 密钥长度 加密后文件大小 安全强度 兼容性 推荐场景
AES-256-CBC 256 位 约 3.4 KB 高(≈256 位) OpenSSL 1.0.2+ 根 CA 私钥首选
AES-128-CBC 128 位 约 3.4 KB 中(≈128 位) 广泛 兼容旧系统
DES-EDE3-CBC 168 位 约 3.4 KB 低(≈112 位) 极广泛 不推荐用于新 CA
不加密 — 约 3.2 KB 无 — 仅限测试环境
DES-EDE3-CBC(3DES)已被 NIST 于 2023 年正式弃用,其 64 位分组和 112 位有效强度不足以抵抗现代暴力破解。根 CA 私钥应使用 AES-256-CBC 或 AES-256-GCM(若工具链支持)。

验证加密私钥可用性

生成后必须验证口令正确且私钥结构完整,避免在后续签发证书时才发现问题:

# 验证私钥并查看密钥参数(会提示输入口令)
openssl pkey -in rootCA.key.pem -text -noout

# 输出应包含:
# Private-Key: (4096 bit, 2 primes)
# modulus:
#     00:c4:2f:...
# publicExponent: 65537 (0x10001)
# privateExponent:
#     ...

# 仅检查私钥是否可解密(不输出内容)
openssl pkey -in rootCA.key.pem -noout -check
# 输出:RSA key ok

若口令错误,OpenSSL 会报 bad decrypt 或 unable to load key,此时需确认口令或重新生成。验证通过后,将私钥文件权限收紧为 600,并离线备份到加密介质:

chmod 600 rootCA.key.pem
ls -l rootCA.key.pem
# -rw------- 1 user user 3432 ... rootCA.key.pem
根 CA 私钥加密生成与验证流程 输入参数 算法: RSA 密钥长度: 4096 bit 加密: AES-256-CBC 口令: ≥16 字符 openssl genpkey 生成 RSA 密钥对 PBKDF2 派生加密密钥 PKCS#8 封装 AES-256-CBC 加密 rootCA.key.pem -----BEGIN ENCRYPTED PRIVATE KEY----- Base64 编码密文 权限: 600 验证与判读 检查文件头 head -3 rootCA.key.pem 含 ENCRYPTED → 已加密 无 ENCRYPTED → 未加密 验证口令与结构 openssl pkey -in ... -check 输出 RSA key ok → 通过 bad decrypt → 口令错误 权限与备份 chmod 600 rootCA.key.pem 离线加密介质备份 口令与私钥分离保管 通过条件 文件头含 ENCRYPTED + pkey -check 返回 RSA key ok + 权限 600 + 离线备份完成 任一不满足 → 重新生成或修正后再进入根证书签发环节 算法选择 AES-256-CBC 首选 避免使用 3DES / 不加密 已弃用/不安全

常见问题与处理

  • 忘记口令:加密私钥无法恢复,只能重新生成并重新签发所有下级证书。根 CA 口令必须纳入密钥托管流程。
  • 文件头无 ENCRYPTED:说明生成时未指定 -aes-256-cbc 等加密参数,需删除后重新生成,或使用 openssl pkey -in key.pem -aes-256-cbc -out key_enc.pem 补加密。
  • 兼容性报错:部分旧版工具链不识别 PKCS#8 加密格式,可改用 openssl genrsa -aes256 -out rootCA.key.pem 4096 生成传统格式,但新项目应优先 PKCS#8。
  • 口令强度不足:OpenSSL 默认仅要求 4 字符,但根 CA 口令建议使用 16 字符以上、包含大小写字母、数字和符号的随机串,并存储在独立的密码管理器中。
生成加密私钥后,下一步即可用该私钥创建根 CA 的自签名证书。届时 OpenSSL 会再次提示输入同一口令,用于解密私钥以完成签名操作。口令验证通过后,证书签发流程才能继续。