我对证书和签名密钥之间的区别有些困惑,并有几个问题....
我已将 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 认证时是否使用了客户端密码?这与签名证书和签名密钥有何关系?
我真的很想了解这些东西是如何工作的,但在签名密钥/证书荒野中有点迷失了!
谢谢
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
归档时间: |
|
查看次数: |
1854 次 |
最近记录: |