Поиск контейнера закрытого ключа функцией CryptFindCertificateKeyPro

Мы используем  MS CryptoAPI. Сертификаты в нашей системе могут распространятся отдельно от закрытых ключей, поэтому необходимо выполнять связывание сертификата и ключевого контейнера. Для этой цели мы используем функцию CryptFindCertificateKeyProvInfo
Проблема следующая. Для сертификата, закрытый ключ которого находится на токене, функция срабатывает корректно, только если токен вставлен до её вызова. Если токен не вставлен - то выдаётся диалог: "вставьте смарт-карту". После этого вставляю токен с ключом. Но токен не воспринимается (см. рис)
https://forum.rutoken.ru/uploads/transfer/0/8500/8954/thumb/p1a2i7hde31q1gfqj9sb4961j9l1.png
Если закрытый ключ в реестре - всё работает. Если в функцию передать флаг CRYPT_FIND_SILENT_KEYSET_FLAG то при вставленном токене работает, если же токен вынут - возвращает false, как и должна.
Но нужно, чтобы если носитель не вставлен, он запрашивался. Не могу понять, почему токен не принимается. Пробовал предварительно переоткрыть контекст сертификата, найдя его в хранилище - результат ещё хуже. Тот же эффект, даже если носитель был вставлен заранее. Попробовал перебирать контейнеры функцией CryptGetProvParam(provider_, PP_ENUMCONTAINERS, NULL, &size, CRYPT_NEXT) - перебираются только доступные, запроса токена не производится.

Re: Поиск контейнера закрытого ключа функцией CryptFindCertificateKeyPro

Добрый вечер,
спасибо за ваш вопрос, мы можем попробовать посмотреть, но нужны уточнения:
1) какой токен (модель) вы используете?
2) какой криптопровайдер? (Aktiv rutoken CSP 1.0) ?

Re: Поиск контейнера закрытого ключа функцией CryptFindCertificateKeyPro

Доброе утро!
1) Токен "ruToken 16 Kb",  Драйвер "Aktiv Co. IFD Handler" версии 2.26.0.0
2) Криптопровайдер Aktiv rutoken CSP 1.0. Но явного указания к MS CryptoAPI о необходимости его использования в программе нет; расчёт на то, что высокоуровневая функция CryptFindCertificateKeyProvInfo сама определит необходимый криптопровайдер для найденного контейнера. И это успешно срабатывает, если токен вставлен заранее.

Re: Поиск контейнера закрытого ключа функцией CryptFindCertificateKeyPro

Добрый день.

К сожалению, через криптопровайдер Aktiv rutoken CSP 1.0 описываемое вами поведение возможно только при подключенном токене.
Это связано с реализацией CryptoAPI v1
Однако, через Microsoft Base SmartCard Provider все будет работать так как вы хотите.
Единственная проблема, что Рутокен minidriver для Microsoft Base SmartCard Provider пока не в релизе. Я могу выслать вам тестовую версию. Это подойдет?