钥匙和令牌的轮换
1)为什么需要轮换
密钥和令牌不可避免地"老化":博客/备用中的曝光,内幕风险,图书馆漏洞,合作伙伴泄漏。轮换可降低"风险寿命",并在事件中提供可管理性。目标是建立可预测的轮换周期和快速召回机制,而无需停机。
2)领域: 我们轮换什么
签名/加密密钥:JWT(JWS/JWE),OAuth/OIDC,SAML,webhooks(HMAC),许可证。
集成的秘密:API密钥,客户机秘密,密码技术.用户。
TLS/mTLS:服务器/客户端证书、根/中间CA。
数据密钥:KMS/HSM,DEK(envelope加密)中的KEK/CMK。
Токены: access/refresh, service-to-service (mTLS, HMAC), short-lived session.
3)存储、版本、标签
KMS/HSM/Vault作为真相的来源。禁止将私有密钥存储在git/ENV/映像文件中。
转化:"key_id"/"version"+标签:"purpose=jwt-sign","env=prod","alg=ES 256","created_at","rotates_at"。
访问策略:基本权利原则(least privilege)、责任分工(SoD)。
审计:谁创建/阅读/签署;不变期刊。
4)基本轮换模式
4.1重迭窗口(graceful rollover)
新密钥→发布到JWKS/我们分发证书。
重叠窗口:验证新旧密钥,签名仅为新密钥。
宽限期到期后-我们从可信集中删除旧集。
4.2双重发行(双重运行)
在较短的时间内,当一些实例签名旧实例时,有些是新实例的(对于大副本)。
需要严格同步的JWKS并通过"kid"监控验证比例。
4.3 Rotate-on-schedule vs rotate-on-use
按计划:每N天/周一次(签名密钥,TLS)。
如果使用:refresh令牌-一次性,每次交换都会发布新的("滚动"轮换)。
5)JWT/JWKS: 实践
5.1标题和ID
在JWS标头中使用"kid"选择验证密钥。
最小克莱姆,短的"exp",正确的"aud/iss/nbf"。
json
{ "alg": "ES256", "kid": "jwt-2025-10", "typ": "JWT" }
5.2 JWKS出版
JWKS必须包含所有活动验证键(旧的+新的grace窗口)。
客户端JWKS缓存:短TTL(例如5-15分钟)。
当受到损害时-从JWKS(突然)中删除受损密钥,即高速缓存强制失效。
json
{
"keys": [
{ "kty":"EC","crv":"P-256","kid":"jwt-2025-10","use":"sig","alg":"ES256","x":"...","y":"..." },
{ "kty":"EC","crv":"P-256","kid":"jwt-2025-07","use":"sig","alg":"ES256","x":"...","y":"..." }
]
}
5.3 Cadens和时间表
JWT签名:每3-6个月轮换一个钥匙(或更常见的是高风险)。
"exp"访问令牌:5-30分钟;refresh-7-30天(带有"rotate-on-use")。
强制使用PoP/DPoP"粘合"(请参阅§8)以降低劫持风险。
6)HMAC轮换(webhooks/签名)
保持活跃和金丝雀的秘密;接受两个签名。
标题:"X-Signature"+"X-Timestamp";窗口限制± 300秒。
完全关闭旧的-发件人确认切换后。
对于合作伙伴:发布切换日期时间和endpoint验证。
7) TLS/mTLS和信任链
用于公共服务器证书(Let's Encrypt或企业CA)的ACME/自动更新。
mTLS:短客户端证书(7-30天),自动链路轮换(SPIFFE/SPIRE/mesh)。
中间/根CA的旋转仅通过重叠的信任锚点(信托缠结)和长金丝雀。
注意OCSP/CRL和clock-skew。在逻辑中-验证失败的原因。
8)PoP/DPoP和客户token↔klyuch捆绑包
DPoP(上市证明的演示):令牌与客户的公共密钥绑定;降低了replay的风险。
客户密钥轮换=在短时间内发布新DPoP密钥,令牌。
对于服务,首选的mTLS(设备/操作员"携带"HSM/TPM中的密钥)。
9) Refresh-tokens: rotate-on-use
一次性refresh令牌:每次交换→新的refresh+access。
带有TTL的"jti"/"sid"存储列表=refresh寿命。
重用细节(re-play):立即召回会议/设备,alert。
10)召回和锁定列表
JWT不带内窥镜:使用短的"exp"+"黑名单""jti"来处理关键案件(本地/在Redis中,散列哈希)。
OAuth进入:集中状态服务器;使用短TTL缓存"active=false/true"。
API密钥:存储密钥哈希(作为密码),所有者/特南特标签,scope,创建/最后访问日期;立即召回。
11)数据密钥: envelope加密
CMK/KEK(KMS/HSM)保护DEK;CMK轮换发生时无需重新绘制数据:pere-wrap DEK。
每个对象/tenant/party的DEK;KDF/HKDF用于衍生密钥。
销毁策略(crypto-shredding):删除KEK=破坏时的数据不可读性。
12)事件程序(损害)
1.冻结:禁用受损密钥上的令牌发布,将发行转换为新发行。
2.召回:从JWKS中删除"kid",召回证书(OCSP/CRL),锁定列表中的API密钥。
3.减少TTL:暂时减少"exp"代币,加强PoP/DPoP验证。
4.强制登录:禁用会议(revoke'sid'/'jti')。
5.Forenzics和报告:时间线,覆盖范围,受影响的人/什么;更新花花公子。
13)管道和滚动
13.1生成和出版
在HSM/KMS中生成密钥;私钥出口-禁止。
通过验证和测试自动发布JWKS/证书。
金丝雀发行:1-5%的客户→ 100%。
13.2健康控制
度量:"kid"验证比例,签名/证书错误,时钟漂移。
Alerta:由于签名而激增401/403, OCSP/CRL不可用,证书到期(T-30/T-7/T-1)。
14)Configi和示例
14.1 Vault/KMS(伪)策略示例)
hcl path "transit/keys/jwt-prod" {
capabilities = ["read," "update," "list"] # signature/rotation
}
path "transit/keys/jwt-prod/rotate" {
capabilities = ["update"]
}
14.2 JWT轮换计划示例
T0: create a new version of the key (kid = jwt-2025-10), add to JWKS
T0 + 15m: start signing with a new kid; validate with old and new
T0 + 7d: remove old kid from JWKS
T0 + 30d: delete old private key from KMS (schedule purge)
14.3 Envoy:强制更新JWKS(伪)
yaml jwt_authn:
providers:
oidc:
issuer: https://auth. example. com/
remote_jwks:
http_uri:
uri: https://auth. example. com/.well-known/jwks. json cluster: jwks_cluster timeout: 2s cache_duration: 300s # короткий TTL
15)可观察性和审计
Метрики: `jwt_verify_fail_total{reason}`, `jwks_refresh_total`, `jwks_kid_share{kid}`, `token_revoked_total`, `refresh_rotations_total`, `dpop_fail_total`.
Логи: `kid`, `jti`, `sid`, `reason`, `client_id`, `tenant`, `trace_id` (без PII).
Dashbords:按地区划分的"kid"份额卡,过期证书,召回频率,非有效签名。
16)反模式
长寿的JWT没有召回,也没有短暂的"exp"。
缺少"kid"和"手动"检查密钥。
在没有KMS的ENV/k8s-Secret中存储秘密,并且在etcd级别不加密。
非旋转的refresh代币;重复使用refresh而不使用检测器。
单个全局API键"全部"。
"安静"发布新密钥而不发布JWKS和监控。
零重叠窗口(即时更换)→质量为401/403。
17) iGaming/财务细节
监管和审计:不变的轮换/反馈逻辑;时间和行为者的可证明性。
Partnership PSP/KYC:每个合作伙伴/管辖区的独立密钥;在违反SLA/安全的情况下迅速召回。
多范围:带有scope的per-tenant API键;隔离品牌/区域密钥。
高风险:关键操作的PoP/DPoP,内部服务之间的短"exp",mTLS。
Backoffice:SSO/OIDC,短会话,硬件令牌(FIDO2),无处不在的按计划旋转。
18)准备就绪支票清单
- KMS/HSM/Vault中的所有私有密钥;禁止出口。
- JWKS以短TTL发布并缓存;JWT标题中有"kid"。
- 重迭窗口和自动滚动轮换计划。
- Refresh令牌是一次性的;TTL撤回的"jti"列表。
- HMAC秘密:主动+金丝雀;接待双方;已宣布T切换时间。
- TLS/mTLS: auto-renew, Alert T-30/T-7/T-1, trust bundle for change CA。
- Envelope加密:KEK/CMK轮换而不停机,DEK 对象/tenant。
- 签名/异同,JWKS,评论;dashbords "kid"-dole。
- 事件花花公子(损害)和定期演习。
- 使用新密钥/SA进行金丝雀和验证中继测试。
19) TL;DR
在KMS/HSM中保留密钥,用"kid"签名JWT,并发布JWKS。轮换密钥和重叠证书,通过"kid"观察验证份额。Refresh-使用上的旋转和短的"exp";对于关键操作-PoP/DPoP和mTLS。对于数据,使用带有KEK旋转的envelope加密,无需停机。实施指标/Alerta、事件花花公子和定期的金丝雀轮换。