max*_*175 19 oauth-2.0 jwt jwk
我正在阅读有关 JWKS 的信息,并找到有关密钥轮换概念的信息 - https://developer.okta.com/docs/concepts/key-rotation/
假设我在应用程序中使用 JWKS,但我不会定期获取它们,因此只是硬编码。单键 JSON 对象看起来像
{
"kty": "RSA",
"e": "xxx",
"use": "sig",
"kid": "xxx",
"x5t": "xx",
"x5c": [
"xxx"
],
"n": "xxx
}
Run Code Online (Sandbox Code Playgroud)
JWKS 为您提供公钥,以便您可以验证 JWT。现在提问。
请考虑上面的示例,因此我在应用程序中有密钥,并且想知道何时应该更换它们。
当然,我知道这是不好的做法(我应该直接从 JWKS 端点获取密钥并感到安全),但这只是一个示例(如果这是一个愚蠢的示例,请提出一个更好的示例来描述上下文)。
ide*_*ral 35
JSON Web 密钥集(JWKS 又名 JWK 集)是 JSON Web 密钥 (JWK) 的列表。由于 JWK Set 只是一个容器,因此它不包含到期日期/时间等元数据。
它没有公开这一点至少有两个原因:
尽管出现紧急情况,出于良好的安全卫生考虑,提供商确实会定期轮换密钥。要处理密钥轮换(无论是计划内的还是紧急的),您的应用程序应遵循简单的算法。它应该定期从 JWKS 端点获取密钥,构建所有密钥的本地副本,并根据上次获取的信息从该副本添加/删除密钥。您的应用程序应仅使用在本地副本中找到的密钥来执行加密操作,例如验证 JWT 上的签名。
每个JWK都有一个kid
(key id)参数,该参数用于匹配特定的key。RFC 7517 建议kid
在密钥翻转期间在 JWK 集中的一组密钥中进行选择。当您的应用程序从 JWKS 获取密钥时,您会将来自 JWK 的密钥集与本地副本中的密钥集进行比较。比较基于kid
. 如果 JWKS 中存在某个密钥kid
,但本地副本中不存在,则应将此密钥添加到您的副本中。反之亦然,如果带有 some 的密钥kid
存在于本地副本中但不存在于 JWKS 中,则应从本地副本中删除此密钥。
您的应用程序应该多久从 JWKS 获取密钥一次?这取决于您,取决于您的应用程序和/或您的组织的风险承受能力。有些应用程序每分钟获取一次,其他应用程序每小时或每天获取一次。
假设您的应用程序从不进行此提取,密钥是硬编码在您的应用程序中的。这将一直有效,直到密钥被提供商删除为止。(我们假设我们在这里讨论的是公钥。JWK 可以代表私钥......并且您不会希望嵌入到您的应用程序中)。有些提供商不会轮换密钥,或者在很长一段时间内不会轮换密钥。如果您正在与(对您来说)知名的提供商打交道,并且他们向您保证不会轮换密钥,则将密钥嵌入到您的应用程序中的风险很低。
一般来说,将公钥嵌入到应用程序中并不是一个好主意。如果您要使用 JWKS 端点,请实现如上所述的简单获取 + 更新解决方案。
归档时间: |
|
查看次数: |
9128 次 |
最近记录: |