10.05.2007 15:47:08Копирование ключевого контейнера с одного носителя на другой. В дальнейшем требует носитель-"оригинал" Ответов: 12
Кирилл
Возникла следующая проблема - был выдан сертификат и закрытый ключ был записан на дискету. Впоследствии, последний был скопирован на ru-token. Почему-то теперь при вызове CryptAcquireCertificatePrivateKey(..., CRYPT_ACQUIRE_CACHE_FLAG,...) выпадает окно со списком носителей, где в качестве ключевого ожидается только дискета, про ru-token нет ни одного упоминания. Каким образом решить данную проблему? Причем, в некоторых случаях вроде как контейнер находится...
 
Ответы:
10.05.2007 16:04:25Kirill Sobolev
Надо переустановить сертификат, привязав его именно к контейнеру на рутокене.
10.05.2007 16:35:38Кирилл
Спасибо.
А в дальнейшем будет возможность в CryptoPro CSP работать с несколькими контейнерами?
10.05.2007 17:54:34Kirill Sobolev
Работой со связкой сертификат-контейнер занимается не КриптоПро CSP, а Windows. Соответственно, это вопрос к MS.
11.05.2007 11:41:31Кирилл
Была произведена операция - сертификат был удален из хранилища "Личные". Потом через панель управления КриптоПро Сервис-Просмотреть сертификаты в контейнере был выбран контейнер с сертификатом на ruToken, установлен. Но в дальнейшем произошла опять такая же ошибка - требовался контейнер с дискеты. Что можно сделать еще?
11.05.2007 12:03:37Kirill Sobolev
Устанавливали тоже через контрольную панель КриптоПро CSP - Сервис - Установить личный сертификат?
11.05.2007 12:25:57Кирилл
И так тоже пробовал. Удалил сертификат, предварительно его экспортировав в файл. Потом сделал установку личного сертификата, связав этот файл с новым контейнером. Причем, контейнер, находящийся на дискете, тоже удалил через панель КриптоПро.
11.05.2007 13:40:13Kirill Sobolev
Значит проблема в старой ссылке - она попала в кэш CryptoAPI. CryptAcquireCertificatePrivateKey этим грешит.
Удалите из \Documents and Settings\<имя пользователя>\Application Data\Microsoft\SystemCertificates\My\Keys\ файл, в котором эта ссылка содержится, либо вызывайте CryptAcquireContext через CRYPT_KEY_PROV_INFO.
11.05.2007 13:49:46Кирилл
Что интересно, если получать контекст сертификата через возможности Capicom, через его графический интерфейс (IStorePtr), то функция CryptAcquireCertificatePrivateKey отрабатывает нормально со ссылкой на рутокен. Если же получать контекст через CertCreateCertificateContext, т.е. по наборам байт, то происходит вышеописанная ситуация.
11.05.2007 15:41:30Кирилл
А каким образом можно определить, какая ссылка старая? Сделать так получилось методом тыка.
Так же заметил, что не используя возможности капиком, последующий вызов CryptAcquireCertificatePrivateKey не использует кэш связей (после переименовывания папки с ключами она задумалась, но связь в итоге нашла автоматически). В случае с получением контекста сертификата из набора байт - CryptAcquireCertificatePrivateKey давала отлуп сразу.
11.05.2007 16:03:54Кирилл
И еще.
CertEnumCertificateContextProperties возращает, что у сертификата нет никаких свойств! Соответственно, CRYPT_KEY_PROV_INFO не получить. В то время как, вернувшись к выбору сертификата через Capicom, все находится. Почему так? Где теряются все ссылки и свойства?
14.05.2007 10:01:38Kirill Sobolev
Когда Вы создаете сертификат через CertCreateCertificateContext, то он не привязан ни к какому хранилищу и ссылки на секретный ключ у него нет.
CryptAcquireCertificatePrivateKey находит закешированную ссылку, которая была прописана при установке. CAPICOM же выбирает сертификат из хранилища, а там есть актуальная ссылка.
14.05.2007 10:41:56Кирилл
Спасибо большое, это дает ответы на все.