JWK什么时候到期?JWKS轮换政策

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。现在提问。

  1. JWKS过期后可以获取信息吗?例如,我可以使用 JWK 生成 .cert 文件并打开它来检查过期日期吗?
  2. JWKS 提供商是否会在计划密钥轮换时公开信息或者可能是敏感信息?

请考虑上面的示例,因此我在应用程序中有密钥,并且想知道何时应该更换它们。

当然,我知道这是不好的做法(我应该直接从 JWKS 端点获取密钥并感到安全),但这只是一个示例(如果这是一个愚蠢的示例,请提出一个更好的示例来描述上下文)。

ide*_*ral 35

  1. JSON Web 密钥集(JWKS 又名 JWK 集)是 JSON Web 密钥 (JWK) 的列表。由于 JWK Set 只是一个容器,因此它不包含到期日期/时间等元数据。

  2. 它没有公开这一点至少有两个原因:

  • RFC 7517是管理 JWK 和 JWK Set 行为的规范。它没有提及或要求提供商发布到期日期/时间。也许这是由于原因#2:
  • 提供商应该能够随时以任何理由删除密钥。可能的原因:密钥已被泄露。(对于私钥/公钥对,这意味着私钥已被泄露,并且通过 JWKS 发布的相应公钥应从流通中删除)。这个例子是一个异常值,但它确实发生了,提供商必须立即采取行动来修复它。

尽管出现紧急情况,出于良好的安全卫生考虑,提供商确实会定期轮换密钥。要处理密钥轮换(无论是计划内的还是紧急的),您的应用程序应遵循简单的算法。它应该定期从 JWKS 端点获取密钥,构建所有密钥的本地副本,并根据上次获取的信息从该副本添加/删除密钥。您的应用程序应仅使用在本地副本中找到的密钥来执行加密操作,例如验证 JWT 上的签名。

每个JWK都有一个kid(key id)参数,该参数用于匹配特定的key。RFC 7517 建议kid在密钥翻转期间在 JWK 集中的一组密钥中进行选择。当您的应用程序从 JWKS 获取密钥时,您会将来自 JWK 的密钥集与本地副本中的密钥集进行比较。比较基于kid. 如果 JWKS 中存在某个密钥kid,但本地副本中不存在,则应将此密钥添加到您的副本中。反之亦然,如果带有 some 的密钥kid存在于本地副本中但存在于 JWKS 中,则应从本地副本中删除此密钥。

您的应用程序应该多久从 JWKS 获取密钥一次?这取决于您,取决于您的应用程序和/或您的组织的风险承受能力。有些应用程序每分钟获取一次,其他应用程序每小时或每天获取一次。

假设您的应用程序从不进行此提取,密钥是硬编码在您的应用程序中的。这将一直有效,直到密钥被提供商删除为止。(我们假设我们在这里讨论的是公钥。JWK 可以代表私钥......并且您不会希望嵌入到您的应用程序中)。有些提供商不会轮换密钥,或者在很长一段时间内不会轮换密钥。如果您正在与(对您来说)知名的提供商打交道,并且他们向您保证不会轮换密钥,则将密钥嵌入到您的应用程序中的风险很低。

一般来说,将公钥嵌入到应用程序中并不是一个好主意。如果您要使用 JWKS 端点,请实现如上所述的简单获取 + 更新解决方案。

  • 感谢您的详细回答!我真的很高兴有人可以添加几句话,尤其是关于密钥轮换的内容。 (2认同)