用于服务到服务 API 调用的 JWT 或公私钥

信息安全 api 不对称 jwt
2021-08-24 08:24:06

我正在研究在两个应用程序服务之间设置身份验证。服务 A 将调用服务 B,我希望服务 B 只接受来自服务 A 的 (http) 调用,其他任何地方都没有。

我知道 JWT 身份验证是如何工作的并且可以实现它。如果我理解正确(我想我理解,但如果我错了请纠正我),它的工作原理是这样的:

  • 服务 A 从服务 B(或身份服务器,但我们假设点对点)请求 JWT
  • 服务 B 使用 JWT 进行响应,并使用服务 B 的密钥签名
  • 服务 A 调用服务 B 并包含 JWT
  • 服务 B 检查 JWT,并且可以知道是否确实是服务 A 发出了调用,而不会篡改 JWT

但是第一个电话真的有必要吗?我不能这样做:

  • 服务 A 使用服务 A 的私钥对每个请求进行签名
  • 服务 B 使用服务 A 的公钥解密请求
  • 服务 B 现在知道请求是否真的来自服务 A

我将在 https 上工作,不需要索赔。我只需要知道请求是否来自服务 A。因为只允许服务 A 调用服务 B,但是当它调用服务 B 时,它可以访问所有 API 端点(因此无需声明)。

使用非对称加密代替 JWT 似乎更简单,但我想知道这样做是否安全、正确和标准。

2个回答

创建 JWT 是为了处理各种情况(有区别的声明、单独的身份服务器、许多用户等)。您的情况相当简单——您只有一个客户端 (A) 需要与一台服务器 (B) 通信。

如果您愿意,您可以使用 JWT 处理这种情况,但也没有必要。这确实是矫枉过正,因为 JWT 在第一步中需要某种形式的身份验证。如果你必须设置它,为什么不一直使用它呢?您建议的私钥-公钥设置同样适用。因此,除非您期望您的要求会发生变化,否则我会选择更易于实施的那个。

与您的建议非常相似的东西实际上已经在 TLS 中实现,即客户端身份验证。在该设置中,客户端必须向服务器提供证书以进行身份​​验证。你可能想调查一下。

您有点指向它,在 Oauth 基础架构中使用 JWT 访问令牌,并使用适当的授权服务器 (AS) 是执行此操作的标准化方法。它为您提供了稍后通过​​中央服务调整访问的标准方法。它可以很好地扩展。

如果您不需要授予许多用户或其他服务访问权限,您的解决方案可能在小范围内是安全的。您需要处理密钥管理,这可能是对称密钥一样安全。

这将使它类似于 Github 的 webhook 协议:https ://developer.github.com/webhooks/

这在请求上使用 HMAC 标头。