如何安装.cer文件并使用私钥导出到.pfx文件

时间:2019-04-23 17:37:31

标签: c# x509certificate2

我的客户端要求安装不带私钥的.cer文件,并使用C#将其导出到具有私钥的.pfx文件中。

我尝试了提供的所有不同解决方案,这些解决方案使我可以将.cer导出到.pfx,但没有密钥,并且.pfx文件为空

string file = @"C:\TestCert1.cer";
X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadWrite);
X509Certificate2 test = new X509Certificate2(X509Certificate2.CreateFromCertFile(file));
string name = test.SerialNumber;
store.Certificates.Insert(0, test);
store.Add(test);
store.Close();

byte[] certData = store.Certificates.Export(X509ContentType.Pfx, "MyPassword");
File.WriteAllBytes(@"C:\MyCert.pfx", certData);

1 个答案:

答案 0 :(得分:0)

这部分没问题:

string file = @"C:\TestCert1.cer";
X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadWrite);

代替

X509Certificate2 test = new X509Certificate2(X509Certificate2.CreateFromCertFile(file));

您想要更简单的

X509Certificate2 test = new X509Certificate2(file);

不确定这是干什么的,您从未使用过该变量。

string name = test.SerialNumber;

此行无用。 ({store.Certificates返回一个新集合,该集合是当时商店状态的副本...您添加到该集合中,然后使其超出范围)。

store.Certificates.Insert(0, test);

这实际上是将证书添加到商店中,所以可以,除了您的目标不是必需的。

store.Add(test);

因此,现在您关闭商店,然后尝试将其导出。没有意义的是,关闭商店的Certificates属性始终返回空集合。 (应该扔了,但是那艘船早就航行了。)

store.Close();

byte[] certData = store.Certificates.Export(X509ContentType.Pfx, "MyPassword");
File.WriteAllBytes(@"C:\MyCert.pfx", certData);

您可能想要的是打开文件,然后浏览商店,看看是否有匹配项,然后导出匹配项。

using (X509Certificate2 filter = new X509Certificate2(file))
using (X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser))
{
    store.Open(OpenFlags.ReadOnly);

    // The bytes making up the certificate, in DER/binary form.
    byte[] filterRawData = filter.RawData;

    foreach (X509Certificate2 storeCert in store.Certificates)
    {
        if (storeCert.RawData.SequenceEquals(filterRawData))
        {
            File.WriteAllBytes(outputFileName, storeCert.Export(X509ContentType.Pfx, password));
            return;
        }
    }   
}

Console.WriteLine("No match found...");