Cryptography &引用;指定的算法无效";使用JwtSecurityTokenHandler.CreateToken签名时

Cryptography &引用;指定的算法无效";使用JwtSecurityTokenHandler.CreateToken签名时,cryptography,rsa,jwt,sha256,signing,Cryptography,Rsa,Jwt,Sha256,Signing,我已经在JWT代币上签了几年了,没有任何问题。我最近升级到Windows 10,当我尝试对JWT令牌进行签名时,我得到一个加密异常“指定的算法无效” 我正在将X509Certificate2传递到这个方法中,实际上我没有做任何其他事情 System.IdentityModel.Tokens.JwtSecurityTokenHandler.CreateToken() 签名证书以前是使用SHA-1创建的,所以我甚至使用SHA-256 RSA创建了一个新的签名证书,但仍然没有乐趣 我阅读了一些SO问

我已经在JWT代币上签了几年了,没有任何问题。我最近升级到Windows 10,当我尝试对JWT令牌进行签名时,我得到一个加密异常“指定的算法无效”

我正在将X509Certificate2传递到这个方法中,实际上我没有做任何其他事情

System.IdentityModel.Tokens.JwtSecurityTokenHandler.CreateToken()
签名证书以前是使用SHA-1创建的,所以我甚至使用SHA-256 RSA创建了一个新的签名证书,但仍然没有乐趣

我阅读了一些SO问题,这些问题建议我需要启用“Microsoft增强的RSA和AES加密提供程序”,或者至少使用它创建签名证书。很多人建议加上这句话,但还是没有运气

CryptoConfig.AddAlgorithm(typeof(RSAPKCS1SHA256SignatureDescription), "http://www.w3.org/2001/04/xmldsig-more#rsa-sha256");
我还检查了这个算法是否在注册表中,并在提供者列表和提供者类型列表中找到了它。不幸的是,我无法控制Jwt签名代码所使用的算法,因为它们都隐藏在System.Identity库中

奇怪的是,当我进入代码并查看它提到的签名时,它有一个“Microsoft Strong Cryptographic Provider”的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)

我最近不得不处理完全相同的问题

TL;博士您需要使用“Microsoft增强的RSA和AES加密提供程序”,而我怀疑您使用的是“Microsoft增强的加密提供程序v1.0”

您可以在上找到完整的解释性[自述][2]和源代码。我碰巧使用另一个库来生成JWT,即JOSE,但我认为这是偶然的


请告诉我您的进展情况。

不是重复,但似乎与此相同:是的,这是真的。我必须升级应用程序中的所有证书以使用SHA2(即SHA256),而不是使用SHA1和SHA2证书的组合。