【问题标题】:JWT : Multiple public keys to create a token and decode using one private keysJWT:使用多个公钥创建令牌并使用一个私钥进行解码
【发布时间】:2020-08-23 16:48:18
【问题描述】:

我有一个由多个客户端访问的 JWT 实现。从某种意义上说,多个客户端正在向我发送 JWT 令牌,并且他们正在使用我在它们之间共享的 RSA 公钥创建 JWT 令牌。我正在使用 RSA 私钥解码 JWT 令牌。

但现在由于一些安全原因,我需要向他们发送不同的公钥并获得 JWT 令牌,然后我将使用我拥有的一个私钥对其进行解码。

简而言之,我将如何生成多个公钥和单个私钥或任何类似的方法。

【问题讨论】:

  • 似乎有一些误解:1) 通常客户端不会创建 JWT。服务器(API 或身份验证服务器)可以。 2) 令牌没有用公钥签名。你总是需要私钥来签名和公钥来验证令牌。 3)解码与密钥无关。令牌可以在没有密钥的情况下进行解码,这完全是关于签名的验证。除非您在谈论加密令牌(JWE),但您没有提到这一点。目前还不清楚您真正想要实现什么以及您使用 JWT 的目的。
  • 这里客户端的意思是:访问我的应用程序的前端应用程序向我提供了一个请求数据以及一些标头,我正在获取 JWT 令牌作为标头参数。
  • 但是令牌的目的是什么?授权?如果它是授权(最常见的用例),那么它不是客户端任务。您是只签署令牌还是还发送加密的有效负载?
  • 目的是授权。因为我们有多个前端应用程序访问我的应用程序并且我期望不同的 JWT 令牌,所以我需要找到一种通用的方法来解码 JWT 并批准授权。
  • 那我只能重复一遍:API 或 Auth 服务器创建令牌,而不是客户端。客户端不需要任何密钥。服务器使用私钥签名。您需要提供一个端点,客户端可以在其中登录以获取令牌。每个客户端的令牌都不同,因为您通常在有效负载中编码不同的用户 ID/客户端 ID/受众。客户签名的令牌没有多大意义。

标签: jwt rsa public-key-encryption jwt-auth


【解决方案1】:

(...) 向他们发送不同的公钥并 (...) 使用我拥有的一个私钥对其进行解码。

据我所知,RSA 私钥 can only have one public key

但现在由于一些安全原因,我需要向他们发送不同的公钥 (...)

如果您必须向每个客户端发送不同的公钥,它们是否仍然“公开”?

如果我很了解您的问题,我建议您在您是授权的情况下切换到带有证书(如 X.509)的 PKI。 流程是:

  1. 客户端生成私钥
  2. 客户端创建 CSR
  3. 客户向您发送 CSR
  4. 您使用您的 CA 基于 CSR 生成证书
  5. 您将 CRT 寄回
  6. 客户端使用其私钥签署 JWT
  7. 客户端向您发送 JWT
  8. 您与您的 CA 核实

使用此解决方案,您将获得客户端证书身份验证的所有好处。

如果在某个时候您不再信任某个客户,您可以使用撤销列表。

顺便说一句,我从来没有见过这种流程......因为我不知道你到底想要实现什么,你应该把它读作“我如何实现 客户端证书”的答案使用 JWT 进行身份验证?”

【讨论】:

    【解决方案2】:

    他们每个人都应该有自己的私人签名密钥。他们签署了 JWT。然后他们使用您的公钥/证书加密 JWT。

    您使用您的私钥解密 jwt。然后,您使用他们的公钥/证书验证每一方的签名。

    这样 JWT 是加密的,只有你可以访问它。它已签名,因此您可以验证发件人

    【讨论】:

      猜你喜欢
      • 2017-09-13
      • 2022-08-06
      • 2019-08-27
      • 2022-11-18
      • 2018-12-14
      • 1970-01-01
      • 2021-07-21
      • 2016-06-14
      • 2020-02-03
      相关资源
      最近更新 更多