Keycloakの公開鍵を取得する 質問する

Keycloakの公開鍵を取得する 質問する

この質問には多くの繰り返しがあることに気づきました。しかし、答えを正しく理解できないようです。

OAuth2 Springサーバーを使用して、rabbitmqとrestエンドポイントを保護しました。この投稿に似ているしかし、必要な機能がすべて備わっているわけではありません。そのため、Keycloak を使用したいと思います。Spring Security 5.1 の新しいバージョンに移行し、security.oauth2.resource.jwk.key-set-uri を指定して、必要な依存関係と構成を設定するだけで、REST エンドポイントを保護できました。

RabbitMQ を保護しようとしているときに、keycloak jwks エンドポイントが実際の RSA 公開キーを返さないため、メッセージ ヘッダーからベアラー トークンをチェックする際に問題が発生しました。

RabbitMQはカスタムメッセージリスナーコンテナメッセージ ヘッダーからトークンを取得し、DefaultTokenServices を使用してトークンをチェックします。

私の理解では、キーで応答するエンドポイントは https://keycloak-server/auth/realms/my-realm/protocol/openid-connect/certs です。このエンドポイントで HttpGet を実行すると、次のような応答が返されます。

{
    "keys": [{
            "kid": "7JUbcl_96GNk2zNh4MAORuEz3YBuprXilmTXjm0gmRE",
            "kty": "RSA",
            "alg": "RS256",
            "use": "sig",
            "n": "nE9gEtzZvV_XisnAY8Hung399hwBM_eykZ9J57euboEsKra8JvDmE6w7SSrk-aTVjdNpjdzOyrFd4V7tFqev1vVJu8MJGIyQlbPv07MTsgYE5EPM4DxdQ7H6_f3vQjq0hznkFvC-hyCqUhxPTXM5NgvH86OekL2C170xnd50RLWw8FbrprP2oRjgBnXMAif1Dd8kwbKKgf5m3Ou0yTVGfsCRG1_LSj6gIEFglxNHvGz0RejoQql0rGMxcW3MzCvc-inF3FCafQTrG5eWHqp5xXEeMHz0JosQ7BcT8MVp9lHT_utiazhQ1uKZEb4uoYOyy6mDDkx-wExpZkOx76bk_Yu-N25ljY18hNllnV_8gVMkX46_vcc-eN3DRZGNJ-Asd_sZrjbXbAvBbKwVxZeOTaXiUdvl8O0G5xX2xPnS_WA_1U4b_V1t28WtnX4bqGlOejW2kkjLvNrpfQ5fnvLjkl9I2B16Mbh9nS0LJD0RR-AkBsv3rKEnMyEkW9UsfgYKLFKuH32x_CXi9uyvNDas_q8WS3QvYwAGEMRO_4uICDAqupCVb1Jcs9dvd1w-tUfj5MQOXB-srnQYf5DbFENTNM1PK390dIjdLJh4k2efCJ21I1kYw2Qr9lHI4X2peTinViaoOykykJiol6LMujUcfqaZ1qPKDy_UnpAwGg9NyFU",
            "e": "AQAB"
        }
    ]
}

私の理解では、キー「n」のフィールドは RSA256 キーであるはずです。これを RSAVerifier に追加すると、最終的に「原因: org.springframework.security.jwt.codec.InvalidBase64CharacterException: 配列位置 2 の Base64 入力文字 10 進数 95 が不正です」というエラーが発生します。

ただし、Keycloak 管理ページにログインし、レルム設定 -> キーに移動して公開鍵をクリックすると、ポップアップに「-----BEGIN PUBLIC KEY-----」および「-----END PUBLIC KEY-----」のヘッダーとフッターを除いた公開鍵が表示されます。これをハードコーディングすると、すべてが機能するようになります。

キーはエンコードされていますか? Base64Utils.decodeFromUrlSafeString と Base64Utils.decodeFromString を試しました。最初のものは小さいものを返し、キーのようには見えません。後者は、不正な引数例外 Illegal base64 character 5f を作成します。

更新: 返される n はモジュラスであり、e は公開キーの公開指数です。しかし、実際のキー文字列を取得するにはどうすればよいでしょうか?

ベストアンサー1

キーも直接https://keycloak-server/auth/realms/my-realm
コードで直接利用できる形式:

{
    "realm": "my-realm",
    "public_key": "MIIBI...",
    "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
}

おすすめ記事