无法从.net x509certificate2对象获取私钥到bouncycastle AsymmetricCipherKeyPair

普拉山斯

我试图从此代码获取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格式

地穴32

这是因为BouncyCastle尝试从.NET对象获取原始密钥材料(从字面上讲是导出),而实际密钥未标记为可导出。在Windows系统中,密钥存储在控制所有密钥操作的加密服务提供程序中。当您需要执行特定的加密操作时,您要求CSP完成一项工作,而不必向您公开密钥材料。如果密钥是在CSP中作为可导出的密钥导入/生成的,则可以要求CSP导出密钥材料。如果未设置此标志,则CSP不会为您提供密钥。

我不知道BouncyCastle的工作原理,但是如果希望使用原始密钥材料,那么您的证书中需要可导出的私钥。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

检索X509Certificate2对象的颁发者

无法在Azure中访问我的X509Certificate2的私钥

无法在客户端新的X509Certificate2()上解码证书

.NET Framework x509Certificate2类,HasPrivateKey == true && PrivateKey == null?

如何在保留私钥的同时将BouncyCastle X509Certificate转换为.NET Standard X509Certificate2?

从X509Certificate2删除私钥

.NET Core ChannelFactory-将X509Certificate2设置为客户端证书

从.NET Core中的PEM文件创建X509Certificate2

X509Certificate2在Linux上无法解析,但在Windows上可以使用

从x509certificate2对象以pem格式导出公钥

.NET Core X509Certificate2的用法(在Windows / IIS,Docker,Linux下)

将X509Certificate2证书与.NET中的私钥相关联

使用.NET Standard 2.0生成自签名X509Certificate2

设置X509Certificate2私钥时出错

.NET Core 3无法加载ECC私钥

X509Certificate2无法在ASP网页中正确加载

如何在.NET Standard 2.0 / Core 2.1中使用PrivateKey创建X509Certificate2?

无法将JSON对象发布到asp.net webapi

无法将密钥文件添加到X509Certificate2

.Net SerialPort对象将无法通信

json.net-无法解析嵌套对象

无法从textarea asp.net获取文本

无法使用Lucene.net获取搜索到的文档

Asp.net无法获取更新的Cookie

X509Certificate2 在 .NET Core 应用程序中的 widows 和 linux 不同

.net core EF FirstOrDefaultAsync 无法获取数据

BouncyCastle PrivateKey To X509Certificate2 PrivateKey (ECC)

在 .Net 5 中导出 X509Certificate2 时“密钥在指定状态下无效”

x509certificate2 到 NET FR 中的 PEM。4.7.2