首页 > 解决方案 > 签名密钥、证书和客户机密混淆

问题描述

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

我已将 OpenIddict 配置为使用 JWT 不记名身份验证。

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

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

2) AddSigningCertificate() 和 AddSigningKey() 有什么区别,你什么时候使用一个或另一个或两者?

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

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

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

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

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

3)使用JWT Bearer认证时是否使用了client secret?这如何与签名证书和签名密钥一起发挥作用?

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

谢谢

标签: jwtopeniddict

解决方案


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://www.rfc-editor.org/rfc/rfc6749#section-2.3


推荐阅读