具有多个私钥/公钥对的 JWT

Posted

技术标签:

【中文标题】具有多个私钥/公钥对的 JWT【英文标题】:JWT with multiple private/public keys pairs 【发布时间】:2018-12-14 19:47:03 【问题描述】:

我正在实现类似于:https://login.microsoftonline.com/common/discovery/v2.0/keys

生成和验证 JWT 令牌的 Spring Boot JWT 应用程序。 我将生成许多公钥/私钥(我不想用一个密钥生成所有令牌。一对密钥将生成寿命较短的令牌,第二对将生成更长的......) 我将使用公钥创建端点 /keys。问题是:如何在我的应用程序中将正确的公钥与私钥连接起来进行验证?

第二个:如何生成像上面这样的密钥(使用像 kty":"RSA","use":"sig", child...这样的字段)有什么模式可以做到吗?

【问题讨论】:

【参考方案1】:

如何生成像上面这样的键(带有 "kty": "RSA""use": "sig""kid"...等字段)有什么模式可以做到吗?

这是一个称为 JSON Web Key (JWK) 的标准,在 RFC 7517 中定义,它定义了一个表示 JSON 中的加密密钥的数据结构。

在 Java 中,您可以使用 Nimbus JOSE + JWT,它支持带有 RSA 密钥的 JWK。


如何在我的应用程序中连接正确的公钥和私钥来验证它?

您可以在您的令牌中使用kid 标头声明:这是一个可选的标头声明,其中包含一个密钥标识符,当您有多个密钥来签署令牌并且您需要查找正确的密钥以进行验证时特别有用签名。

一旦签名的 JWT 是 JWS,请考虑来自 RFC 7515 的定义:

4.1.4. "kid" (Key ID) Header Parameter

kid (key ID) Header Parameter 是指示哪个键的提示 用于保护 JWS。此参数允许发起人 明确地向接收者发出密钥更改的信号。的结构 kid 值未指定。它的值必须区分大小写 细绳。此标头参数的使用是可选的。

与 JWK 一起使用时,kid 值用于匹配 JWK kid 参数值。

【讨论】:

感谢您非常准确的回复!将密钥存储在服务器上的最佳做法是什么?我不必将它放在远程存储库中 谢谢,现在我知道如何安全地存储文件了。但我不确定如何准确存储密钥。我的想法-> 生成(通过 keygen、openssl 或类似的东西)一些密钥对。所以我将有一些条目的文件:1.条目类型:PrivateKeyEntry,证书链长度:3.证书 [1]:所有者:所有者, Issuer: issuer.. etc. 那么如何存储呢?编码为base64并存储在txt文件中? @michf 这超出了原始问题的范围。请提出一个新问题。

以上是关于具有多个私钥/公钥对的 JWT的主要内容,如果未能解决你的问题,请参考以下文章

JWT:带有公钥/私钥的 jwtk/jjwt

SSH详解-4.多个ssh公钥

JWT 私钥/公钥混淆

什么是公钥和私钥?

如果有人得到我的私钥和公钥,JWT 会发生啥?

使用 vertx 在 JWT 公钥/私钥身份验证中握手