Эта часть в порядке:
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...");