Статус: Новичок
Группы: Участники
Зарегистрирован: 22.11.2017(UTC) Сообщений: 8
Сказал(а) «Спасибо»: 1 раз
|
Доброго дня, уважаемые участники форума. Подскажите, каким образом можно программно удалить контейнер со смарт-карты? Язык разработки C#. Я попытался сделать так: Код:
var privateKey = new CX509PrivateKey()
{
ProviderName = "Crypto-Pro GOST R 34.10-2001 Cryptographic Service Provider",
ProviderType = (X509ProviderType)PROV_GOST_2001_DH,
Pin = pin,
ContainerName = containerName,
Existing = true
};
privateKey.Delete();
containerName указан правильный (что то типа "\\\\.\\OMNIKEY CardMan 3x21 0\\lr-31889159-65f6-4026-a5d3-a4ac094fa482"), pin код также корректный. Но при вызове privateKey.Delete() возникает окошко для ввода PIN кода (хотя я его уже указал в конструкторе CX509PrivateKey). Если ввести в этом окне PIN код (точно такой же, какой был подан в конструктор CX509PrivateKey), то контейнер успешно удаляется. Как избавится от этого окна? Способ Код:
String PROVIDER_NAME = "Crypto-Pro GOST R 34.10-2001 Cryptographic Service Provider";
uint type = 75;
IntPtr hProv = IntPtr.Zero;
if (!CryptAcquireContext(ref hProv, containerName, PROVIDER_NAME, type, CRYPT_DELETEKEYSET))
{
throw new Exception("Ошибка получения контекста криптопровайдера", new Win32Exception(Marshal.GetLastWin32Error()));
}
также не подходит - возникает окно с предложением ввести PIN код... Заранее благодарю за ответы!
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 13.09.2016(UTC) Сообщений: 126
Сказал(а) «Спасибо»: 8 раз Поблагодарили: 35 раз в 28 постах
|
|
1 пользователь поблагодарил Aleksandr G* за этот пост.
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 22.11.2017(UTC) Сообщений: 8
Сказал(а) «Спасибо»: 1 раз
|
Добавил. Теперь метод privateKey.Delete() выбрасывает исключение "Нет доступа к карте. Введен неправильный PIN-код". Хотя PIN-код указан правильный, с помощью него можно протестировать контейнер в виджете CSP, а также удалить контейнер. Т.е. если я убираю Silent, мне выдается окно для ввода PIN, я ввожу тот же самый PIN, что указан в коде, и контейнер удаляется. Единственное, что меня смущает - я подаю PIN код как строку, а в описании IX509PrivateKey сказано, что это Код:
HRESULT put_Pin(
[in] BSTR Value
);
Хотя, при создании нового ключа PIN также задается в виде строки и никаких проблем нет: Код:
var privateKey = new CX509PrivateKey()
{
ProviderType = (X509ProviderType)PROV_GOST_2001_DH,
Pin = pin,
ReaderName = readerName
};
var request = new CX509CertificateRequestPkcs10();
request.InitializeFromPrivateKey(X509CertificateEnrollmentContext.ContextUser, privateKey, String.Empty);
В чем может быть проблема?
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 22.11.2017(UTC) Сообщений: 8
Сказал(а) «Спасибо»: 1 раз
|
Всем спасибо, тема закрыта. Сделал так: Код:
public static void RemoveContainer(String containerName, String pin)
{
IntPtr hProv = IntPtr.Zero;
try
{
if (!CryptAcquireContext(ref hProv, containerName, PROVIDER_NAME, PROVIDER_TYPE, 0))
{
throw new Exception("Ошибка получения контекста криптопровайдера.", new Win32Exception(Marshal.GetLastWin32Error()));
}
if (!CryptSetProvParam(hProv, PP_KEYEXCHANGE_PIN, Encoding.ASCII.GetBytes(pin), 0))
{
throw new Exception("Ошибка ввода пин-кода.", new Win32Exception(Marshal.GetLastWin32Error()));
}
if (!CryptSetProvParam(hProv, PP_DELETE_KEYSET, null, 0))
{
throw new Exception("Ошибка удаления контейнера.", new Win32Exception(Marshal.GetLastWin32Error()));
}
}
finally
{
if (hProv != IntPtr.Zero)
{
CryptReleaseContext(hProv, 0);
}
}
}
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 26.08.2010(UTC) Сообщений: 259 Откуда: Moscow
Сказал(а) «Спасибо»: 4 раз Поблагодарили: 11 раз в 10 постах
|
Ну закрыта, так закрыта. Однако когда я споткнулся на вводе пина при подписи у меня получилось нечто следующее. Правда надо определить параметры и номер провайдера.... Код: public static void setPin(X509Certificate2 cert, string spin)
{
CryptoPro.Sharpei.Gost3410CryptoServiceProvider prov =
(CryptoPro.Sharpei.Gost3410CryptoServiceProvider)cert.PrivateKey;
//CspParameters pars = new CspParameters(75, null, "test33");
//// если необходимо запретить вывод окна и при неправильном пароле получить ошибку,
//// запрещаем окна
//pars.Flags = CspProviderFlags.NoPrompt;
System.Security.SecureString s = new System.Security.SecureString();
// заполняем пароль... например так
for (int j = 0; j < spin.Length; s.AppendChar(spin[j++]));
// и передаем его в провайдер.
prov.SetContainerPassword(s);
//если необходимо, то можно сразу и проверить пароль, например, так
byte[] dummyHash = new byte[32]; prov.SignHash(dummyHash);
}
И более при подписи надцати айтемов пин не спрашивают Отредактировано пользователем 22 февраля 2018 г. 3:11:52(UTC)
| Причина: орфография
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close