28.02.2006 16:32:42Проблема с использованием аппаратных криптопровайдеров Ответов: 9
Николай
Добрый день!

Суть проблемы - не ясен механизм, по которому выполяется связка между закрытым ключем и установленным в хранилище сертификатом. После формирования запроса в УЦ на выдачу нового сертификата для сгенерированной пары ключей можно увидеть как в хранилище сертификатов размещается запрос в разделе "Запросы заявок на сертификат". Далее, после выдачи сертификата в УЦ, его можно установить. При этом при просмотре сертификата будет видна надпись "Есть закрытый ключ, соответствующий этому сертификату".

Далее предположим, что апппаратный закрытый ключ будет использован на другом компьютере, также имеющему доступ к УЦ. При выполнении создания ЭЦП, средствами MS Crypto API запрашивается и устанавливается в локальное хранилище сертификат из УЦ. Если его просмотреть - то в нем не будет указано наличие связи с закрытым ключом, однако закрытый ключ находится системой и преспокойно выполняется простановка им ЭЦП (с запросами PIN кодов).

Собственно вопрос - каким образом ОС Windows определяет наличие закрытого ключа для выбранного сертификата?

В качестве аппаратного ключа используются smart card-ы.
 
Ответы:
28.02.2006 18:09:48Kirill Sobolev
По свойству контекста сертификата CERT_KEY_PROV_INFO_PROP_ID. Посмотрите функцию CertGetCertificateContextProperty
01.03.2006 13:08:23Николай
Добрый день!

Продолжаю попытки получения информации о наличии связи с закрытым ключом. Как Вы и предложили - попробовал использовать метод CertGetCertificateContextProperty с флагом CERT_KEY_PROV_INFO_PROP_ID. Получилась занятная ситуация:
1. Для сертификата, для которого есть надписи "Есть закрытый ключ, соответствующий этому сертификату" все работает отлично. Получаю CRYPT_KEY_PROV_INFO, откуда видно идентификатор закрытого ключа.

2. Теперь беру сертификат (программный для примера), для которого нет надписи "Связь с ключом существует" в просмотре сертификата. Этот сертификат был выпущен повторно в СА на один и тот же запрос. Т.е. в хранилище он стоит как сертификат без связи с ключом (хотя реально ключ существует). При попытке выполнить функцию получаю ошибку - "Объект или свойство не найдено". Но дальнейшее действие - создание ЭЦП - с таким сертификатом выполняется без проблем.

Попытки найти хоть какую-то более подробную информацию о том, как происходит поиск закрытого ключа и проверка связи с сертификатом пока никаких успехов не принесли.

Хотелось бы понять механизм работы с закрытыми ключами и сертификатами на уровне операционной системы, а не просто MS Crypto API.

Буду рад любой информации по высказанному выше...
01.03.2006 15:25:25Kirill Sobolev
Результат вполне обычный. У сертификата, установленного в хранилище либо это свойство есть, либо нету. Прописывается оно туда обычно при установке, хотя программным способом можно и впоследствии поменять.
Создание ЭЦП производится с вставленной карточкой? Если да, то вытащите ее и попробуйте еще раз.
01.03.2006 15:26:08Василий
Есть документированный способ (который всегда приводит к успеху) - установка связки с закрытым ключом в сертификате, расположенном в хранилище сертификатов Windows. Это делается либо автоматически (при установке сертификата на машине, где делался запрос на сертификат), либо с помощью дополнительных средств CSP (для КриптоПро CSP мастер "Установить личный сертификат"), либо программно.

Остальные способы недокументированные и не всегда приводят к успеху.
01.03.2006 15:40:44Николай
Еще раз добрый день!

> Это делается либо автоматически (при установке
> сертификата на машине, где делался запрос на
> сертификат), либо с помощью дополнительных средств CSP
> (для КриптоПро CSP мастер "Установить личный
> сертификат"), либо программно

Что имелось ввиду здесь под программной установкой сертификата? Использование COM объекта CEnroll? Или еще какой-то способ. Расскажите немножно поподробней пожалуйста.
01.03.2006 15:45:48Kirill Sobolev
Вот тут рассказано
http://www.cryptopro.ru/cryptopro/forum/view.asp?q=81
ответ ROmaN pre@cryptopro.ru
01.03.2006 16:13:02Николай
Спасибо - именно то что мне было нужно судя по описанию. Скажите, я правильно понял, что имея сертификат (полученный с УЦ) и закрытый ключ "на руках" я могу, используя метод, описанный ROmaN'ом, корректно выполнить установку в локальное хранилище сертификата с прописанной связью на закрытый ключ?
01.03.2006 16:14:16Kirill Sobolev
Да, абсолютно правильно.
01.03.2006 16:23:10Николай
Отлично!
Большое спасибо Кирилл.