第4章:密钥生成实战:OpenSSL、AWS KMS、Azure Key Vault

密钥生成这事儿,看着简单,其实坑不少。我早年带团队的时候,有个同事直接用 OpenSSL 生成了一个 2048 位 RSA 密钥对,然后随手扔在 GitHub 上“测试用”,结果被爬虫抓了,整个 CI/CD 流水线得重搭。从那以后,我养成了一个习惯:生成密钥之前,先想清楚三个问题——密钥类型是什么、算法参数怎么定、最终存在哪。

这一章咱们就拿着三个真实工具上手干:OpenSSL(本地)、AWS KMS(云托管)、Azure Key Vault(微软云)。我会把每一步拆开讲,顺便提提我踩过的坑。

密钥生成方案选择与执行流程 密钥生成实战:方案选择与执行流程 1. 需求分析 算法/长度/用途/合规 2. 工具选择 本地 OpenSSL AWS KMS Azure Key Vault 3. 生成 & 安全存储 4. 使用 & 定期轮转 先定需求 再选工具

4.1 本地生成:OpenSSL

OpenSSL 是最原始也最灵活的方式。你想想看,几乎所有 Linux 发行版都自带,一条命令就能把私钥和公钥吐出来。但灵活意味着你得自己负责任——密钥文件权限、随机数种子、备份策略,统统得你管。

我个人习惯先检查版本:

openssl version

推荐 1.1.1 以上,老版本有安全漏洞。然后生成一个 4096 位的 RSA 密钥对,加 AES-256 加密保护私钥:

openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:4096 \
  -aes-256-cbc -out private_key.pem

这步会提示你输入密码。相信我,别嫌麻烦——我曾经见过有人为了省事不加密,结果私钥被同事误传出去,整个项目域要重做。

小贴士: 公钥提取用 openssl pkey -in private_key.pem -pubout -out public_key.pem。公钥可以公开,私钥必须用 600 权限。

对于非对称密钥,除了 RSA 还有 ECDSA。用椭圆曲线(比如 prime256v1)生成的密钥更短、计算更快。命令是:

openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:prime256v1 \
  -aes-256-cbc -out ec_private.pem
注意: OpenSSL 生成的私钥是 PEM 格式,以 -----BEGIN PRIVATE KEY----- 开头。千万别把这个文件直接提交到 Git 仓库里。我在生产环境遇到过三次这样的乌龙,每次都是血的教训。

4.2 云托管:AWS KMS

AWS KMS 的好处是你不用管物理安全——硬件安全模块(HSM)由 AWS 维护,密钥永远不会以明文形式离开服务。但代价是每个 API 调用都花钱,而且密钥一旦创建就不可导出私钥(除非你用 Custom Key Store 导入自己的 HSM,不过那是高级玩法)。

实操步骤很简单。我一般用 AWS CLI 或控制台。比如创建一个对称密钥(AES-256)用于数据加密:

aws kms create-key --key-usage ENCRYPT_DECRYPT --origin AWS_KMS

返回的 KeyId 后面要用。如果你想用非对称密钥(RSA 2048)做数字签名:

aws kms create-key --key-usage SIGN_VERIFY --customer-master-key-spec RSA_2048
关键区别: OpenSSL 生成的是文件,KMS 生成的是托管对象。KMS 密钥只能通过 API 使用,不能下载私钥。适合场景:你需要大量加密解密操作,且不想自己管密钥生命周期。

我踩过的坑:有一次给客户做密钥轮转,直接删掉了旧的 KMS 密钥,结果所有用那个密钥加密的 S3 对象全废了。AWS KMS 的密钥删除默认有等待期(7-30天),千万别强行跳过。如果要轮转,建议启用自动轮转(每年一次)或用多版本方案。

特性 OpenSSL AWS KMS
私钥导出 可以(以文件存储) 不可以(托管服务)
硬件保护 无(依赖主机安全) HSM(FIPS 140-2 Level 3)
成本 零(免费) 每月每密钥+API 费用
速度 快(本地计算) 慢(网络延迟+限频)

4.3 微软云:Azure Key Vault

Azure Key Vault 和 AWS KMS 很像,但注意它分两种资源类型:Key Vault(标准层)和 Managed HSM(专用硬件)。标准层后台也是 HSM,但密钥材料在服务端加密存储;Managed HSM 给你独占的 HSM 分区,合规性更高。

用 Azure CLI 创建一个 Key Vault(如果还没有):

az keyvault create --name my-kv-demo --resource-group my-rg --location eastus

然后生成一个 2048 位 RSA 密钥:

az keyvault key create --vault-name my-kv-demo --name myRSAKey \
  --kty RSA --size 2048 --protection software

这里 --protection 可以选 software 或 hsm。HSM 版本更贵但更安全。生成出来的密钥标识符类似于 https://my-kv-demo.vault.azure.net/keys/myRSAKey/version。

警告: Azure Key Vault 的软删除默认开启,删掉密钥后你还有 90 天可以恢复。但如果你手动关闭了软删除(历史配置),删掉就真找不回来了。我有个客户就是关了软删除后误删了密钥,一周的数据全得回滚,那场面……

另外,Azure 支持BYOK(Bring Your Own Key)——你可以在本地用 HSM 生成密钥,然后导入到 Key Vault。这适合已经有一套密钥管理体系的组织。

4.4 选型建议

说了这么多,其实说白了就一句话:管理成本 vs 安全等级的权衡。

  • 如果你在做开发测试、个人项目,OpenSSL 足够了,记得加密私钥+严格权限。
  • 产品环境需要审计、自动轮转、合规(PCI-DSS、SOC2),直接上云 KMS/Key Vault。
  • 如果你的合规要求到 FIPS 140-2 Level 3 以上,必须用云 HSM 或自建 HSM 集群。

那混合架构怎么办?我建议分层管理:把加密云的 KMS 密钥作为根密钥,用它来保护 OpenSSL 生成的本地密钥信封。这样既能享受云的审计能力,又不损失本地加密性能。嗯,具体做法在后面的章节会展开。