使用JwtSecurityTokenHandler.CreateToken

时间:2015-11-18 13:13:22

标签: cryptography rsa jwt sha256 signing

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

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

System.IdentityModel.Tokens.JwtSecurityTokenHandler.CreateToken()

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

我读了几个SO问题,建议我需要启用“Microsoft增强型RSA和AES加密提供程序”或至少使用它创建我的签名证书。许多SO Qu建议添加这条线,但仍然没有运气。

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

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

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

1 个答案:

答案 0 :(得分:1)

我最近不得不解决同样的问题。

TL; DR;您需要使用“Microsoft增强型RSA和AES加密提供程序”,而不是我怀疑您使用的是“Microsoft Enhanced Cryptographic Provider v1.0”。

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

请告诉我你是怎么过的。