有没有办法使用 C# 获得命令行 certreq -accept 的功能?

Is there a way to get the functionality of command line certreq -accept using C#?

我正在创建一个将证书导入本地存储的 windows 表单应用程序 - 我希望能够做的是尽可能将其与现有私钥配对。

我知道这是可能的,因为我可以在证书上手动使用 certreq -accept 命令,它可以很好地配对。

X509Certificate2 certificate = new X509Certificate2(fileName);
X509Store certStore = new X509Store(StoreName.My, StoreLocation.LocalMachine);
certStore.Open(OpenFlags.ReadWrite);
certStore.Add(certificate);
certStore.Close();

代码运行良好 - 只是没有将它与相应的私钥匹配,我知道它存在是因为命令行 certreq -accept 导入它并且匹配得很好。如果有人知道如何使用代码(而不是代码中的 运行 命令行)匹配该功能,我将不胜感激。

(旁注 - 获得 certutil -repairstore 的功能也很棒)

certreq -accept的流量是:

  • 打开请求存储(例如new X509Store("Request", StoreLocation.LocalMachine)
  • 找到与签名证书使用相同 public 密钥的 self-signed 证书(该证书由 certreq 创建)
  • 将私钥复制到新证书(例如var withKey = newCert.CopyWithPrivateKey(requestCert.GetRSAPrivateKey());
  • withKey 证书添加到我的商店(CurrentUser 或 LocalMachine,以匹配密钥和 self-signed 证书的位置为准)
  • 从请求存储中删除 requestCert

所有这些都可以在 C# 中解决。对于 "same public key",最简单的方法是比较 newCert.PublicKey 和 requestCert.PublicKey 的 Oid、EncodedKeyValue 和 EncodedParameters 属性。