Keycloak 获取keydove';s公钥

Keycloak 获取keydove';s公钥,keycloak,Keycloak,我意识到这个问题有很多重复。但我似乎不能正确理解答案 我们已经用oauth2 spring服务器保护了rabbitmq和rest端点。但它并没有我们需要和想要的所有功能。所以我们想用钥匙斗篷。我已经成功地保护了rest端点,只需转到新版本的SpringSecurity5.1,指定security.oauth2.resource.jwk.key-set-uri并设置必要的依赖项和配置 在尝试保护RabbitMQ时,我在检查消息头中的承载令牌时遇到了问题,因为KeyClope jwks端点没有返回真

我意识到这个问题有很多重复。但我似乎不能正确理解答案

我们已经用oauth2 spring服务器保护了rabbitmq和rest端点。但它并没有我们需要和想要的所有功能。所以我们想用钥匙斗篷。我已经成功地保护了rest端点,只需转到新版本的SpringSecurity5.1,指定security.oauth2.resource.jwk.key-set-uri并设置必要的依赖项和配置

在尝试保护RabbitMQ时,我在检查消息头中的承载令牌时遇到了问题,因为KeyClope jwks端点没有返回真正的RSA公钥

RabbitMQ使用从消息头获取令牌,并使用DefaultTokenServices检查令牌

根据我的理解,用键响应的端点是 在这个端点上执行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键。将其添加到RSAVifier最终会得到一个错误“由以下原因引起:org.springframework.security.jwt.codec.InvalidBase64CharacterException:Bad Base64数组位置2中的输入字符十进制95。”

但是,如果我登录到keydove管理页面,进入领域设置->密钥并单击公钥,则弹出窗口显示公钥减去“----开始公钥----”和“----结束公钥----”页眉和页脚。硬编码这使一切工作

钥匙编码了吗? 我尝试过使用Base64Utils.decodeFromUrlSafeString和Base64Utils.decodeFromString。第一个返回较小的值,并且不喜欢该键,第二个创建非法参数异常非法base64字符5f

更新:
返回的n是模,e是公钥的公指数。但是如何获得实际的密钥字符串呢?

到integerbytes
,所以它不仅仅是base64解码。尝试:

BigInteger modulus = new BigInteger(1, Base64.decodeBase64("n-value-here"));
BigInteger exponent = new BigInteger(1, Base64.decodeBase64("e-value-here"));

密钥也可以直接打开,其格式可通过代码直接利用:

{
  "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
}
我还会在以下网站上找到它:

  • 打开管理控制台
  • 选择领域
  • 选择领域设置
  • 打开选项卡“键”
  • 打开“活动”选项卡
  • 在“公钥”列中,按“公钥”
  • 此时会出现一个带有公钥的弹出窗口
我真希望能更好地记录这一点。这会节省我很多时间。谢谢你的回答。@“Thomas Lann”我在测试时偶然发现了它,你是对的,它并没有真正的广告,这也意味着我不知道它是否会保留。知道如何获得公钥的过期时间吗?我想它最终应该会旋转。我检查了keydove用户界面上的证书,在那里您可以手动获取公钥,证书有效期为10年。但这并不是说在那之前它不会改变。我预计未来几年会有一次无法解释的短期停电现在我只是一次缓存15米的密钥。你知道Java客户端如何调用这个端点吗?我使用的是
keydepose管理客户端
,当我调用
keydepose.realm(realm.toRepresentation().getPublicKey()
时,它给出空值。我检查了一下,它调用了
/admin/realms/realmname
,而不是
/auth/realms/realmname
。好的,我找到了:
keydove.realm(realm.keys().getKeyMetadata().getKeys()