AWS Secrets Manager 实测:后量子 TLS 加密零配置启用与 CloudTrail 验证全解析¶
Lab 信息
- 难度: ⭐ 入门
- 预估时间: 15 分钟
- 预估费用: < $0.10(含清理)
- Region: us-east-1
- 最后验证: 2026-04-15
背景¶
量子计算的发展让 "harvest now, decrypt later"(HNDL)成为现实威胁——攻击者今天截获加密流量,等量子计算机成熟后再破解。NIST 已于 2024 年发布 FIPS 203(ML-KEM)标准,各国监管机构要求 2030-2035 年前完成后量子密码迁移。
AWS Secrets Manager 现在支持混合后量子密钥交换(X25519MLKEM768),将经典 X25519 与 ML-KEM 结合保护 TLS 连接。对于使用最新 SDK 的客户端,这个保护自动生效,无需代码改动。
本文实测验证了三种客户端(AWS CLI、Python SDK、Node.js SDK)的 PQ TLS 启用状态,通过 CloudTrail tlsDetails 对比经典 TLS 与后量子 TLS 的差异,并给出迁移建议。
前置条件¶
- AWS 账号,IAM 用户/角色需要以下权限:
secretsmanager:CreateSecretsecretsmanager:GetSecretValuesecretsmanager:DeleteSecretcloudtrail:LookupEvents
- AWS CLI v2(最新版本)
- Node.js 18+(测试 Node.js SDK)
核心概念¶
PQ TLS 支持矩阵¶
| 客户端 | 最低版本 | PQ TLS 自动启用 | 备注 |
|---|---|---|---|
| Secrets Manager Agent | 2.0.0+ | ✅ | |
| Lambda Extension | v19+ | ✅ | |
| CSI Driver | 2.0.0+ | ✅ | |
| AWS SDK for Rust | latest | ✅ | |
| AWS SDK for Go | latest | ✅ | |
| AWS SDK for JavaScript (Node.js) | latest | ✅ | 本文实测验证 |
| AWS SDK for Kotlin | latest | ✅ | |
| AWS SDK for Python (boto3) | latest | ⚠️ | 需要 OpenSSL 3.5+ |
| AWS SDK for Java v2 | v2.35.11+ | ⚠️ | 可能需要配置 |
| AWS CLI v2 | 待更新 | ❌ | 捆绑的 awscrt 版本较旧 |
关键术语¶
| 术语 | 说明 |
|---|---|
| X25519MLKEM768 | 混合后量子密钥交换算法 = X25519(经典)+ ML-KEM-768(后量子) |
| ML-KEM | Module-Lattice-based Key-Encapsulation Mechanism,NIST FIPS 203 标准 |
| HNDL | Harvest Now, Decrypt Later — 现在截获密文,未来用量子计算机破解 |
| tlsDetails | CloudTrail 事件中记录 TLS 连接详情的字段 |
动手实践¶
Step 1: 创建测试 Secret¶
aws secretsmanager create-secret \
--name pq-tls-test-secret \
--secret-string '{"test":"post-quantum-tls","timestamp":"2026-04-15"}' \
--region us-east-1
实测输出:
{
"ARN": "arn:aws:secretsmanager:us-east-1:xxxxxxxxxxxx:secret:pq-tls-test-secret-xxxxx",
"Name": "pq-tls-test-secret",
"VersionId": "96fbc68f-0bb4-49f2-b832-08088256f60f"
}
Step 2: AWS CLI 读取 Secret(基线测试)¶
记录当前时间,稍后查 CloudTrail 验证 TLS 详情。
Step 3: Node.js SDK 读取 Secret(PQ TLS 验证)¶
创建测试脚本 test-pq.mjs:
import {
SecretsManagerClient,
GetSecretValueCommand,
} from "@aws-sdk/client-secrets-manager";
const client = new SecretsManagerClient({ region: "us-east-1" });
// 执行 3 次调用
for (let i = 0; i < 3; i++) {
const resp = await client.send(
new GetSecretValueCommand({ SecretId: "pq-tls-test-secret" })
);
console.log(`Call ${i + 1}: OK -`, resp.Name);
}
console.log("Done. Check CloudTrail in 5-15 minutes.");
安装依赖并运行:
Step 4: Python SDK 读取 Secret(对比测试)¶
import boto3
client = boto3.client("secretsmanager", region_name="us-east-1")
for i in range(3):
resp = client.get_secret_value(SecretId="pq-tls-test-secret")
print(f"Call {i+1}: OK - {resp['Name']}")
print("Done. Check CloudTrail in 5-15 minutes.")
Step 5: CloudTrail 验证(5-15 分钟后)¶
这是整个实验的核心验证步骤。等待 5-15 分钟后查询 CloudTrail:
aws cloudtrail lookup-events \
--lookup-attributes AttributeKey=EventName,AttributeValue=GetSecretValue \
--start-time "$(date -u -d '30 minutes ago' '+%Y-%m-%dT%H:%M:%SZ')" \
--end-time "$(date -u '+%Y-%m-%dT%H:%M:%SZ')" \
--max-results 10 \
--region us-east-1 \
--output json
从返回的 CloudTrailEvent JSON 中提取 tlsDetails 字段。
Node.js SDK 的 CloudTrail 事件(实测):
{
"tlsDetails": {
"tlsVersion": "TLSv1.3",
"cipherSuite": "TLS_AES_128_GCM_SHA256",
"clientProvidedHostHeader": "secretsmanager.us-east-1.amazonaws.com",
"keyExchange": "X25519MLKEM768"
}
}
AWS CLI / Python SDK 的 CloudTrail 事件(实测):
{
"tlsDetails": {
"tlsVersion": "TLSv1.3",
"cipherSuite": "TLS_AES_128_GCM_SHA256",
"clientProvidedHostHeader": "secretsmanager.us-east-1.amazonaws.com",
"keyExchange": "x25519"
}
}
快速提取 keyExchange 的脚本
用以下一行命令提取所有 GetSecretValue 调用的 TLS 密钥交换算法:
aws cloudtrail lookup-events \
--lookup-attributes AttributeKey=EventName,AttributeValue=GetSecretValue \
--start-time "$(date -u -d '30 minutes ago' '+%Y-%m-%dT%H:%M:%SZ')" \
--end-time "$(date -u '+%Y-%m-%dT%H:%M:%SZ')" \
--max-results 50 --region us-east-1 --output json | \
python3 -c "
import json, sys
data = json.load(sys.stdin)
for e in data.get('Events', []):
ct = json.loads(e['CloudTrailEvent'])
ua = ct.get('userAgent', '')[:60]
ke = ct.get('tlsDetails', {}).get('keyExchange', 'N/A')
print(f'{ct[\"eventTime\"]} | {ua} | keyExchange: {ke}')
"
Step 6: 性能对比¶
在同一环境下对三种客户端各执行 20 次 GetSecretValue,测量端到端延迟(含 TLS 握手):
| 客户端 | TLS 类型 | 平均延迟 | P50 | P95 |
|---|---|---|---|---|
| Python + CRT | x25519(经典) | 226.9ms | 228.7ms | 239.1ms |
| Python 无 CRT | x25519(经典) | 234.3ms | 235.9ms | 243.3ms |
| Node.js SDK | X25519MLKEM768(PQ) | 226.4ms | 228.4ms | 231.4ms |
结论:PQ TLS 握手开销可忽略不计。 Node.js SDK 使用后量子 TLS 的延迟与 Python SDK 使用经典 TLS 几乎相同。
测试结果¶
| # | 测试场景 | 客户端 | keyExchange | 结果 |
|---|---|---|---|---|
| 1 | AWS CLI v2 (awscrt 0.31.2) | CLI 2.34.29 | x25519 | ❌ 经典 TLS |
| 2 | Python SDK + CRT (awscrt 0.32.0) | boto3 1.42.87 | x25519 | ❌ 经典 TLS |
| 3 | Python SDK 禁用 CRT | boto3 1.42.87 | x25519 | ❌ 经典 TLS |
| 4 | Node.js SDK | @aws-sdk 3.1030.0 | X25519MLKEM768 | ✅ PQ TLS |
| 5 | 性能对比 | 全部 | — | ✅ PQ 无显著开销 |
踩坑记录¶
踩坑 1: Python SDK 需要 OpenSSL 3.5+ 才能启用 PQ TLS
公告声明 Python SDK "with OpenSSL 3.5+" 支持 PQ TLS。在我们的 Ubuntu 22.04 环境中(OpenSSL 3.0.2),即使安装了 awscrt 0.32.0 且该库包含 TlsCipherPref.PQ_DEFAULT,CloudTrail 仍显示 keyExchange: x25519。
影响:大部分生产环境运行 Ubuntu 22.04/24.04(OpenSSL 3.0-3.3),无法自动获得 PQ TLS 保护。需要升级到支持 OpenSSL 3.5+ 的发行版,或使用 Node.js SDK 作为替代。
踩坑 2: AWS CLI v2 捆绑旧版 awscrt,不支持 PQ TLS
AWS CLI v2.34.29 捆绑的 awscrt 版本为 0.31.2(比 pip 安装的 0.32.0 旧),CloudTrail 显示 keyExchange: x25519。
影响:通过 AWS CLI 管理 Secrets 的运维操作暂时无法获得 PQ TLS 保护。需要等待 CLI 更新捆绑的 CRT 版本。
发现: CloudTrail tlsDetails 新增 keyExchange 字段
CloudTrail tlsDetails 中的 keyExchange 字段同时记录经典 TLS(x25519)和后量子 TLS(X25519MLKEM768)的密钥交换算法。这使得安全团队可以通过 CloudTrail 精确审计哪些 API 调用已受 PQ TLS 保护。
合规价值:可以用 Athena/CloudTrail Lake 查询所有 keyExchange != 'X25519MLKEM768' 的事件,识别尚未迁移到 PQ TLS 的客户端。
费用明细¶
| 资源 | 单价 | 用量 | 费用 |
|---|---|---|---|
| Secrets Manager(1 个 Secret,按比例) | $0.40/月 | < 1 天 | < $0.02 |
| API 调用 (~100 次 GetSecretValue) | $0.05/10,000 | 100 次 | < $0.01 |
| CloudTrail 管理事件查询 | 免费 | — | $0 |
| 合计 | < $0.05 |
清理资源¶
# 删除测试 Secret(立即删除,不等待恢复期)
aws secretsmanager delete-secret \
--secret-id pq-tls-test-secret \
--force-delete-without-recovery \
--region us-east-1
务必清理
Secret 按月计费($0.40/月),Lab 完成后请执行清理步骤。
结论与建议¶
现状总结¶
后量子 TLS 在 Secrets Manager 端已全面就绪,但客户端侧的支持参差不齐:
- Node.js SDK:✅ 已自动启用,零配置
- Python SDK:⚠️ 需要 OpenSSL 3.5+,大部分现有环境尚不满足
- AWS CLI v2:❌ 暂不支持,等待版本更新
迁移建议¶
| 场景 | 推荐方案 | 紧迫性 |
|---|---|---|
| 新应用(Node.js/Rust/Go/Kotlin) | 直接使用最新 SDK,自动启用 PQ | 立即 |
| 现有 Python 应用 | 等待 OpenSSL 3.5+ 环境或切换到 Node.js | 中期(2027 前) |
| Lambda 函数 | 使用 Lambda Extension v19+ | 立即 |
| K8s 工作负载 | 升级 CSI Driver 到 2.0.0+ | 立即 |
| CLI 运维操作 | 等待 CLI 更新;高安全场景可用 SDK 脚本替代 | 低 |
安全合规角度¶
-- CloudTrail Lake / Athena: 查找未使用 PQ TLS 的 Secrets Manager 调用
SELECT eventTime, userAgent,
json_extract_scalar(tlsDetails, '$.keyExchange') as keyExchange
FROM cloudtrail_logs
WHERE eventSource = 'secretsmanager.amazonaws.com'
AND json_extract_scalar(tlsDetails, '$.keyExchange') != 'X25519MLKEM768'
ORDER BY eventTime DESC