| ||||
| ||||
Здравствуйте, уважаемые. Пишу интеграцию с цифровой подписью для приложения электронного документооборота на Delphi. Всё прекрасно работает, за что огромное спасибо за ваши ответы, почерпнул очень многое. Разрешите глупый вопрос: - при формировании цифровой подписи PKCS7 совмещённой с сертификатом, я правильно понимаю, что закрытый ключ сертификата в подпись не помещается? А то что-то сомнения какие-то меня гложат... Приватного ключа ведь в такой подписи точно нет? Извините, если глупость спросил. | ||||
Ответы: | ||||
| ||||
Вроде разобрался, извините... Вопрос спровоцирован тем, что, пока тестировал, удивило меня то, что при получении контекста включенного в подпись сертификата он диагностировался моим модулем как имеющий приватный ключ, хотя я-же удалил сертификат с ключом перед выполнением теста... Потом проверил на другом компьютере - всё нормально - подпись проверяется и выделенный из неё сертификат уже диагностируется как не содержащий закрытый ключ. Может быть удаление сертификата (из IE) не удаляет связанный с ним контейнер ключей? | ||||
| ||||
Точно не удаляет | ||||
| ||||
ну в общем это не так принципиально, просто неаккуратненько как-то выглядит... я определяю наличие приватного ключа у сертификата по критерию: if CryptAcquireCertificatePrivateKey(hCert, 0, nil, phProv, dwKeySpec, pfCallerFreeProv) then {ключь есть} то есть если ключ эквейрится значит он есть... може надо иначе проверять? | ||||
| ||||
Система такая: у сертификата, установленного в хранилище, может быть (а может и не быть) ссылка на контейнер секретного ключа. Если ссылки нет, то ключа тоже нет. Но вот если ссылка есть, не факт что по ней обнаружится контейнер. Поэтому, без открытия контейнера CryptAcquireContext (что и делает CryptAcquireCertificatePrivateKey) не обойтись, если точно узнать надо наличие. | ||||
| ||||
так вот меня это и смутило. то есть я сертификат из хранилища удалил, запускаю проверку подписи, она получает контекст сертификата подписчика, я на него натравливаю свой враппер, одним из действий которого выполнение ...AquirePrivateKey... для определения наличия приватного ключа и он бодро рапортует о наличии такового и возвращает его дескриптор ("1"). то есть я расчитывал что удалив сертификат из хранилища я грохну и контейнер. оказывается и при отсутствии сертификата в хранилище можно получить доступ к контейнеру и приватному ключу в нём через контекст сертификата с публичным ключом. не то чтобы меня это сильно беспокоило, но как-то расчитываешь на недоступность приватного ключа после удаления сертификата с ним... или я чего-то недопонимаю? или это баг IE которым я ставил-удалял сертификат? | ||||
| ||||
Сертификат отдельно, контейнер отдельно. Нет, это не баг ИЕ, он действительно контейнер не удаляет. В нашем CSP, например, есть специальный сервис для удаления контейнеров. | ||||