第4章:密钥生成实战:OpenSSL、AWS KMS、Azure Key Vault
密钥生成这事儿,看着简单,其实坑不少。我早年带团队的时候,有个同事直接用 OpenSSL 生成了一个 2048 位 RSA 密钥对,然后随手扔在 GitHub 上“测试用”,结果被爬虫抓了,整个 CI/CD 流水线得重搭。从那以后,我养成了一个习惯:生成密钥之前,先想清楚三个问题——密钥类型是什么、算法参数怎么定、最终存在哪。
这一章咱们就拿着三个真实工具上手干:OpenSSL(本地)、AWS KMS(云托管)、Azure Key Vault(微软云)。我会把每一步拆开讲,顺便提提我踩过的坑。
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
-----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
我踩过的坑:有一次给客户做密钥轮转,直接删掉了旧的 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 支持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 生成的本地密钥信封。这样既能享受云的审计能力,又不损失本地加密性能。嗯,具体做法在后面的章节会展开。