我正在尝试从这段代码中获取X509Certificate2对象的pkcs-7签名密钥对。
RSACryptoServiceProvider key = (RSACryptoServiceProvider)Cert.PrivateKey;
RSAParameters rsaparam = key.ExportParameters(true);
AsymmetricCipherKeyPair keypair = DotNetUtilities.GetRsaKeyPair(rsaparam);
如果使用.pfx文件创建X509Certificate2对象,则这将正常工作。
X509Certificate2 cert = new X509Certificate2(".pfx file path", "password");
它运行良好。 但是当证书从证书存储中列出时,就像这样
X509Certificate2 cert;
X509Store UserCertificateStore = new X509Store("My");
UserCertificateStore.Open(OpenFlags.ReadOnly);
var certificates = UserCertificateStore.Certificates;
foreach (var certificate in certificates)
{
if (certificate.Thumbprint==thumbprint)
{
cert=certificate;
break;
}
}
它抛出一个异常,消息为 - 密钥不适用于指定状态。
在 @Crypt32 的回答之后,尝试使用 RSA 方法签名哈希。
RSACryptoServiceProvider csp = (RSACryptoServiceProvider)cert.PrivateKey;
using (SHA256Managed sHA256 = new SHA256Managed())
{
byte[] hash = sHA256.ComputeHash(data);
return csp.SignHash(hash, CryptoConfig.MapNameToOID("SHA256"));
}
但签名不符合PKCS#7格式
RSA.SignData
方法中的任何适当重载。RSA
是一个基类,RSACryptoServiceProvider
从中派生。例如:https://msdn.microsoft.com/en-us/library/mt132675.aspx - Crypt32System.Security.Cryptography.Pkcs.CmsSigner
不支持使用 sha256 哈希值进行签名。 - Prashanth