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

时间:2019-05-18 21:25:15

标签: c# x509certificate2

我正在创建一个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的功能也很好)

1 个答案:

答案 0 :(得分:0)

certreq -accept的流为:

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

所有这些都可以在C#中解决。对于“相同的公共密钥”,最简单的方法是比较newCert.PublicKey和requestCert.PublicKey的Oid,EncodedKeyValue和EncodedParameters属性。