我试图从此代码获取pkcs-7签名的密钥对X509Certificate2对象。
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格式
这是因为BouncyCastle尝试从.NET对象获取原始密钥材料(从字面上讲是导出),而实际密钥未标记为可导出。在Windows系统中,密钥存储在控制所有密钥操作的加密服务提供程序中。当您需要执行特定的加密操作时,您要求CSP完成一项工作,而不必向您公开密钥材料。如果密钥是在CSP中作为可导出的密钥导入/生成的,则可以要求CSP导出密钥材料。如果未设置此标志,则CSP不会为您提供密钥。
我不知道BouncyCastle的工作原理,但是如果希望使用原始密钥材料,那么您的证书中需要可导出的私钥。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句