jwt - 签名密钥、证书和客户机密混淆
问题描述
我对证书和签名密钥之间的区别有些困惑,并且有几个问题......
我已将 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?这如何与签名证书和签名密钥一起发挥作用?
我真的很想了解这些东西是如何工作的,但是在签名密钥/证书荒野中有点迷失了!
谢谢
解决方案
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
推荐阅读
- sql - 如何根据table2中的FieldX从table1中选择不在table2中的行 - 但与表2中Field2的每个不同值相关?
- node.js - 我可以从程序执行交互式命令吗?
- java - 使用 Java.util.scanner 时出现 noSuchElement 错误
- javascript - 角度:element.Scrolltop = element.scrollheight 不起作用
- algorithm - 计算给定曼哈顿距离的点对数
- css - 地图自动完成未以模态角度显示。z-index 不工作
- javascript - Javascript - 处理大型数组时的内存问题
- c++ - VS2017 跨平台 IntelliSense 不起作用
- google-cloud-platform - 如何使用 Java 提取 Google Cloud Platform VM 指标?
- reactjs - Draft-js-plugins 中的自定义内联工具栏不起作用