Короткая заметка. Когда вы экспортируете сертификат вместе с закрытым ключом, то можете заметить такую опцию:
К сожалению, метод Export() у объектов X509Certificate2 не позволяет штатно проделывать данную операцию. Это можно сделать через CAPICOM.PrivateKey.Delete(), но данная возможность отсутствует в PowerShell, в то время, как вы можете это сделать в VBS. Это связано с весьма паршивой поддержкой COM со стороны PowerShell, поэтому для реализации функционала этой галочки вам придётся проделать следующие шаги:
На языке PowerShell это выглядеть будет примерно так:
# получаем объект сертификата с закрытым ключом $cert = (dir cert:\currentuser\my)[0] # записываем пароль для PFX файла $pass = Read-Host "Password" -AsSecureString # экспортируем его в PFX формат $bytes = $cert.Export("pfx", $pass) # и записывем его в файл [System.IO.File]::WriteAllBytes('mycert.pfx', $bytes) # снова экспортируем данный объект, но уже в Cert формат $tempcert = $cert.Export("Cert") # создаём объект нашего хранилища $store = New-Object system.security.cryptography.X509Certificates.X509Store "my", "CurrentUser" # открываем его на чтение и на запись $store.Open([System.Security.Cryptography.X509Certificates.OpenFlags]::ReadWrite) # удаляем текущий сертификат с закрытым ключом из хранилища $store.Remove($cert) # записываем обратно Cert объект в хранилище, теперь уже без закрытого ключа $store.Add($tempcert) $store.Close()
Это только образец кода и его не стоит использовать прямо в таком виде, т.к. вы должны точно убедиться, что у вас PFX файл создался и он валидный. В противном случае вы останетесь совсем без закрытого ключа. И ещё раз напоминаю, при работе с хранилищем – не забывайте его закрывать после работы.
при работе с хранилищем – не забывайте его закрывать при работе с хранилищем — не забывайте его закрывать
Буду думать, что с этим можно сделать. Хотя, я тут не типографская контора :) я уже молчу про кавычки, потому что с ними у меня ад и израиль, бардак неимоверный.
Comments: