我的客户端要求安装不带私钥的.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);
答案 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...");