您如何在Spring Cloud环境中管理用于签名/验证JWT的私钥/公钥?
“问题”:
此刻,我生成一个密钥对。然后将私钥+公钥复制到我的auth-server
应用程序中。并将公共密钥复制到每个资源服务器。
当我现在想要实现“密钥轮换”时,我必须以某种方式为每个服务填充新密钥。
想法:
也许我可以使用spring-cloud-config-server
来存储和分发密钥对?
配置服务器已提供数据库登录凭据。那么,为什么不在那里存储更敏感的信息呢?
问题:
如果要这样做:您将如何使用spring-cloud-config-server
来实现密钥对分发?
您有任何安全方面的顾虑吗?
您如何解决此问题?我想有更好的解决方案。
编辑:
也许有一些解决方案可以将Spring Oauth的security.oauth2.resource.jwt.keyUri
属性用于JWK?
答案 0 :(得分:2)
首先,我将拥有一个隐藏JWT机制的网关。它将允许您从网关撤消令牌。如果用户知道他的令牌,那么您必须先取消公钥才能撤销它。看起来像这样:
使用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 调用以确定是否有任何相关的配置数据已更改 当前的应用程序。如果有新的配置数据,请刷新 活动已发布。