繁体   English   中英

为什么自签名 PFX X509Certificate2 私钥会引发 NotSupportedException?

[英]Why does self signed PFX X509Certificate2 private key raise a NotSupportedException?

我创建了一个自签名 PFX X509Certificate2 (使用这个答案),但由于某种原因,证书的私钥抛出了 NotSupportedException ,尽管有一个真正的 HasPrivateKey 属性。

string password = "MyPassword";

ECDsa ecdsa = ECDsa.Create();
CertificateRequest certificateRequest = new CertificateRequest("cn=foobar", ecdsa, HashAlgorithmName.SHA256);
X509Certificate2 cert = certificateRequest.CreateSelfSigned(DateTimeOffset.Now, DateTimeOffset.Now.AddYears(5));

File.WriteAllBytes("e:\\mycert.pfx", cert.Export(X509ContentType.Pfx, password));

//I tried to load the with every flag without success...
X509Certificate2 loadedCert = new X509Certificate2("e:\\mycert.pfx", password);
if (loadedCert.HasPrivateKey)
{
    //loadedCert.HasPrivateKey is true but loadedCert.PrivateKey raise a NotSupportedException... 
    using (RSACryptoServiceProvider rsa = (RSACryptoServiceProvider)loadedCert.PrivateKey)
    {
        byte[] encryptedBytes = rsa.Encrypt(Encoding.UTF8.GetBytes("Hello"), false);
        byte[] decryptedBytes = rsa.Decrypt(encryptedBytes, false);
        string result = Encoding.UTF8.GetString(decryptedBytes);
    }
}

有人提到调用证书的导出可以修复私钥,但它对我不起作用。 我可能错过了一些东西,但我不知道它可能是什么。 某处是否缺少参数?

您正在创建 ECDSA 密钥对,而X509Certificate2.PrivateKey仅支持存储在传统加密服务提供商 (CSP) 中的 DSA 和 RSA 私钥。 ECDSA 始终存储在此属性不支持的密钥存储提供程序 (KSP) 中。 相反,您必须使用GetECDsaPrivateKey扩展方法: GetECDsaPrivateKey(X509Certificate2)

公钥密码学有两种类型的算法(RSA和ECC)。 问题是您正在创建一个 ECC (IE ECDsa),然后您试图将其作为 RSA 私钥。 这绝对是不正确的。 你应该在这里做的是在两边都使用一种算法。 2.如果你只想加密然后解密一段数据,为什么要使用X509Certificate2 ,使用 AES 代替。 这是为此目的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM