【问题标题】:How does http://jwt.io retrieve keycloak signing key?http://jwt.io 如何检索 keycloak 签名密钥?
【发布时间】:2020-12-26 02:45:36
【问题描述】:

我正在尝试使用 Keycloak OAUTH 服务器 (7.0.11),它似乎运行良好,但我仍然对如何验证它生成的令牌感到困惑。例如,我生成了一个id_token 并将其粘贴到http://jwt.io 中,它显示了一个格式良好的有效负载和以下标头:

{
  "alg": "RS256",
  "typ": "JWT",
  "kid": "<my-key-id>"
}

它还显示“签名验证”,并以某种方式将有效的 RSASHA256 公钥检索到 jwt.io HTML 页面中的适当形式。

我希望能够通过检查签名自己验证令牌。我的理解是,我通过从 keycloak 服务器 JWKS 证书端点检索公共签名密钥来做到这一点:https:///auth/realms/core/protocol/openid-connect/certs。结果对象包含一个键:

{
      "kid":"<matches-my-key-id-above>",
      "kty":"RSA",
      "alg":"RS256",
      "use":"sig",
...
      "x5c":["<snip>"],
...
}

kids 匹配很好,但x5c 中的值与http://jwt.io 显示的公钥不匹配,当我将x5c 值粘贴到它的位置时表格说签名无效。根据https://www.rfc-editor.org/rfc/rfc7517,该值应该已经是base64编码的(在我看来也是如此)。

很遗憾,我无法将其缩小为一个针对性很强的问题。但是……

  • 为什么我的 keycloak 身份验证服务器报告的密钥没有验证令牌 - 特别是因为来自令牌的 kid 和唯一的 JWKS 密钥匹配?
  • 如果我的标头不包含任何要查询的jkuhttp://jwt.io 如何找到任何公钥来检查签名?

TIA 大家。

【问题讨论】:

    标签: oauth-2.0 jwt keycloak


    【解决方案1】:

    我有一个描述该过程的blog post。您所做的一切听起来都是正确的,除了在将密钥粘贴到 jwt.io 之前用众所周知的分隔符将其包围。

    -----BEGIN CERTIFICATE-----
    token signing public key
    -----END CERTIFICATE-----
    

    当然,programmatic solutions 使用自动执行此类操作的库。

    Keycloak 的关键细节可能略有不同,例如:

    • 开始/结束 RSA 密钥

    【讨论】:

    • 您好,感谢您的回复,我会检查您的博客。不幸的是,我将我的证书粘贴到表单中,留下了现有的 BEGIN/END 分隔符行,这些分隔符行已经存在于显然有效的密钥中。让我感到困惑的是,那些分隔线之间的内容是完全不同的键值。
    【解决方案2】:

    我发现了一个有趣的解释——但不是一个完整的答案——在 Keycloak 服务器领域服务器设置中,有一个公钥和一个证书。

    公钥确实是验证我的访问令牌的正确值,以及当我加载我的访问令牌时 jwt.io 表单中显示的内容(仍然不知道它是如何检索它的)。

    证书是我向证书端点/JWKS 发出 HTTP 请求时返回的内容。

    所以我不应该通过证书验证我的访问令牌?或者我可以使用另一组参数来通过证书而不是公钥进行验证?

    【讨论】:

      【解决方案3】:

      已解决:不久前解决了此问题,但忘记更新此线程:诀窍是查询主发行者领域:https://&lt;server&gt;:&lt;port&gt;/auth/realms/&lt;realm&gt; 确实返回领域公钥:

      {
        "realm": "testrealm",
        "public_key": "<THIS BIT HERE SNIPPED>",
        "token-service": "https://.../auth/realms/testrealm/protocol/openid-connect",
        "account-service": "https://.../auth/realms/testrealm/account",
        "tokens-not-before": 0
      }
      

      该公钥是对所有令牌的签名而不是领域 JWKS 端点返回的 x509 证书。

      【讨论】:

        猜你喜欢
        • 2021-12-20
        • 2020-12-27
        • 2015-03-18
        • 1970-01-01
        • 2023-04-11
        • 1970-01-01
        • 1970-01-01
        • 2016-03-23
        • 2013-02-20
        相关资源
        最近更新 更多