26.11.2006 9:12:53Подписывание и контекст сертификата. Ответов: 4
dosar
Ситуация такая: хочется подписать данные сертификатом из файла. Файл сертификата получен обычным копированием в файл из сертификата. При подписывании выскакивает окошко с просьбой вставить дискету, поскольку контейнер не найден. При чем такое поведение наблюдается только на некоторых машинах. Определить какой должна быть машина, чтобы эта ошибка повторялась не удалось. Решили эту проблему следующим образом: создаем контекст из сертификата, затем при подписывании берем еще один контекст сертификата с таким же серийным номером уже из хранилища и им подписываем. Решение не очень красивое и потенциально ошибочное. Поэтому хочется понять, почему не всегда срабатывает привязывание сертификата, к его закрытому ключу?
 
Ответы:
26.11.2006 18:53:09Василий
Решение ошибочное с самого начала. Файл сертификата НЕ содержит ссылки на контейнер секретного ключа, а для подписи секретный ключ нужен.
27.11.2006 8:58:09Андрей
Да. О том и речь. Но насколько я понимаю CryptoPro как-то должен или может по сертификату попытаться найти закрытый ключ. Что, кстати он вроде как и делает. Штука для мониторинга реестра показывает, что есть обращения к разделу реестра где указаны закрытые ключи для сертификатов. Но он лезет в разделы не для того Windows user'а и к ним естественно нет доступа. После чего он, видимо, думает, что в реестре нет соответствующего ключа и просит дискету. То есть еще раз - иногда он лезет в ключи нужного user'а, а иногда в ключи не того user'а. Эту гипотезу подтверждает, то что у нас валится только подписывание, расшифровывание/зашифрование - нет(контекст сертификата создается так же как и в случае с подписыванием). Почему? Потому что там явно указывается в ключах какого user'а надо искать. Есть ощущение, что это вообще бага или CryptoPro или Windows. Но ведь, должен же быть способ пошаманить и получить то, что нужно. Может кто-нибудь уже придумал такой способ?
27.11.2006 10:36:22Василий
Могу ещё раз повторить - НЕЛЬЗЯ при подписи указывать сертификат из файла.
Личный сертификат, который используется для подписи, устанавливается конкретным пользователем Win в хранилище сертификатов "Личные" с привязкой к ключевому контейнеру секретного ключа. Для создания подписи следует запускать процесс под тем же пользователем Win, открывать хранилище "Личные" и использовать сертификат оттуда.

Тот факт, что может сработать при чтении сертификата из файла - это недокументированная особенность реализации MS CryptoAPI (это возможно, если сертификат установлен в "Личные" с привязкой к ключу или был установлен туда ранее). Но полагаться на это не следует.

Если так уж не хочется использовать хранилище сертификатов, то Вы самостоятельно должны следить за соответствием сертификата и контейнера (при использовании более низкоуровневых функций CryptoAPI).
30.11.2006 10:08:54Андрей
спасибо.