签署密钥,证书和客户机密的混淆

时间:2018-06-14 17:14:43

标签: jwt openiddict

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

我已将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身份验证时是否使用了客户端密钥?这与签名证书和签名密钥一起发挥作用是什么?

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

由于

1 个答案:

答案 0 :(得分:1)

  

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实例)。

如果您希望使用对称密钥来对JWT令牌使用HMAC,请使用AddSigningKey(new SymmetricSecurityKey([bytes]))

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


  

使用JWT承载身份验证时是否使用客户端密码?以及签名证书和签名密钥如何发挥作用?

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