13.04.2006 18:32:13В подписи PKCS#7 с сертификатом закрытый ключ сертификата, наверное, отсутствует? Ответов: 6
ppvlad
Здравствуйте, уважаемые. Пишу интеграцию с цифровой подписью для приложения электронного документооборота на Delphi. Всё прекрасно работает, за что огромное спасибо за ваши ответы, почерпнул очень многое.

Разрешите глупый вопрос: - при формировании цифровой подписи PKCS7 совмещённой с сертификатом, я правильно понимаю, что закрытый ключ сертификата в подпись не помещается?

А то что-то сомнения какие-то меня гложат...
Приватного ключа ведь в такой подписи точно нет?

Извините, если глупость спросил.
 
Ответы:
13.04.2006 19:05:49ppvlad
Вроде разобрался, извините...

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

Потом проверил на другом компьютере - всё нормально - подпись проверяется и выделенный из неё сертификат уже диагностируется как не содержащий закрытый ключ.

Может быть удаление сертификата (из IE) не удаляет связанный с ним контейнер ключей?
14.04.2006 9:07:11Kirill Sobolev
Точно не удаляет
14.04.2006 11:10:02ppvlad
ну в общем это не так принципиально, просто неаккуратненько как-то выглядит...

я определяю наличие приватного ключа у сертификата по критерию:
if CryptAcquireCertificatePrivateKey(hCert, 0, nil, phProv, dwKeySpec, pfCallerFreeProv) then {ключь есть}

то есть если ключ эквейрится значит он есть...
може надо иначе проверять?
14.04.2006 12:55:59Kirill Sobolev
Система такая: у сертификата, установленного в хранилище, может быть (а может и не быть) ссылка на контейнер секретного ключа. Если ссылки нет, то ключа тоже нет. Но вот если ссылка есть, не факт что по ней обнаружится контейнер. Поэтому, без открытия контейнера CryptAcquireContext (что и делает CryptAcquireCertificatePrivateKey) не обойтись, если точно узнать надо наличие.
14.04.2006 15:23:32ppvlad
так вот меня это и смутило. то есть я сертификат из хранилища удалил, запускаю проверку подписи, она получает контекст сертификата подписчика, я на него натравливаю свой враппер, одним из действий которого выполнение ...AquirePrivateKey... для определения наличия приватного ключа и он бодро рапортует о наличии такового и возвращает его дескриптор ("1").

то есть я расчитывал что удалив сертификат из хранилища я грохну и контейнер. оказывается и при отсутствии сертификата в хранилище можно получить доступ к контейнеру и приватному ключу в нём через контекст сертификата с публичным ключом.

не то чтобы меня это сильно беспокоило, но как-то расчитываешь на недоступность приватного ключа после удаления сертификата с ним...

или я чего-то недопонимаю?
или это баг IE которым я ставил-удалял сертификат?
14.04.2006 15:31:01Kirill Sobolev
Сертификат отдельно, контейнер отдельно. Нет, это не баг ИЕ, он действительно контейнер не удаляет. В нашем CSP, например, есть специальный сервис для удаления контейнеров.