Цитата:можно перебирать все контейнеры для данного криптопровайдера, получать публичный ключ, создавать идентификатор данного ключа и сравнивать с идентификатором из сертификата. Насколько помню идентификатор создается путем использования CryptHashPublicKeyInfo.
Я не разработчик, я тоже техподдержка :) На сколько я знаю, поиск закрытого ключа у нас отдается полностью на откуп криптопровайдеру (могу уточнить) и поведение нашего кода (в части ошибок при поиске закрытого ключа) аналогично поведению cryptcp.
Цитата:как вам удалось первоначально связать сертификат с приватным ключом не сохраняя его в хранилище сертификатов?
Вполне вероятно, все сертификаты, которым соответствуют файлики в \keys были когда то приявзаны к контейнеру.
Однако я проделал у себя следующее:
Установил сертификат с привязкой к контейнеру "А" (находится в реестре).
Скопировал "А", задав ему имя "Б" (тоже в реестр).
Установил сертификат с привязкой к контейнеру "Б" (ссылка в файле в папке my\keys осталась старая, а в папке my\certificates - обновилась).
Удалил контейнер "А".
Попробовал подписать файл с помощью cryptcp:
Код:
D:\download>cryptcp.exe -sign -f d:\cer.cer ms_windows.7.SKU.guide_ru.pdf ms_windows.7.SKU.guide_ru.pdf.sgn
CryptCP 3.16 (c) "Крипто-Про", 2002-2006.
Утилита командной строки для защиты данных.
-sign - Подписать данные и создать сообщение.
Будет использован следующий сертификат:
Субъект:Кармазин Дмитрий Иванович, 0000000000-000000000-000000000000, Karmazin D
mitry, ДПП УТП, ЗАО ПФ СКБ Контур, Екатеринбург, Свердловская, RU, email@here.ru
Действителен с 18.08.2008 07:43:00 по 18.08.2009 07:52:00
Цепочки сертификатов проверены.
Подпись данных...
Ошибка: Набор ключей не существует
(0x80090016)
Вроде ничего криминального я не делал, и такой процесс вполне рабочий - многие пользователи копируют контейнеры с дискеты в реестр.
Цитата:Вообщем на мой взгляд данные файлики keys это артефакты от более раннего связывания с приватным ключом контекста сертификата, у которого такой же идентификатор ключа субъекта, как и у того сертификата, который вы пытаетесь привязать к ключу без установки в хранилище.
В нашем случае, это один и тот же сертификат.
p.s.
Я еще развил тему: удалил соответствующий файл из \Keys - подписание работает (в той теме у меня была ошибка "Не удается найти сертификат и закрытый ключ для расшифровки.", но и версия криптопро у меня выше - 3.6.5371)
Удалил файл из \Certificates - и все равно подпись создается.
Скопировал контейнер, задав имя "В" и сразу удалил "Б". Подписалось (сертификат я не привязывал с "В").
Т.е. получается при использовании 3.6.5371, закрытый ключ находится и без предварительной привязки. Я еще повторю подобный сценарий на той машине, про которую писал в теме, на которую ссылаюсь в первом сообщении, чтобы убедиться, что там точно не работал подобный сценарий.