| ||||
| ||||
Как можно получить список криптоконтейнеров кот создавались пользователем? ф-циями CryptoPro есть ли АПИ для этого (чем пользуется сам криптопро для отображения в своей вкладке в панели управления)? можно полезть конечно в (но там еще и пароли для них с именами носителей типа SCARD , REGISTRY..) HKLM\SOFTWARE\Crypto Pro\Settings\USERS\UserSid\KeyDevices\passwords | ||||
Ответы: | ||||
| ||||
Странный вопрос. Есть функции Microsoft CryptoAPI для работы с контейнерами, ключами и сертификатами любых CSP. Они описаны в MSDN. Для получения списка контейнеров Вам понадобятся: CryptAcquireContext CryptGetProvParam с параметром PP_ENUMCONTAINERS | ||||
| ||||
Вопрос в том что, для того чтобы сделать CryptAcquireContext( &hProv, "??", NULL, 75,//PROV_SC_GOST, 0); нужно задать ИМЯ контейнера (второй параметр) если задать NULL ничего перечисляться НЕ БУДЕТ (hProv будет == 0 ). соотв что же там можно задать желательно с учетом CRYPT_SILENT (т.е. чтоб пользователю не показывать КП интерфейс выбора где лежит контейнер;) плюс если я не ошибаюсь КПро работает местами специфично и отличаясь от того что написано в MS CryptoAPI хелпах.. Спасибо еще раз за ответ. | ||||
| ||||
CryptAcquireContext( &hProv, NULL, NULL, 75, CRYPT_VERIFYCONTEXT); Хелп на наш CSP доступен на дистрибутивном диске и на нашем сайте. Для CSP 2.0: http://www.cryptopro.ru/CryptoPro/products/csp/20/csp-2-0.chm для 3.0: http://www.cryptopro.ru/CryptoPro/products/csp/30/CSP-3-0.chm | ||||
| ||||
Огромное спасибо за ответ. Еще маленький последний вопрос: Получив имена контейнеров хочется вывести имя считывателя для них. можно сделать CryptAcquireContext(..) + CryptGetProvParam(..,PP_UNIQUE_CONTAINER,..) и получить полное имя контейнера но хотелось показать имя контейнера + имя считывателя для него (как в панели управления КП) CryptGetProvParam(..,PP_ENUMREADERS,..) не получается сделать для конкретного имени контейнера (полученного с помощью PP_ENUMCONTAINERS) а также проблема: делаю re=CryptAcquireContext( &hProvT, ContainerName, NULL, 75, CRYPT_SILENT); re=CryptGetProvParam( hProvT, PP_UNIQUE_CONTAINER , Name,&NameSize,0); получаю (если контейнер на смарткарте): NTE_BAD_KEYSET_PARAM(Ошибка так же может возникнуть при открытии с флагом CRYPT_SILENT и неоднозначности в выборе носителя.) если убрать CRYPT_SILENT то показывается КП интерфейс выбора носителя (в нем ОДИН носитель, кнопки ОК нету) думает секунду и пропадает удачно открыв контейнер. соотв некрасиво как-то.. хотелось бы без его показа. Спасибо. | ||||
| ||||
Полное имя контейнера с именем ридера: нужно добавить флажок CRYPT_FQCN при получении имени контейнера (FQCN - Full Qualified Container Name). Например, пусть контейнер на етокене имеет имя cont1. Уникальное имя этого контейнера: SCARD\ETOKEN_R2_0003b4e2\CC00\ABC5 fqcn-имя этого же контейнера будет: \\.\AKS ifdh 0\cont1. fqcn уникальное имя будет: \\.\AKS ifdh 0\SCARD\ETOKEN_R2_0003b4e2\CC00\ABC5 По поводу Silent. Если в панели CSP считыватель настроен реально один, то окошка не будет. Если считывателей несколько, то есть два пути - использовать fqcn-имя контейнера либо настроить считыватель по умолчанию для выбранного CSP. Последнее не рекомендуется, т.к. всегда, для всех контейнеров, CSP будет искать их на заданном считывателе. | ||||
| ||||
Да, спасибо.Так и сделал. Но при наличии нескольких считывателей (и носителей) мелькание окон все таки раздражает. Как это делает КП в панели управления интересно? (он однозначно связывает контейнер и носитель без появления GUI) Придумал как это сделать - получил список ридеров (PP_ENUMREADERS) и перебором добавляю к каждому из ридеров имя контейнера из списка (PP_ENUMCONTAINERS) Все прекрасно , но слишком долго при множестве контейнеров и ридеров.. | ||||
| ||||
Обычно считывателей каждого типа (например, смарткарт) немного. В большинстве случаев, вполне достаточно рекомендовать пользователю настроить один. Тогда по обычному (не-fqcn) уникальному имени контейнер можно открыть без окошка. | ||||