首页 > 解决方案 > 如何正确公开 CAS 生成的 JWT 票证的公共签名密钥

问题描述

更新:

经过进一步测试,我认为的 RSA 设置似乎可以正常工作,但实际上并非如此。在 CAS 可以支持 JWT 票证的非对称密钥之前,这个问题变得无关紧要。

我的用例:

CAS 版本:6.2.0-RC2

将 CAS 用于许多应用程序的单点登录。后端身份提供者是 LDAP。感兴趣的客户端是重定向到 CAS 进行登录的 SPA。成功登录 CAS 后,将通过配置的服务提供者发出 JWT。我已经设置服务提供商通过 RSA 使用非对称密钥对 JWT 进行签名。这一切都在工作。我无法工作的是“jwtTicketSigningPublicKey”执行器端点。

我希望能够发布公钥,以便我的 SPA 能够动态获取公钥以进行标牌验证,这样我就可以在必要时轮换 RSA 密钥,而无需在 SPA 端进行任何更改。我认为这是此功能的目的,但是当我按照此处的指示将其暴露后到达端点时,我得到了 404。

我的配置:

这是我的 cas.config 文件与此端点相关的样子:

# Expose it
management.endpoints.web.exposure.include=jwtTicketSigningPublicKey
# Enable it
management.endpoint.jwtTicketSigningPublicKey.enabled=true
# Allow access to it
cas.monitor.endpoints.endpoint.jwtTicketSigningPublicKey.access=ANONYMOUS

然后我反弹 CAS 服务器,我可以在http://mycas.com/cas/actuator的执行器链接中看到端点,如下所示:

"jwtTicketSigningPublicKey":{"href":"http://mycas.com/cas/actuator/jwtTicketSigningPublicKey","templated":false}

正如文档所指的那样,我可以像这样传递一个可选的服务参数来获取与“每个服务”实现相关联的公钥,这就是我所拥有的。我像这样到达终点:

http://mycas.com/cas/actuator/jwtTicketSigningPublicKey?service=http://example.org

此时我收到 404。如果我在没有服务参数的情况下点击端点,我也会收到 404。但我希望如此,因为我实际上没有全局定义的 RSA 对。

我的解决方案尝试:

我可以想象应该提供这个公钥的最合乎逻辑的地方是在服务配置中以及我提供私钥的地方。但是,我找不到用于定义公钥的文档化参数。这是我尝试过的无济于事。

{
  "@class" : "org.apereo.cas.services.RegexRegisteredService",
  "serviceId" : "^http://.*",
  "name" : "Sample",
  "id" : 10,
  "properties" : {
    "@class" : "java.util.HashMap",
    "jwtAsServiceTicket" : {
      "@class" : "org.apereo.cas.services.DefaultRegisteredServiceProperty",
      "values" : [ "java.util.HashSet", [ "true" ] ]
    },
    "jwtSigningSecretAlg" : {
      "@class" : "org.apereo.cas.services.DefaultRegisteredServiceProperty",
      "values" : [ "java.util.HashSet", [ "RS256" ] ]
    },
    "jwtAsServiceTicketSigningKey" : {
      "@class" : "org.apereo.cas.services.DefaultRegisteredServiceProperty",
      "values" : [ "java.util.HashSet", [ "MyPrivateKeyGoesHere" ] ]
    },
    "jwtAsServiceTicketSigningPublicKey" : {
      "@class" : "org.apereo.cas.services.DefaultRegisteredServiceProperty",
      "values" : [ "java.util.HashSet", [ "MyPublicKeyGoesHere" ] ]
    }
  }
}

签名密钥有效,并且是记录在案的参数此外,此处记录了签名秘密算法。但是最后一个“...SigningPublicKey”参数完全是在黑暗中拍摄的,因为除了这里定义的内容之外,我没有找到任何关于此事的文档。

概括:

所以我希望通过这个问题找到的是熟悉这个端点以及如何正确配置它以使我的 SPA 可以使用签名公钥的人。

标签: jwtrsacas

解决方案


推荐阅读