签名密钥、证书和客户端机密混淆

Pac*_*der 5 jwt openiddict

我对证书和签名密钥之间的区别有些困惑,并有几个问题....

我已将 OpenIddict 配置为使用 JWT 承载身份验证。

1) AddDevelopmentSigningCertificate() 和 AddEphemeralSigningKey() 有什么区别?

当我使用其中一个时,我的应用程序可以工作。在开发过程中使用哪一个重要吗?

2) AddSigningCertificate() 和 AddSigningKey() 之间有什么区别,您何时使用其中之一或两者?

据我了解,签名证书用于对 JWT 令牌进行签名。但是当您使用 AddSigningKey 时 - 它也用于签署 JWT 令牌。如果您同时使用两者,这是否意味着 JWT 令牌会被签名两次 - 一个在另一个之上?还是一个覆盖另一个?

在我的场景中,我使用 AddDevelopmentCertificate() 或 AddEphemeralSigningKey() 进行开发,但对于生产,我知道我需要设置一个签名证书,理想情况下应该位于机器商店中。

但我还需要一个唯一的签名密钥,该密钥与使用 JWT 承载身份验证的 API 端点(在 .NET Framework 4.x 中)共享。

我想知道这些函数对 JWT 令牌做了什么以及它们如何相互配合。

最后一个问题:在设置 OpenIddict 表并使用客户端应用程序为数据库做种时,会填充一个客户端密钥。在示例项目中,这些始终是 GUID。

3) 使用 JWT Bearer 认证时是否使用了客户端密码?这与签名证书和签名密钥有何关系?

我真的很想了解这些东西是如何工作的,但在签名密钥/证书荒野中有点迷失了!

谢谢

Kév*_*let 8

AddDevelopmentSigningCertificate() 和 AddEphemeralSigningKey() 有什么区别?

AddDevelopmentSigningCertificate 将尝试生成自签名 X.509 证书(包含 RSA 密钥)并将其存储在用户的证书存储中,以便即使在您重新启动应用程序后也可以重新使用它。

AddEphemeralSigningKey将简单地生成一个 RSA 签名密钥,但不会将它保存在任何地方。一旦您重新启动应用程序,它就会丢失。

这两种方法的目的完全相同:创建用于保护令牌的签名密钥。


AddSigningCertificate() 和 AddSigningKey() 之间有什么区别,您何时使用其中一个或两者?

唯一的区别是AddSigningCertificate()接受一个X509Certificate2参数而AddSigningKey()接受一个SecurityKey实例。最终,AddSigningCertificate()负责从证书解析 RSA 或 ECDSA 密钥并调用AddSigningKey().


但是当您使用 AddSigningKey 时 - 它也用于签署 JWT 令牌。如果您同时使用两者,这是否意味着 JWT 令牌会被签名两次 - 一个在另一个之上?还是一个覆盖另一个?

当您注册多个非对称签名密钥时,OpenIddict 仅使用第一个来签署令牌。其他的仅由发现端点公开,因此您可以稍后决定将它们设为“主键”而不会破坏您的客户端。


我知道我需要设置一个签名证书,理想情况下应该位于机器商店中。

是的。如果您无权访问机器或用户存储(推荐选项),您也可以将其存储在嵌入式程序集文件中。


但我还需要一个唯一的签名密钥,该密钥与使用 JWT 承载身份验证的 API 端点(在 .NET Framework 4.x 中)共享。

这就是AddSigningCertificate()AddSigningKey()是。建议使用非对称签名密钥(即证书或RsaSecurityKey/EcdsaSecurityKey实例)。

如果您更喜欢使用对称密钥来 HMAC 您的 JWT 令牌,请使用AddSigningKey(new SymmetricSecurityKey([bytes])).

如果您的授权服务器颁发身份令牌,您将需要至少一个非对称密钥(证书或原始 RSA/ECDSA 密钥),但对称密钥将优先用于 JWT 访问令牌。


使用 JWT Bearer 身份验证时是否使用客户端机密?这与签名证书和签名密钥有何关系?

客户端密钥仅在与令牌或撤销端点通信时使用,而不在您使用自己的 API 端点时使用。有关更多信息,请阅读https://tools.ietf.org/html/rfc6749#section-2.3