关于RSA+SHA256签名出现Invalid algorithm specified的Exception

同事在用包含私钥的RSA+SHA256证书做签名测试的时候出现Invalid algorithm specified的Exception,如果把签名的SHA256换成SHA1则没有问题,让我帮忙测试看看。我把解决的过程记录如下。

同事大概的代码如下:

X509Certificate2 cert = new X509Certificate2("xxx.pfx", "password");
RSACryptoServiceProvider csp = (RSACryptoServiceProvider)cert.PrivateKey;
byte[] signature = csp.SignData(data, CryptoConfig.MapNameToOID("SHA256");

代码直接读取一个证书文件,然后通过私钥做签名,然后签名的时候最后一句代码就抛上面的exception。

我通过调试发现,问题出在上面第二句代码上,如果把私钥导出成XML,然后通过XML实例化RSA对象再做签名则是正确的。

X509Certificate2 cert = new X509Certificate2("xxx.pfx", "password", X509KeyStorageFlags.Exportable); //加参数设置成可导出
using (RSACryptoServiceProvider csp = new RSACryptoServiceProvider())
{
    csp.FromXmlString(cert.PrivateKey.ToXmlString(true));
    byte[] signature = csp.SignData(data, CryptoConfig.MapNameToOID("SHA256");
}

这里有个读取证书导出成XML的过程,实际使用过程中,建议保存预先导出的XML到一个文本文件,程序使用时直接读取这个XML文件。

还发现另外一种写法也可以,就是导出私钥的参数,然后RSA对象导入该参数。

代码如下:

X509Certificate2 cert = new X509Certificate2("xxx.pfx", "password", X509KeyStorageFlags.Exportable);
using (RSACryptoServiceProvider csp = new RSACryptoServiceProvider())
{
    csp.ImportParameters(((RSACryptoServiceProvider)cert.PrivateKey).ExportParameters(true));
    byte[] signature = csp.SignData(data, CryptoConfig.MapNameToOID("SHA256");
}

 

原创文章,转载请注明: 转载自闲云博客

本文链接地址: 关于RSA+SHA256签名出现Invalid algorithm specified的Exception

发表评论

电子邮件地址不会被公开。 必填项已用*标注