【问题标题】:"Invalid algorithm specified" when signing with JwtSecurityTokenHandler.CreateToken使用 JwtSecurityTokenHandler.CreateToken 签名时“指定的算法无效”
【发布时间】:2015-11-18 13:13:21
【问题描述】:

几年来我一直在签署 JWT 令牌,没有任何问题。我最近升级到 Windows 10,当我尝试签署 JWT 令牌时,我收到“指定的算法无效”的 CryptographicException。

我将 X509Certificate2 传递给此方法,但实际上我没有做任何其他事情。

System.IdentityModel.Tokens.JwtSecurityTokenHandler.CreateToken()

签名证书之前是使用 SHA-1 创建的,所以我什至使用 SHA-256 RSA 创建了一个新的签名证书,但仍然没有乐趣。

我阅读了几个 SO 问题,这些问题表明我需要启用“Microsoft Enhanced RSA and AES Cryptographic Provider”或至少使用它创建我的签名证书。很多 SO Qu 建议添加这行,但仍然没有运气。

CryptoConfig.AddAlgorithm(typeof(RSAPKCS1SHA256SignatureDescription), "http://www.w3.org/2001/04/xmldsig-more#rsa-sha256");

我还检查了该算法是否在注册表中,并在 Provider 列表和 Provider 类型列表中找到了它。不幸的是,我无法控制 Jwt 签名代码使用的算法,因为它全部隐藏在 System.Identity 库中。

奇怪的是,当我进入代码并查看签名时,它提到它有一个“Microsoft 强加密提供程序”的 RSA 提供程序,而不是前面提到的“增强”提供程序,尽管从 MSDN 文档中它们似乎是差不多。

我认为它抱怨找不到用于签署实际令牌的算法,而不是用于读取或解释签名证书的算法?

利用 JwtSecurityTokenHandler 代码的有限灵活性,我还能做哪些其他检查?

完整的堆栈跟踪是:

at      System.Security.Cryptography.CryptographicException.ThrowCryptographicException(Int32 hr)
   at System.Security.Cryptography.Utils.SignValue(SafeKeyHandle hKey, Int32 keyNumber, Int32 calgKey, Int32 calgHash, Byte[] hash, Int32 cbHash, ObjectHandleOnStack retSignature)
   at System.Security.Cryptography.Utils.SignValue(SafeKeyHandle hKey, Int32 keyNumber, Int32 calgKey, Int32 calgHash, Byte[] hash)
   at System.Security.Cryptography.RSACryptoServiceProvider.SignHash(Byte[] rgbHash, Int32 calgHash)
   at System.IdentityModel.Tokens.AsymmetricSignatureProvider.Sign(Byte[] input)
   at System.IdentityModel.Tokens.JwtSecurityTokenHandler.CreateSignature(String inputString, SecurityKey key, String algorithm, SignatureProvider signatureProvider)
   at System.IdentityModel.Tokens.JwtSecurityTokenHandler.CreateToken(String issuer, String audience, ClaimsIdentity subject, Lifetime lifetime, SigningCredentials signingCredentials, SignatureProvider signatureProvider)
   at System.IdentityModel.Tokens.JwtSecurityTokenHandler.CreateToken(SecurityTokenDescriptor tokenDescriptor)

【问题讨论】:

标签: cryptography rsa jwt sha256 signing


【解决方案1】:

我最近不得不解决完全相同的问题。

TL;DR;您需要使用“Microsoft Enhanced RSA and AES Cryptographic Provider”,而不是我怀疑您使用的是“Microsoft Enhanced Cryptographic Provider v1.0”。

您可以在Karama.Jwt.Public 找到完整的解释性 [ReadME][2] 和源代码。我碰巧使用不同的库来生成我的 JWT,即 JOSE,但我认为这是偶然的。

请告诉我你的进展情况。

【讨论】:

  • 是的,这是真的。我必须升级我的应用程序中的所有证书以使用 SHA2(即 SHA256),而不是使用 SHA1 和 SHA2 证书的组合。
猜你喜欢
  • 2019-05-29
  • 2021-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-10
  • 2017-05-19
  • 1970-01-01
  • 2012-03-11
相关资源
最近更新 更多