答案 0 :(得分:1)
而不是
RSACryptoServiceProvider csp = (RSACryptoServiceProvider)cert.PrivateKey;
return csp.SignHash(hash, CryptoConfig.MapNameToOid("SHA256"));
使用
using (RSA privateKey = cert.GetRSAPrivateKey())
{
return privateKey.SignHash(hash, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);
}
(需要.NET 4.6 +)
问题是您的RSACryptoServiceProvider
对象正在使用CAPI PROV_RSA_FULL
提供程序,该提供程序早于SHA-2。 SHA-2签名(来自软件提供商)要求密钥位于PROV_RSA_AES
,这一事实主要由密钥创建/ PFX导入控制。
您可以使用重新绑定提供程序类型的方法仍然使用soft-deprecated RSACryptoServiceProvider
,但特别是在像这样的代码中(对象不会离开方法),您应该切换到使用cert.GetRSAPrivateKey()
并避免将返回的RSA
对象强制转换为算法基类。