Скопируйте сертификат из LocalComputer в CurrentUser с C # - PullRequest
0 голосов
/ 29 июня 2018

Как следует из названия, мне нужно программно скопировать сертификат (с учетом отпечатка) из хранилища LocalComputer в хранилище CurrentUser. Я копался в определениях X509Certificate2 и пробовал что-то, но, похоже, ничего не работает. Вот что у меня пока

certPath = "@"C:\%temp%\Cert.pfx";
certPass = "CertPassHere";    

X509Store localMachineStore = new X509Store(StoreName.My, StoreLocation.LocalMachine);
localMachineStore.Open(OpenFlags.ReadOnly);

X509Certificate2Collection certificate = localMachineStore.Certificates.Find(X509FindType.FindByThumbprint, "certThumbprint", true);
byte[] rawCertData = certificate[0].Export(X509ContentType.Pfx, certPass);
File.WriteAllBytes(certPath, rawCertData);
localMachineStore.Close();

X509Certificate2Collection collection = new X509Certificate2Collection();
collection.Import(certPath, certPass, X509KeyStorageFlags.PersistKeySet);
X509Store currentUserStore = new X509Store(StoreName.My, StoreLocation.CurrentUser);

foreach (X509Certificate2 cert in collection)
{
    Console.WriteLine("Subject is: '{0}'", cert.Subject);
    Console.WriteLine("Issuer is:  '{0}'", cert.Issuer);
    currentUserStore.Add(cert);
}

currentUserStore.Close();
File.Delete(certPath);

Я чувствую, что нахожусь здесь на правильном пути, но любая помощь очень ценится:)

1 Ответ

0 голосов
/ 29 июня 2018
  • Сохранять его в файл не нужно, поскольку вы можете загрузить PFX непосредственно из byte[].
  • У вас, кажется, нет вызова currentUserStore.Open(OpenFlags.ReadWrite), код завершается или выдается исключение CryptographicException?
  • Вам необходимо импортировать PFX с X509KeyStorageFlags.UserKeySet, потому что закрытый ключ «запомнит», что он был экспортирован из хранилища ключей компьютера, и он хочет вернуться туда.
  • Передача true в качестве третьего аргумента X509Certificate2Collection.Find обычно не то, что вы хотите, это в основном удобно при поиске по теме, чтобы игнорировать вещи с истекшим сроком действия.

.

string thumbprint = IAssumeYouHaveThisForReal();

X509Certificate2Collection certificates = localMachineStore.Certificates.Find(
    X509FindType.FindByThumbprint,
    thumbprint,
    false);

byte[] tempPfx = certificates[0].Export(X509ContentType.Pfx, "hi");

X509Certificate2 copyWithUserKey = new X509Certificate2(
    tempPfx,
    "hi",
    X509KeyStorageFlags.UserKeySet /*| X509KeyStorageFlags.Exportable if you like */);

X509Store currentUserMy = new X509Store(StoreName.My, StoreLocation.CurrentUser);
currentUserMy.Open(OpenFlags.ReadWrite);
currentUserStore.Add(copyWithUserKey);

certificates = currentUserStore.Certificates.Find(
    X509FindType.FindByThumbprint,
    thumbprint,
    false);

if (certificates.Count != 1)
    throw new InvalidOperationException();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...