Форум КриптоПро
»
Средства криптографической защиты информации
»
Встраивание
»
Как по-тихому проверить, существует ли ключевой контейнер с заданным именем
Статус: Участник
Группы: Участники
Зарегистрирован: 29.12.2007(UTC) Сообщений: 22  Откуда: Екатеринбург
|
Вопрос по мотивам уже обсуждавшейся темы. Требуется в SILENT-режиме (без вывода на экран диалоговых окон КриптоПро) установить, доступен ли в данный момент ключевой контейнер с заданным именем. Проблема в том, что вызывая функцию CryptAcquireContext с флагом CRYPT_SILENT, я не могу по коду возврата различить ситуации, когда ключевой контейнер действительно не существует, и когда он доступен, но находится на съемном носителе (например, на дискете) и в системе зарегистрировано несколько считывателей типа Floppy device - в обоих случаях GetLastError() возвращает ошибку NTE_BAD_KEYSET_PARAM (0x8009001F). Имя контейнера задается в форме UNIQUE NAME (поскольку FQCN-имя получается слишком длинным), поэтому во втором случае КриптоПро хочет отобразить окно выбора носителя, что запрещается флагом CRYPT_SILENT, и CryptAcquireContext завершается с ошибкой. Вопрос возник в рамках решения задачи по удалению ключевого контейнера с заданным именем с минимумом интерактива с КриптоПро. Там основная загвоздка в том, что если просто вызывать функцию CryptAcquireContext с флагом CRYPT_DELETEKEYSET (без установки флага CRYPT_SILENT) для несуществующего контейнера, то КриптоПро отобразит окно выбора носителя, в котором напишет "Keyset does not exist", и будет ждать нажатия кнопки Отмена. Вариант решения, предусматривающий полный перебор имеющихся в системе контейнеров при помощи функции CryptGetProvParam с флагом PP_ENUMCONTAINERS, не нравится по соображениям быстродействия. Если в системе установлено много контейнеров особенно на съемных носителях (например, на Рутокенах), то перебор всех контейнеров происходит с очень заметной задержкой. Вроде бы, это вполне естественная задача: у меня есть все реквизиты ключевого контейнера и я хочу быстро узнать, есть ли такой контейнер в системе... Я проводил свои эксперименты на машине с Windows XP, КриптоПро 3.0.3293. Отредактировано пользователем 17 июля 2009 г. 18:28:01(UTC)
| Причина: Не указана |
С уважением, Андрей Костоусов СКБ Контур |
|
|
|
Статус: Сотрудник
Группы: Администраторы, Участники Зарегистрирован: 16.04.2008(UTC) Сообщений: 1,503
Сказал(а) «Спасибо»: 42 раз Поблагодарили: 609 раз в 421 постах
|
Если вы точно собираетесь удалять конкретный контейнер, то какая вам разница, вставлен он или нет? Удаляйте: если вставлен, то удалится тихо, если нет - появится окно и пользователь его вставит. Или вы хотите в тихо "пасти" пользователя, пока он случайно не вставит этот контейнер, и тут же его удалить? Странное поведение. Узнать "когда ключевой контейнер действительно не существует", если он находится на съёмном носителе, принципиально невозможно: контейнер можно удалить с носителя на другом компьютере, в конце концов, носитель можно просто сломать и контейнер действительно перестанет существовать... Отредактировано пользователем 22 июля 2009 г. 0:57:27(UTC)
| Причина: Не указана |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 29.12.2007(UTC) Сообщений: 22  Откуда: Екатеринбург
|
olin написал:Если вы точно собираетесь удалять конкретный контейнер, то какая вам разница, вставлен он или нет? Удаляйте: если вставлен, то удалится тихо, если нет - появится окно и пользователь его вставит. Или вы хотите в тихо "пасти" пользователя, пока он случайно не вставит этот контейнер, и тут же его удалить? Странное поведение. Узнать "когда ключевой контейнер действительно не существует", если он находится на съёмном носителе, принципиально невозможно: контейнер можно удалить с носителя на другом компьютере, в конце концов, носитель можно просто сломать и контейнер действительно перестанет существовать... Никакого пользователя я пасти не хочу :-) А удалять мне нужно контейнеры, создаваемые в процессе автоматизированно функционального тестирования разрабатываемого приложения (после прогона каждого теста вызывается код очистки, который должен удалить продукты жизнедеятельности этого теста). Тестов много. Поэтому суммарный объем задержек, вызванных появлением диалоговых окон КриптоПро, получается существенным и вызывает желание как-нибудь их погасить. Вариант "Удаляйте: если вставлен, то удалится тихо, если нет - появится окно и пользователь его вставит" в моем случае не работает, поскольку тест может упасть из-за ошибки, и контейнер еще не будет создан. Вот отсюда и задача - понять есть в системе контейнер с заданным именем, или нет. Под словами "когда ключевой контейнер действительно не существует" я подразумевал "контейнер отсутствует на всех подключенных в данный момент к системе носителях". Отредактировано пользователем 22 июля 2009 г. 13:10:56(UTC)
| Причина: Не указана |
С уважением, Андрей Костоусов СКБ Контур |
|
|
|
Статус: Сотрудник
Группы: Администраторы, Участники Зарегистрирован: 16.04.2008(UTC) Сообщений: 1,503
Сказал(а) «Спасибо»: 42 раз Поблагодарили: 609 раз в 421 постах
|
Тогда всё проще: тихо удаляйте все предполагаемые контейнеры, игнорируя ошибки. |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 29.12.2007(UTC) Сообщений: 22  Откуда: Екатеринбург
|
olin написал:Тогда всё проще: тихо удаляйте все предполагаемые контейнеры, игнорируя ошибки. Просто так не получается, поскольку AndrewKostousov написал:Там основная загвоздка в том, что если просто вызывать функцию CryptAcquireContext с флагом CRYPT_DELETEKEYSET (без установки флага CRYPT_SILENT) для несуществующего контейнера, то КриптоПро отобразит окно выбора носителя, в котором напишет "Keyset does not exist", и будет ждать нажатия кнопки Отмена. а если включить флаг CRYPT_SILENT, то контейнеры, созданные на съемном носителе, не удаляются - функция CryptAcquireContext вернет ошибку NTE_BAD_KEYSET_PARAM (см. мой первый пост). |
С уважением, Андрей Костоусов СКБ Контур |
|
|
|
Статус: Сотрудник
Группы: Администраторы, Участники Зарегистрирован: 16.04.2008(UTC) Сообщений: 1,503
Сказал(а) «Спасибо»: 42 раз Поблагодарили: 609 раз в 421 постах
|
Если контейнер находится на носителе, который требует PIN для записи, то удалить его по AcquireContext(CRYPT_DELETEKEYSET | CRYPT_SILENT) нельзя. Для этого есть фирменный приём: AcquireContext(CRYPT_SILENT), SetProvParam(PP_DELETE_KEYSET). |
|
|
|
|
Форум КриптоПро
»
Средства криптографической защиты информации
»
Встраивание
»
Как по-тихому проверить, существует ли ключевой контейнер с заданным именем
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close