Как установить файл .cer и экспортировать в файл .pfx с закрытым ключом - PullRequest
0 голосов
/ 23 апреля 2019

У меня есть требование от моего Клиента установить файл .cer без закрытого ключа и экспортировать его в файл .pfx с закрытым ключом, используя C #

Я испробовал все предоставленные решения, которые позволили мне экспортировать.cer to .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 голосов
/ 24 апреля 2019

Эта часть в порядке:

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...");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...