| ||||
| ||||
Здравствуйте! Вопрос неоднократно поднимался на вашем форуме, но мне самые азы хотелось бы узнать (гугл не помог). Допустим получено подписанное сообщение и сертификат открытого ключа. Подпись по этому сертификту верифицирована успешно, отправитель действительно владелец сертификата. Но как произвести проверку самого сертификата? Неужели "вручную" просматривать всю цепочку до Trusted Root + СОС или способы проще. Какие API есть для выполнения этого и как ими пользоваться (хотя бы общая схема). | ||||
Ответы: | ||||
| ||||
Вместо ручного просмотра можно воспользоваться функцией CertGetCertificateChain из CryptoAPI или объектом Chain из CAPICOM. Инфу по ним проще искать в msdn.microsoft.com чем в гугле. | ||||
| ||||
CAPICOM использовать я не могу. Посмотрел в MSDN описание CertGetCertificateChain и пример ее использования. Я правильно понял, что все сертификаты цепочки от подписавшего данный сертификат до корневого должны быть установлены на машине пользователя? Откуда функция берет СОС (можно ли это как то задать) и пытается ли его получить вообще? | ||||
| ||||
Корневой должен быть установлен, для остальных можно указать хранилище где они находятся (в т.ч. и временное в памяти), по умолчанию ищет в "CA". Тоже самое и с CRL. Хранилища где искать задаются функцией CertCreateCertificateChainEngine. Так же можно задать получение CRL из онлайн источников (по CDP сертификата). | ||||
| ||||
Спасибо, Кирилл! Верно ли я понимаю, что: 1. CertCreateCertificateChainEngine смотрит поле Issuer и ищет его сертификат, снова переходит на Issuer и так до Trusted. Где именно производится поиск в Personal current user или где то еще? Что в данном случае вы подразумевали под CA, если Certification Authority, то как функция его находит? 2. Если для сертификата задан CRL Distribution Point как URL - проверяет список. Если соединение не установлено, таков будет результат? ^^^ 1 и 2 производятся "прозрачно" самой функцией или требуется производить какие либо действия. | ||||
| ||||
1)CertCreateCertificateChainEngine только определяет параметры построения цепочек, сами цепочки строятся CertGetCertificateChain. Помимо издателя еще смотрится расширение "Идентификатор ключа", по-моему даже в первую очередь. По умолчанию промежуточные сертификаты ищутся в хранилище "Промежучуточные цс" (СА-я его подразумевал), а корневые - в хранилище "Доверенные корневые цс" (ROOT). 2)Если нет соединения и нет CRL локально - то будет ошибка проверки. Да, и 1 и 2 выполняются самой функцией, на выходе сложная структура содержащая сертификаты цепочки и статусы их проверки. | ||||
| ||||
Спасибо, Кирилл! Вы мне многое прояснили. Буду разбираться дальше. | ||||