Получение открытого ключа Keycloak - PullRequest
0 голосов
/ 23 января 2019

Я понял, что есть много итераций этого вопроса.Но я не могу понять ответ правильно.

Мы защитили наши конечные точки rabbitmq и rest с помощью пружинного сервера oauth2 , аналогичного этому посту .Но он не имеет всех функций, которые нам нужны и которые мы хотим.Поэтому мы хотели бы использовать Keycloak.Я успешно защитил остальную конечную точку, просто перейдя на новую версию Spring Security 5.1 и указав security.oauth2.resource.jwk.key-set-uri и установив необходимые зависимости и конфигурацию.

При попытке защитить RabbitMQ я столкнулся с проблемами при проверке токена носителя из заголовка сообщения, поскольку конечная точка jclo для keycloak не возвращает истинный открытый ключ RSA.

RabbitMQ использует CustomMessageListenerContainer для получения токена из заголовка сообщения и использования DefaultTokenServices для проверки токена.

Насколько я понимаю, конечная точка, которая отвечает ключом: https://keycloak -сервер / 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: Неверный ввод Base64 десятичного знака 95 в позиции массива 2.»

Однако, если я войду воткройте страницу администратора keycloak и перейдите в настройки области -> ключи и щелкните открытый ключ. Во всплывающем окне отображается открытый ключ минус «----- BEGIN PUBLIC KEY -----» и «----- END PUBLIC».КЛЮЧ ----- "колонтитулы.Жесткое кодирование позволяет работать всем.

Кодируется ли ключ?Я попытался сделать Base64Utils.decodeFromUrlSafeString и Base64Utils.decodeFromString.Первый возвращает что-то меньшее и не похожее на ключ, а затем создает исключение незаконного аргумента Недопустимый символ base64 5f.

Обновление: возвращаемое n является модульным, а e - открытым показателем открытого ключа.Но как получить фактическую строку ключа?

Ответы [ 3 ]

0 голосов
/ 23 января 2019

Ключи также находятся непосредственно на https://keycloak -сервере / 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
}
0 голосов
/ 12 августа 2019

Я нашел это также на:

  • открыть консоль администратора
  • выберите царство
  • выберите Настройки области
  • открыть вкладку «Ключи»
  • Открыть вкладку «Активно»
  • в столбце «Открытые ключи» нажмите «Открытый ключ» enter image description here
  • появляется всплывающее окно с открытым ключом.
0 голосов
/ 23 января 2019

Перед кодированием base64 существует toIntegerBytes , так что это не просто декодирование base64.Попробуйте:

BigInteger modulus = new BigInteger(1, Base64.decodeBase64("n-value-here"));
BigInteger exponent = new BigInteger(1, Base64.decodeBase64("e-value-here"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...