2. 为根 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 口令必须纳入密钥托管流程。
- 文件头无 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 会再次提示输入同一口令,用于解密私钥以完成签名操作。口令验证通过后,证书签发流程才能继续。