CloudHSM 核心就两件事,管理用户和管理Key,本节我们介绍管理Key。
CloudHSM 操作
├── 管理 Users(用户管理)
│ ├── 创建/删除用户
│ ├── 修改密码
│ └── 设置权限(Admin/CU)
│
└── 管理 Keys(密钥管理)
├── 创建/删除密钥
├── 导入/导出密钥
├── 共享密钥
└── 使用密钥(加密/解密/签名)
问题:
你在 HSM 1 上创建了一个密钥
│
▼
下一次操作可能被路由到 HSM 2
│
▼
HSM 2 还没有这个密钥 → ❌ 失败!
解决方案是密钥同步,CloudHSM 提供两种同步方式:
| 类型 | 说明 | 时机 |
|---|---|---|
| Server-side Sync | 服务端后台同步 | 异步,有延迟 |
| Client-side Sync | 客户端主动同步 | 创建时立即同步 |
流程如下:
创建密钥
│
▼
┌───────┐
│ HSM 1 │ ← 密钥先在这里创建
└───┬───┘
│
┌────────────┼────────────┐
│ │ │
▼ ▼ ▼
Client-side Server-side
Sync Sync
(立即同步) (后台异步)
│ │
└────────────┼────────────┘
│
▼
┌───────┐
│ HSM 2 │ ← 密钥同步到这里
└───────┘
两种同步方式对比:
| 特性 | Server-side Sync | Client-side Sync |
|---|---|---|
| 触发时机 | 后台自动 | 创建密钥时立即 |
| 同步速度 | 较慢(有延迟) | 较快(实时) |
| 密钥持久性 | 有风险窗口 | 更安全 |
| 配置 | 默认启用 | 需要配置 |
举例来说:
最坏情况(只有 Server-side Sync):
1. 在 HSM 1 创建密钥
2. 还没同步到 HSM 2
3. HSM 1 突然故障
4. 密钥丢失!所有加密数据无法解密!
Client-side Sync 解决:
1. 在 HSM 1 创建密钥
2. 立即同步到 HSM 2
3. 即使 HSM 1 故障
4. 密钥在 HSM 2 还有
什么时候关心Client-side Sync:
| 场景 | 是否需要关注 |
|---|---|
| 普通使用 | 默认就好 |
| 创建密钥后立即使用 | 可能需要 |
| 高可用/关键业务 | 确保 Client-side 开启 |
新版 SDK 默认开启,一般不用管
在创建key之前,先创建一个CU,然后用这个CU登录:

aws-cloudhsm > login --username keyuser1 --role crypto-user
Enter password:
{
"error_code": 0,
"data": {
"username": "keyuser1",
"role": "crypto-user"
}
}
创建key参考: https://docs.aws.amazon.com/cloudhsm/latest/userguide/cloudhsm-cli-generate-symmetric-keys.html
AES Key 专门用于 AES 加密解密;Generic Secret 是通用密钥材料,用于 HMAC、密钥派生等非加密场景。
aws-cloudhsm > key generate-symmetric generic-secret \
--label generic-secret-example \
--key-length-bytes 32
aws-cloudhsm > key generate-symmetric aes \
--label aes-example \
--key-length-bytes 32

key generate-asymmetric-pair rsa \
--public-exponent 65537 \
--modulus-size-bits 2048 \
--public-label rsa-public-example \
--private-label rsa-private-example

key list

搜索key:
key list --filter attr.label="my_unique_key_label" --verbose
key list --filter attr.key-type=rsa attr.class=private-key --verbose
key list --filter attr.label="my_key_to_delete" --verbose # 先搜索
key delete --filter attr.label="my_key_to_delete" # 再删除
key list --filter attr.label="my_key_to_delete" # 最后确认删除