http://jwt.io 如何检索 keycloak 签名密钥?

Posted

技术标签:

【中文标题】http://jwt.io 如何检索 keycloak 签名密钥?【英文标题】:How does http://jwt.io retrieve keycloak signing key? 【发布时间】: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 密钥匹配? 如果我的标头不包含任何要查询的jku,http://jwt.io 如何找到任何公钥来检查签名?

TIA 大家。

【问题讨论】:

【参考方案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 证书。

【讨论】:

以上是关于http://jwt.io 如何检索 keycloak 签名密钥?的主要内容,如果未能解决你的问题,请参考以下文章

使用JWT的OAuth2的SSO分析

Keycloak - 如何允许在没有注册的情况下链接帐户

回调 URL 在本地 Auth0 中不起作用

使用 SMS 进行用户验证的 Keycloak

Keycloak集成三方身份提供者的注销流程

Linux如何在多个文本文件中检索指定内容?