如何使用 mscapi.RSAPrivateKey 进行 JWT 签名?

How do I use mscapi.RSAPrivateKey for JWT signing?

我不知道怎么问这个问题,但我正在尝试使用来自网络的各种 Json Web 令牌实现(无论是 java-jwt 还是 jjwt 等),它们都是在他们的签名过程中接受 RSAPrivateKey

但是我遇到的问题是,显然 mscapi.RSAPrivateKey 没有提供与 java.security.interfaces.RSAPrivateKey 相同的 API 并且当我尝试编写包装器时 class 对于它,我不知道如何编写 getEncodedgetFormat (我猜我应该 return "RS256" 或类似的东西)函数。

  1. 如何包装 mscapi.RSAPrivateKey
  2. mscapi.RSAPrivateKey 转换为 java.security.interfaces.RSAPrivateKey 的正确方法是什么?

不需要获取内容或包装私钥来签署 JWT。加密提供者,在您的例子中是 mscapi,有意隐藏内容以防止其被提取,或者因为它在物理上不可用,例如,使用智能卡。但是 mscapi 允许使用该密钥进行签名或加密,因此您的库没有理由不能使用 PrivateKey(不是 RSAPrivate 密钥)

的实例对 jwt 进行签名

您描述的问题与this类似。似乎 jjwt 试图转换 PrivateKey 而 mscapi 包装器没有实现通常的接口。

如果需要 getEncoded,我认为您不能在 mscapi 密钥上创建包装器,因为正如我所说,您无权访问密钥 material。所以我建议使用 jjwt 构建令牌 (header.payload) 并使用标准签名 api

自己签名