如何将 ECDSA public 密钥与其私钥配对

How to pair a ECDSA public key to it's private key

我已经使用 certreq 创建了一个 ECDSA CSR,现在我想将证书导入我的本地存储并将其与私钥配对。我可以导入 RSA public 密钥并将它们配对没问题,并且可以导入 ECDSA 证书但它们缺少私钥...

我研究了我能看到的每个 class 上的各种方法和属性 - None 似乎有一个直接的方法来 "set" 私钥它是 ECDsa - 一种有前途的方法是 "ECDsaCertificateExtensions.CopyWithPrivateKey" 方法 - 但它显示为没有定义,我宁愿不强迫人们使用它来下载其他版本的 .net 等(我正在使用Windows 10 )

certificate.PrivateKey = foundCSR.PrivateKey;

一旦我在系统中找到 CSR,就可以很好地设置 RSA 私钥。当它是 ECDsa 密钥时尝试抛出错误 "Only asymmetric keys that implement ICspAsymmetricAlgorithm are supported"

尝试将此密钥放入 RSACryptoProvider blob 是不好的,因为它不是基于 RSA 的(我假设)- GetECDsaPrivateKey 方法只能获取该密钥 - 是否有等效于 SetECDsaPrivateKey 的方法?

(我也愿意使用其他方法来获得 certreq -accept 的功能——这基本上是目标,导入证书,将其与私钥配对,删除 csr)

CopyWithPrivateKey 是唯一的 built-in 方式。它带有 .NET Framework 4.7.2,内置于 Windows 10 1803+.

为了保持较低的依赖性,主要的替代方法是 P/Invoke CertGetCertificateContextProperty (and CertSetCertificateContextProperty) 复制 CERT_KEY_PROV_INFO_PROP_ID 属性。这不如使用 CopyWithPrivateKey 安全,因为它不检查密钥是否匹配,或者目标证书是否还没有被覆盖的 属性。它也不适用于临时密钥。

第二种选择是复制method from .NET Core, and its preconditions

就我个人而言,我只是将 4.7.2 作为依赖项。