15.12.2006 11:41:39Список криптоконтейнеров? Ответов: 7
Александр
Как можно получить список криптоконтейнеров кот создавались пользователем? ф-циями CryptoPro
есть ли АПИ для этого (чем пользуется сам криптопро для отображения в своей вкладке в панели управления)?

можно полезть конечно в (но там еще и пароли для них с именами носителей типа SCARD , REGISTRY..)
HKLM\SOFTWARE\Crypto Pro\Settings\USERS\UserSid\KeyDevices\passwords


 
Ответы:
15.12.2006 12:03:40Василий
Странный вопрос.
Есть функции Microsoft CryptoAPI для работы с контейнерами, ключами и сертификатами любых CSP.
Они описаны в MSDN.
Для получения списка контейнеров Вам понадобятся:
CryptAcquireContext
CryptGetProvParam с параметром PP_ENUMCONTAINERS
19.12.2006 13:41:16alex
Вопрос в том что, для того чтобы сделать CryptAcquireContext( &hProv, "??", NULL,
75,//PROV_SC_GOST, 0);
нужно задать ИМЯ контейнера (второй параметр)
если задать NULL ничего перечисляться НЕ БУДЕТ (hProv будет == 0 ).
соотв что же там можно задать желательно с учетом CRYPT_SILENT (т.е. чтоб пользователю не показывать
КП интерфейс выбора где лежит контейнер;)

плюс если я не ошибаюсь КПро работает местами специфично и отличаясь от того что написано в MS CryptoAPI хелпах..

Спасибо еще раз за ответ.
19.12.2006 18:19:21Василий
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
20.12.2006 13:01:32alex
Огромное спасибо за ответ.

Еще маленький последний вопрос:
Получив имена контейнеров хочется вывести имя считывателя
для них.
можно сделать 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 то показывается КП интерфейс выбора носителя (в нем ОДИН носитель, кнопки ОК нету)
думает секунду и пропадает удачно открыв контейнер.
соотв некрасиво как-то..
хотелось бы без его показа.

Спасибо.



20.12.2006 13:58:09Василий
Полное имя контейнера с именем ридера:
нужно добавить флажок 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 будет искать их на заданном считывателе.
22.12.2006 15:07:38alex
Да, спасибо.Так и сделал.

Но при наличии нескольких считывателей (и носителей) мелькание окон все таки раздражает.

Как это делает КП в панели управления интересно? (он однозначно связывает контейнер и носитель без появления GUI)

Придумал как это сделать - получил список ридеров
(PP_ENUMREADERS) и перебором добавляю к каждому из ридеров имя контейнера из списка (PP_ENUMCONTAINERS)
Все прекрасно , но слишком долго при множестве контейнеров и ридеров..


24.12.2006 12:50:24Василий
Обычно считывателей каждого типа (например, смарткарт) немного. В большинстве случаев, вполне достаточно рекомендовать пользователю настроить один. Тогда по обычному (не-fqcn) уникальному имени контейнер можно открыть без окошка.