问题描述
问题是在某些情况下我无法从我的 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:“不支持请求的过程”(异常消息是从另一种语言翻译的)。 为什么会发生这种情况?
附加信息:
- 从“已使用”证书中提取的 ecdsa 仍可用于创建数字签名或验证,因此它确实有效(我猜)。
- X509Certificate2 仅支持 RSA/DSA,这就是您无法访问 X509Certificate2.PrivateKey 属性的原因,但在 copyWithPrivateKey(ecdsa) 之后 X509Certificate2.HasPrivateKey 为真。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)