Keycloak 公钥格式

问题描述 投票:0回答:2

当我通过端点访问 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 公钥转换为该格式?

keycloak keycloak-services keycloak-rest-api
2个回答
6
投票

该 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 相同。

enter image description here

您可以找到这个位置。 {your-realm}/领域设置/密钥/RS256 RSA 公钥按钮

enter image description here

您可以从该网站验证公钥是否正确。

https://russelldavies.github.io/jwk-creator/

enter image description here

这是设置步骤

  1. 公钥使用:签名

  2. 算法:RS256

  3. 密钥 ID:从 UI kid 值复制 enter image description here

  4. 通过python程序使用公钥(上文字)

  5. 点击此按钮

  6. 获取 JWK - 它应该与 Keycloak 证书 API 匹配 - 附加在图像末尾 API响应JSON应该匹配JWT(红色圆圈数字6)内容。

http://localhost:8180/auth/realms/test/protocol/openid-connect/certs

enter image description here

enter image description here

“n”是公钥模块

“e”是公钥指数

这个公钥可以验证JWT


0
投票

这是一个 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"

© www.soinside.com 2019 - 2024. All rights reserved.