ECDsa ExportECPrivateKey 使用来自 X509Certificate2 的 ECDsa 抛出不受支持的异常

问题描述

问题是在某些情况下我无法从我的 ecdsa 对象中导出私钥。

鉴于:

用于签署新创建的“用户证书”的根证书。此用户证书以 .pfx 格式导出并写入硬盘驱动器。我可以在创建过程中从证书中提取 ecdsa 对象,然后提取它的私钥。如果此证书被另一个应用程序“使用”,我仍然可以从证书中提取 ecdsa,但不能从 ecdsa 中提取私钥。这是怎么回事?

简化的创建代码

using (var ecdsa = ECDsa.Create())
{
    var certrequest = new CertificateRequest(distinguishedname,ecdsa,HashAlgorithmName.SHA256);
        certrequest.CertificateExtensions.Add(new X509KeyUsageExtension(
            X509KeyUsageFlags.KeyAgreement | X509KeyUsageFlags.DataEncipherment |
            X509KeyUsageFlags.KeyEncipherment | X509KeyUsageFlags.DigitalSignature,true));

    var cert = certrequest.Create(rootCertificate,notBefore,notAfter,serialNumberBytes);

    var certWithPrivateKey = cert.copyWithPrivateKey(ecdsa);

    File.WriteallBytes(path,certWithPrivateKey.Export(X509ContentType.Pfx));
}

如果我在创建代码添加以下几行,那么我会得到一个作为字节数组的私钥,没有任何问题。

var newEcdsa = certWithPrivateKey.GetECDsaPrivateKey();
var privateKey = newEcdsa.ExportECPrivateKey();

简化消费代码

var certificateBytes = File.ReadAllBytes(path);
var certificate = new X509Certificate2(certificateBytes);
var ecdsaPK = certificate.GetECDsaPrivateKey();
var privateKeyBytes = ecdsaPK.ExportECPrivateKey();

最后一行给了我 Internal.Cryptography.CryptoThrowHelper.WindowsCryptographicException:“不支持请求的过程”(异常消息是从另一种语言翻译的)。 为什么会发生这种情况?

附加信息:

  1. 从“已使用”证书中提取的 ecdsa 仍可用于创建数字签名或验证,因此它确实有效(我猜)。
  2. X509Certificate2 仅支持 RSA/DSA,这就是您无法访问 X509Certificate2.PrivateKey 属性的原因,但在 copyWithPrivateKey(ecdsa) 之后 X509Certificate2.HasPrivateKey 为真。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)