02.02.2006 12:09:03Не видит ключевой контейнер. Ответов: 19
dim
Сразу оговорюсь, чего намутили пользователи не признаются.
Ситуация следующая. Стоит Win2000, CSP 2.0, в CSP установлено два считывателя, дисковод и реестр. Беру дискету с ключами, копирую контейнер в реестр, произвожу установку личного сертификата, при этом указываю контейнер который находится в реестре. После пытаюсь работать, и при обращении к контейнеру CSP требует дискету. Удалил контейнер из реестра, удалил сертификат, заново произвел установку, все равно требует дискету, вставляю дискету, начинает работать. Почему не подцепляется контейнер из реестра?
 
Ответы:
02.02.2006 14:09:37Василий
Установку сертификата с привязкой к новому контейнеру следует производить кнопкой "Установить личный сертификат" в разделе Сервис панели КриптоПро CSP. Следует выбрать хранилище "Личные" и обязательно в конце согласиться с предложением заменить сертификат в хранилище.
02.02.2006 16:30:46dim
Так все и делаю. Точ в точ.
02.02.2006 17:08:48Василий
А какая программа осуществляет доступ к ключам?
Если это - банк-клиент, то, вполне возможно, она вообще не использует сертификат из хранилища Win, а обращается к контейнеру непосредственно по имени.
03.02.2006 9:56:00dim
Прога самописанная.
Подскажите в каком месте хранится информация о связи сертификата и контейнера.
03.02.2006 10:24:38Василий
Смотря где.
Вероятно, Вам интересно, не в каком виде она хранится, а как её использовать?
Если речь идёт о сертификате, установленном в хранилище сертификатов Win с привязкой к ключевому контейнеру, то, после открытия программой контекста сертификата из хранилища есть возможность получить доступ к соответствующему ключевому контейнеру:
либо функцией CryptAcquireCertificatePrivateKey, либо CertGetCertificateContextProperty с параметром CERT_KEY_PROV_HANDLE_PROP_ID
03.02.2006 14:27:33dim
Когда я пытаюсь подключится к ключевому контейнеру используя CryptAcquireCertificatePrivateKey, выдается сообщение Крипто Про CSP, о том что ключевой носитель в дисководе не верен, вставляю дискету все начинает работать.
Но когда я устанавливал сертификат "Установить личный сертификат" в Крипто Про CSP, я указывал контейнер из реестра. Контейнер перед этим скопировал, с дискеты в реестр.
06.02.2006 12:30:13Василий
При установке сертификата нужно учитывать, что для каждого аккаунта пользователя Win хранилища сертификатов свои. Если Ваша программа запускается и работает не под тем аккаунтом, под которым "устанавливали личный сертификат", то будет использована ранее заданная информация.
06.02.2006 14:01:30dim
Как удалить эту ранее заданную информацию. Профили пользователей удалены, какие были не знаю, юзера сами их создали, потом сами и удалили.
06.02.2006 15:07:07Василий
Панель управления - КриптоПро CSP - Сервис - Удалить запомненные пароли (для каждой уч. Win записи свои настройки)
07.02.2006 11:16:30dim
Спасибо за ответ. Будем пробывать в следующий раз. Эти блин юзера преустановили винду.
08.02.2006 18:19:52Алексей
Аналогичная проблема. После переноса закрытого ключа в другой контейнер CryptAcquireCertificatePrivateKey ищет приватный ключ там, где оно было первоначально инсталлировано. Кнопки - удалить пароли не помогают. Всё вышеописанное сделано.
08.02.2006 18:19:58Алексей
Аналогичная проблема. После переноса закрытого ключа в другой контейнер CryptAcquireCertificatePrivateKey ищет приватный ключ там, где оно было первоначально инсталлировано. Кнопки - удалить пароли не помогают. Всё вышеописанное сделано.
09.02.2006 11:28:53Василий
CryptAcquireCertificatePrivateKey использует информацию из сертификата, установленного в хранилище сертификатов Windows. Если хочется использовать другой контейнер - удалите это сертификат из хранилища и установите сертификат с привязкой к новому контейнеру.
09.02.2006 11:38:52Алексей
Удалил сертификат из хранилища Windows (IE -> Сервис -> Свойства обозревателя -> Содержание -> Сертификаты -> Remove)

Открыл апплет Crypto Pro CSP из Control Panel нажимаю Install Personal Certificate связываю сертификат с Registry carrier. Указываю хранилище Personal.

После этих манипуляций в хранилище сертификатов Windows сертификат появляется (со ссылкой на приватный ключ, при попытки експорт спрашивает пароль к реестру).

Из программы вызываю CryptAcquirePrivateKey вылезает окошко с выбором carrier-ов (реестра там нет). Ищет тот кариер, на который был помещен приватный ключ первоначально.
09.02.2006 13:24:03Василий
1. Программа запускается под аккаунтом залогиненного пользователя win ?
2. Контекст этого сертификата открывается программой из хранилища сертификатов? Если - да, можно привести параметры ф-и открытия хранилища и ф-и получения контекста сертификата?
09.02.2006 20:11:13Алексей
Разобрался. CryptAcquireCertificatePrivateKey не использует информацию хранилища сертификатов виндовс о том, где расположен приватный ключ (привязку сертификата к названию контейнера, которая устанавливается через Install Personal Certificate). Пришлось определять руками название контейнера и соответствующим образом формировать контекст.
10.02.2006 11:30:04Василий
> CryptAcquireCertificatePrivateKey не использует информацию хранилища сертификатов виндовс о том, где расположен приватный ключ (привязку сертификата к названию контейнера, которая устанавливается через Install Personal Certificate)

Откуда следует такой вывод? С какими параметрами вы вызываете CryptAcquireCertificatePrivateKey? (Точнее, интересует dwFlags)

В любом случае, не обязательно в программе помнить имя соответствующего сертификату контейнера. Используйте хотя бы непосредственно CertGetCertificateContextProperty с параметром CERT_KEY_PROV_HANDLE_PROP_ID
10.02.2006 12:27:55Алексей
dwFlags был и 0 и CRYPT_ACQUIRE_COMPARE_KEY_FLAG и CRYPT_ACQUIRE_USE_PROV_INFO_FLAG и CRYPT_ACQUIRE_COMPARE_KEY_FLAG + CRYPT_ACQUIRE_USE_PROV_INFO_FLAG

Что касается имени контейнера, то именно так и было сделано (через CertGetProperty).
10.02.2006 15:15:12Алексей
Был не прав. Если контекст сертификата вытащен из SystemStore, то AcquirePrivateKey замечательно работает. А вот если он импортирован в созданное хранилище, то не работает.

Спасибо.