Статус: Новичок
Группы: Участники
Зарегистрирован: 03.03.2020(UTC) Сообщений: 3  Откуда: Хабаровск
|
Здравствуйте. Импортирую pfx в silent режиме с закрытым ключом. Сертификат устанавливается и в дальнейшем при использовании не требует пароля (можно экспортировать сертификат с закрытым ключом обратно в pfx уже без пароля). Как задать (оставить тем же) пароль? Пробовал через CryptSetProvParam, но не нашел как получить HCRYPTPROV для конкретного контейнера (сертификата) код импорта: Код:
void Import()
{
X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadWrite);
var certs = Read(@"c:\temp\cert\test2.pfx", "123");
foreach(var cert in certs)
{
store.Add(cert);
}
store.Close();
}
public X509Certificate2[] Read(string filename, string password)
{
FileStream stream = new FileStream(filename, FileMode.Open);
byte[] buffer = new byte[stream.Length];
stream.Read(buffer, 0, buffer.Length);
stream.Close();
CRYPT_DATA_BLOB cryptdata = new CRYPT_DATA_BLOB();
cryptdata.cbData = buffer.Length;
cryptdata.pbData = Marshal.AllocHGlobal(cryptdata.cbData);
Marshal.Copy(buffer, 0, cryptdata.pbData, buffer.Length);
IntPtr hMemStore = PFXImportCertStore(ref cryptdata, password, PKCS12_IMPORT_SILENT);
Marshal.FreeHGlobal(cryptdata.pbData);
uint provinfosize = 0;
uint hcryptrovsize = 0;
List<X509Certificate2> certs = new List<X509Certificate2>();
IntPtr certHandle = IntPtr.Zero;
while ((certHandle = CertEnumCertificatesInStore(hMemStore, certHandle)) != IntPtr.Zero)
{
if (CertGetCertificateContextProperty(certHandle, CERT_KEY_PROV_INFO_PROP_ID, IntPtr.Zero, ref provinfosize))
{
IntPtr info = Marshal.AllocHGlobal((int)provinfosize);
if (CertGetCertificateContextProperty(certHandle, CERT_KEY_PROV_INFO_PROP_ID, info, ref provinfosize))
{
IntPtr HCRYPTPROV = IntPtr.Zero;
if (CertGetCertificateContextProperty(certHandle, CERT_HCRYPTPROV_OR_NCRYPT_KEY_HANDLE_PROP_ID, HCRYPTPROV, ref hcryptrovsize))
{
CryptSetProvParam(HCRYPTPROV, PP_SET_PIN, Encoding.ASCII.GetBytes("123"), 0); // в эту строчку не заходит
}
else
{
var err = GetLastError(); //ошибка CRYPT_E_NOT_FOUND
}
var certData = new X509Certificate2(certHandle).Export(X509ContentType.SerializedCert);
certs.Add(new X509Certificate2(certData));
}
Marshal.FreeHGlobal(info);
}
}
Marshal.FreeHGlobal(hMemStore);
return certs.ToArray();
}
так же без пароля получается после такой консольной команды: certmgr.exe -inst -pfx -pin 123 -silent -file c:\temp\cert\test.pfx Отредактировано пользователем 3 марта 2020 г. 10:10:09(UTC)
| Причина: Не указана
|
|
|
|
Статус: Сотрудник
Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC) Сообщений: 6,399  Откуда: КРИПТО-ПРО Сказал «Спасибо»: 37 раз Поблагодарили: 719 раз в 623 постах
|
|
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 03.03.2020(UTC) Сообщений: 3  Откуда: Хабаровск
|
Не сработало, все равно в хранилище сертификат без пароля Код:
void Import()
{
X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadWrite);
var certs = Read(@"c:\temp\cert\test.pfx", "123");
SecureString pass = new SecureString();
pass.AppendChar('1');
pass.AppendChar('2');
pass.AppendChar('3');
foreach (var cert in certs)
{
((Gost3410_2012_256CryptoServiceProvider)cert.PrivateKey).SetContainerPassword(pass);
store.Add(cert);
}
store.Close();
}
Отредактировано пользователем 4 марта 2020 г. 1:54:10(UTC)
| Причина: Не указана
|
|
|
|
Статус: Сотрудник
Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC) Сообщений: 6,399  Откуда: КРИПТО-ПРО Сказал «Спасибо»: 37 раз Поблагодарили: 719 раз в 623 постах
|
|
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 03.03.2020(UTC) Сообщений: 3  Откуда: Хабаровск
|
Автор: Максим Коллегин  Какая версия CSP? 4.0
|
|
|
|
Статус: Сотрудник
Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC) Сообщений: 6,399  Откуда: КРИПТО-ПРО Сказал «Спасибо»: 37 раз Поблагодарили: 719 раз в 623 постах
|
Прошу прощения, ввёл в заблуждение. Эта функция предъявляет пароль. Единственный способ установить пароль — вызывать через interop CryptSetProvParam ( PP_SET_PIN ) |
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close