26.04.2007 13:34:35Опять про проверку сертификатов (.net) Ответов: 6
Максим
Здравствуйте!

Вопрос неоднократно поднимался на вашем форуме, но мне самые азы хотелось бы узнать (гугл не помог).

Допустим получено подписанное сообщение и сертификат открытого ключа. Подпись по этому сертификту верифицирована успешно, отправитель действительно владелец сертификата.

Но как произвести проверку самого сертификата? Неужели "вручную" просматривать всю цепочку до Trusted Root + СОС или способы проще. Какие API есть для выполнения этого и как ими пользоваться (хотя бы общая схема).
 
Ответы:
26.04.2007 15:20:52Kirill Sobolev
Вместо ручного просмотра можно воспользоваться функцией CertGetCertificateChain из CryptoAPI или объектом Chain из CAPICOM. Инфу по ним проще искать в msdn.microsoft.com чем в гугле.
26.04.2007 15:40:35Максим
CAPICOM использовать я не могу. Посмотрел в MSDN описание CertGetCertificateChain и пример ее использования. Я правильно понял, что все сертификаты цепочки от подписавшего данный сертификат до корневого должны быть установлены на машине пользователя? Откуда функция берет СОС (можно ли это как то задать) и пытается ли его получить вообще?
27.04.2007 10:13:52Kirill Sobolev
Корневой должен быть установлен, для остальных можно указать хранилище где они находятся (в т.ч. и временное в памяти), по умолчанию ищет в "CA". Тоже самое и с CRL. Хранилища где искать задаются функцией CertCreateCertificateChainEngine. Так же можно задать получение CRL из онлайн источников (по CDP сертификата).
27.04.2007 11:44:46Максим
Спасибо, Кирилл!

Верно ли я понимаю, что:
1. CertCreateCertificateChainEngine смотрит поле Issuer и ищет его сертификат, снова переходит на Issuer и так до Trusted. Где именно производится поиск в Personal current user или где то еще? Что в данном случае вы подразумевали под CA, если Certification Authority, то как функция его находит?

2. Если для сертификата задан CRL Distribution Point как URL - проверяет список. Если соединение не установлено, таков будет результат?

^^^ 1 и 2 производятся "прозрачно" самой функцией или требуется производить какие либо действия.
27.04.2007 14:30:25Kirill Sobolev
1)CertCreateCertificateChainEngine только определяет параметры построения цепочек, сами цепочки строятся CertGetCertificateChain. Помимо издателя еще смотрится расширение "Идентификатор ключа", по-моему даже в первую очередь. По умолчанию промежуточные сертификаты ищутся в хранилище "Промежучуточные цс" (СА-я его подразумевал), а корневые - в хранилище "Доверенные корневые цс" (ROOT).
2)Если нет соединения и нет CRL локально - то будет ошибка проверки.
Да, и 1 и 2 выполняются самой функцией, на выходе сложная структура содержащая сертификаты цепочки и статусы их проверки.
27.04.2007 14:38:30Максим
Спасибо, Кирилл!

Вы мне многое прояснили. Буду разбираться дальше.