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://
"kid":"<matches-my-key-id-above>",
"kty":"RSA",
"alg":"RS256",
"use":"sig",
...
"x5c":["<snip>"],
...
kid
s 匹配很好,但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://<server>:<port>/auth/realms/<realm>
确实返回领域公钥:
"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 签名密钥?的主要内容,如果未能解决你的问题,请参考以下文章