当我通过端点访问 Keycloak 领域的元数据时https://my-keycloak-host.com/auth/realms/my-realm,我可以获得“public_key”:
{
"realm": "my-realm",
"public_key": "MIIBIjANBg...",
"token-service": "https://keycloak-server/auth/realms/my-realm/protocol/openid-connect",
"account-service": "https://keycloak-server/auth/realms/my-realm/account",
"tokens-not-before": 0
}
当我使用
public_key
解析微服务中 keycloak 发出的 JWT 令牌时,它失败了,看起来我需要将此公钥转换为以字符串 -----BEGIN PUBLIC KEY-----
开头并以 -----END PUBLIC KEY-----
结尾的格式。
我想知道 keycloak 的当前格式是什么
public_key
& 如何使用“BEGIN”和“END”字符串将 keycloak 公钥转换为该格式?
该 API 的 public_key 是单个长字符串。 你只需按 64 大小断开多行
然后添加-----开始公钥-----
API 调用字符串的结果,每 64 个字节用新行分隔。
并添加-----结束公钥-----
它将转换为PEM(隐私增强邮件)格式
我做了一个简单的Python程序。
您需要更改网址
import requests
import json
def convert_public_key(text):
line_length = 64
lines = []
for i in range(0, len(text), line_length):
lines.append(text[i:i+line_length] + '\n')
return '-----BEGIN PUBLIC KEY-----\n' + \
''.join(lines) + \
'-----END PUBLIC KEY-----\n'
REALM_URL='http://localhost:8180/auth/realms/test'
response = requests.get(REALM_URL)
data = json.loads(response.content.decode('utf-8'))
print(convert_public_key(data['public_key']))
这是终端输出
$ python get-public.py
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAgeVGoYuRpoVttadu+ecg
mpzXiHsEF/9JbLZnxBIiBkdZAUICMbCp2EV+Q+R1HUcjaUs5ZNKVLqbINa0kMRaZ
B9/B8DidkPgMQx4iFg2inwKV8ZdAkbAuXltmfla1CwwoZlT+x/YTM7f5XoJlGkNU
XRF908ubFMlR8jTnw6w220nlduzAsz5Da1b4wyhmWXgCokGbSta7HXJD9O3z8Hf7
MfhLwLA9KTscCGLpoZSh94APX9Agr/8GE14GbpdRDTrhi2oBmdi/9hnSbXUms4ew
bxQGvuo0JDznLTCGeYempqSSE9vg5OrGPWxTT6cOs60C/KdmxqW8aVBYJOe7a2Os
uwIDAQAB
-----END PUBLIC KEY-----
与Keycloak UI 相同。
您可以找到这个位置。 {your-realm}/领域设置/密钥/RS256 RSA 公钥按钮
您可以从该网站验证公钥是否正确。
https://russelldavies.github.io/jwk-creator/
这是设置步骤
公钥使用:签名
算法:RS256
通过python程序使用公钥(上文字)
点击此按钮
获取 JWK - 它应该与 Keycloak 证书 API 匹配 - 附加在图像末尾 API响应JSON应该匹配JWT(红色圆圈数字6)内容。
http://localhost:8180/auth/realms/test/protocol/openid-connect/certs
“n”是公钥模块
“e”是公钥指数
这个公钥可以验证JWT
这是一个 bash 脚本,适用于 KC25 中领域的 OpenID 端点。它需要 JQ 才能工作,因此请确保已安装它。
#!/bin/bash
# ReplaceKEYCLOAK_URL and REALMID with the actual values
URL="https://KEYCLOAK_URL/realms/REALMID/protocol/openid-connect/certs"
json_data=$(curl -s "$URL")
# Extract the x5c certificate for the key with "use": "sig"
x5c_certificate=$(echo "$json_data" | jq -r '.keys[] | select(.use == "sig") | .x5c[0]')
if [ -z "$x5c_certificate" ]; then
echo "No x5c certificate found for use:sig"
exit 1
fi
echo "-----BEGIN CERTIFICATE-----" > keycloak_cert.pem
echo "$x5c_certificate" | fold -w 64 >> keycloak_cert.pem
echo "-----END CERTIFICATE-----" >> keycloak_cert.pem
echo "Certificate saved as keycloak_cert.pem"