各种微服务中 JWT 的共享签名密钥

Posted

技术标签:

【中文标题】各种微服务中 JWT 的共享签名密钥【英文标题】:Shared signature key for JWT in various Microservices 【发布时间】:2017-09-19 10:18:33 【问题描述】:

我有各种微服务。我已经使用 JWT 实现了安全性。每个服务都通过所有服务共享的密钥来验证 JWT 令牌。

是否可以在所有微服务之间为 JWT 共享相同的签名密钥?

我无法在 API 网关上实现这一点,因为我必须使用某些库,这些库需要在每个微服务中触发 Spring Security。

【问题讨论】:

使密钥无效时会发生什么? @ConstantinGALBENU 我正在使用配置服务。如果我使密钥无效,我会在配置中更新 git 上的新密钥。所有其他服务都会获得最新的密钥以继续该过程。 你是否使用了spring-security-oauth,如果是,那么你可以使用auth server暴露的/oauth/token_key端点 我正在使用 Spring Security,但我没有使用 OAuth。我必须使用 JWT。 【参考方案1】:

是的,您需要共享密钥才能让 JWT 安全/正确地运行。

我建议使用公私钥签名方法并按值传递 JWT。这意味着您将获得一个只有您的网关需要知道的私有签名密钥和一个公共验证密钥。

然后,您可以将验证密钥分发给您的所有微服务。这可以是您通过部署执行的操作,或者您的微服务可以使用某种刷新周期并将您的签名密钥与网关一起发布。前者更安全,后者更擅长自愈。

这可能有用:JWK。

【讨论】:

感谢您的信息。我对几点感到困惑。我有一个 UserService(只有一个生成令牌的服务),它负责为登录请求创建 JWT 令牌以及处理刷新令牌场景。我只需要验证所有其他微服务中的签名令牌。我不确定如何适应其中的公私密钥概念。如果您有任何参考,请分享。 我使用 JWK 生成公钥和私钥。你能告诉我如何使用这些密钥来签署 JWT 吗? JWT 库期望“密钥”作为参数。 JwtBuilder signWith(SignatureAlgorithm alg, Key key) 注意:我使用的是 jjwt 库。 @NitishBhardwaj 不太清楚如何使用您的特定库,但通过快速搜索,这可能会提供一些线索:github.com/jwtk/jjwt/issues/131 感谢@LukeMcGegor。

以上是关于各种微服务中 JWT 的共享签名密钥的主要内容,如果未能解决你的问题,请参考以下文章

验证微服务架构的每个服务中的访问令牌(JWT)

JWT 是不是共享/存储用于在客户端和服务器上签名的密钥?

使用 jwt 在微服务中进行身份验证

验证 API 密钥和 JWT 令牌是微服务的责任吗?

JWT 注销:在微服务架构中的服务之间共享被列入黑名单的无效令牌

APIGateway