Spring Cloud Security JWT:使用配置服务器/密钥轮换分发公共密钥

时间:2018-08-21 11:11:45

标签: spring jwt spring-cloud spring-cloud-config key-pair

您如何在Spring Cloud环境中管理用于签名/验证JWT的私钥/公钥?

“问题”:

此刻,我生成一个密钥对。然后将私钥+公钥复制到我的auth-server应用程序中。并将公共密钥复制到每个资源服务器。

当我现在想要实现“密钥轮换”时,我必须以某种方式为每个服务填充新密钥。


想法:

也许我可以使用spring-cloud-config-server来存储和分发密钥对?

配置服务器已提供数据库登录凭据。那么,为什么不在那里存储更敏感的信息呢?


问题:

如果要这样做:您将如何使用spring-cloud-config-server来实现密钥对分发?

您有任何安全方面的顾虑吗?

您如何解决此问题?我想有更好的解决方案。


编辑:

也许有一些解决方案可以将Spring Oauth的security.oauth2.resource.jwt.keyUri属性用于JWK?

2 个答案:

答案 0 :(得分:2)

首先,我将拥有一个隐藏JWT机制的网关。它将允许您从网关撤消令牌。如果用户知道他的令牌,那么您必须先取消公钥才能撤销它。看起来像这样:

enter image description here

使用zuul的过滤器和会话范围的Bean即可轻松实现。

第二,您已经在评论中说过了,您可以简单地创建一个新的私钥来生成新的令牌。但是您所有的资源服务器都必须能够读取所有先前生成的令牌。因此,您需要在每个资源服务器上都有一个公共密钥列表,并且每次收到请求时,都必须尝试使用​​每个公共密钥来验证它。也许您可以有一个公共密钥ID(并将ID放在每个生成的令牌上),以避免对此任务进行愚蠢的查找。

对于密钥分发,请使用spring cloud bus,而Rabbit mq对我来说似乎是正确的。

答案 1 :(得分:1)

您应该考虑改用Spring Cloud Consul Config

  

领事提供密钥/值存储,用于存储配置和其他   元数据。 Spring Cloud Consul Config是该配置的替代方案   服务器和客户端。配置被加载到Spring环境中   在特殊的“引导”阶段。配置存储在   / config文件夹默认情况下。多个PropertySource实例是   根据应用程序名称和活动配置文件创建的   模仿了Spring Cloud Config解析属性的顺序。

您可以发布到/ refresh以更新您的密钥,或者watch for changes

  

Consul Config Watch利用consul的功能   观看键前缀。 Config Watch制作了阻塞的Consul HTTP API   调用以确定是否有任何相关的配置数据已更改   当前的应用程序。如果有新的配置数据,请刷新   活动已发布。