Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход. Новые регистрации запрещены.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline AndrewKostousov  
#1 Оставлено : 17 июля 2009 г. 18:19:12(UTC)
AndrewKostousov

Статус: Участник

Группы: Участники
Зарегистрирован: 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)  | Причина: Не указана

С уважением,
Андрей Костоусов
СКБ Контур
Online Русев Андрей  
#2 Оставлено : 22 июля 2009 г. 0:56:41(UTC)
olin

Статус: Сотрудник

Группы: Администраторы, Участники
Зарегистрирован: 16.04.2008(UTC)
Сообщений: 1,503

Сказал(а) «Спасибо»: 42 раз
Поблагодарили: 609 раз в 421 постах
Если вы точно собираетесь удалять конкретный контейнер, то какая вам разница, вставлен он или нет? Удаляйте: если вставлен, то удалится тихо, если нет - появится окно и пользователь его вставит. Или вы хотите в тихо "пасти" пользователя, пока он случайно не вставит этот контейнер, и тут же его удалить? Странное поведение. Узнать "когда ключевой контейнер действительно не существует", если он находится на съёмном носителе, принципиально невозможно: контейнер можно удалить с носителя на другом компьютере, в конце концов, носитель можно просто сломать и контейнер действительно перестанет существовать...

Отредактировано пользователем 22 июля 2009 г. 0:57:27(UTC)  | Причина: Не указана

Официальная техподдержка. Официальная база знаний.
Offline AndrewKostousov  
#3 Оставлено : 22 июля 2009 г. 13:06:19(UTC)
AndrewKostousov

Статус: Участник

Группы: Участники
Зарегистрирован: 29.12.2007(UTC)
Сообщений: 22
Мужчина
Откуда: Екатеринбург

olin написал:
Если вы точно собираетесь удалять конкретный контейнер, то какая вам разница, вставлен он или нет? Удаляйте: если вставлен, то удалится тихо, если нет - появится окно и пользователь его вставит. Или вы хотите в тихо "пасти" пользователя, пока он случайно не вставит этот контейнер, и тут же его удалить? Странное поведение. Узнать "когда ключевой контейнер действительно не существует", если он находится на съёмном носителе, принципиально невозможно: контейнер можно удалить с носителя на другом компьютере, в конце концов, носитель можно просто сломать и контейнер действительно перестанет существовать...
Никакого пользователя я пасти не хочу :-)

А удалять мне нужно контейнеры, создаваемые в процессе автоматизированно функционального тестирования разрабатываемого приложения (после прогона каждого теста вызывается код очистки, который должен удалить продукты жизнедеятельности этого теста). Тестов много. Поэтому суммарный объем задержек, вызванных появлением диалоговых окон КриптоПро, получается существенным и вызывает желание как-нибудь их погасить. Вариант "Удаляйте: если вставлен, то удалится тихо, если нет - появится окно и пользователь его вставит" в моем случае не работает, поскольку тест может упасть из-за ошибки, и контейнер еще не будет создан. Вот отсюда и задача - понять есть в системе контейнер с заданным именем, или нет.

Под словами "когда ключевой контейнер действительно не существует" я подразумевал "контейнер отсутствует на всех подключенных в данный момент к системе носителях".

Отредактировано пользователем 22 июля 2009 г. 13:10:56(UTC)  | Причина: Не указана

С уважением,
Андрей Костоусов
СКБ Контур
Online Русев Андрей  
#4 Оставлено : 22 июля 2009 г. 16:05:21(UTC)
olin

Статус: Сотрудник

Группы: Администраторы, Участники
Зарегистрирован: 16.04.2008(UTC)
Сообщений: 1,503

Сказал(а) «Спасибо»: 42 раз
Поблагодарили: 609 раз в 421 постах
Тогда всё проще: тихо удаляйте все предполагаемые контейнеры, игнорируя ошибки.
Официальная техподдержка. Официальная база знаний.
Offline AndrewKostousov  
#5 Оставлено : 22 июля 2009 г. 17:32:08(UTC)
AndrewKostousov

Статус: Участник

Группы: Участники
Зарегистрирован: 29.12.2007(UTC)
Сообщений: 22
Мужчина
Откуда: Екатеринбург

olin написал:
Тогда всё проще: тихо удаляйте все предполагаемые контейнеры, игнорируя ошибки.
Просто так не получается, поскольку
AndrewKostousov написал:
Там основная загвоздка в том, что если просто вызывать функцию CryptAcquireContext с флагом CRYPT_DELETEKEYSET (без установки флага CRYPT_SILENT) для несуществующего контейнера, то КриптоПро отобразит окно выбора носителя, в котором напишет "Keyset does not exist", и будет ждать нажатия кнопки Отмена.
а если включить флаг CRYPT_SILENT, то контейнеры, созданные на съемном носителе, не удаляются - функция CryptAcquireContext вернет ошибку NTE_BAD_KEYSET_PARAM (см. мой первый пост).
С уважением,
Андрей Костоусов
СКБ Контур
Online Русев Андрей  
#6 Оставлено : 22 июля 2009 г. 21:48:38(UTC)
olin

Статус: Сотрудник

Группы: Администраторы, Участники
Зарегистрирован: 16.04.2008(UTC)
Сообщений: 1,503

Сказал(а) «Спасибо»: 42 раз
Поблагодарили: 609 раз в 421 постах
Если контейнер находится на носителе, который требует PIN для записи, то удалить его по AcquireContext(CRYPT_DELETEKEYSET | CRYPT_SILENT) нельзя. Для этого есть фирменный приём: AcquireContext(CRYPT_SILENT), SetProvParam(PP_DELETE_KEYSET).
Официальная техподдержка. Официальная база знаний.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.