Проверка учетных данных Schannel вручную
По умолчанию Schannel проверяет сертификат сервера , вызывая функцию WinVerifyTrust ; Однако если вы отключили эту функцию с помощью флага ISC_REQ_MANUAL_CRED_VALIDATION, необходимо проверить сертификат, предоставленный сервером, который пытается установить его удостоверение.
Чтобы проверить сертификат сервера вручную, необходимо сначала получить его. Используйте функцию QueryContextAttributes (General) и укажите значение атрибута SECPKG_ATTR_REMOTE_CERT_CONTEXT. Этот атрибут возвращает CERT_CONTEXT структуру с цепочкой сертификатов, предоставленной сервером. Эта цепочка сертификатов содержит конечный сертификат. Он называется конечным сертификатом, так как он является последним сертификатом в цепочке сертификатов и находится далеко от корневого сертификата. Порядок сертификатов в буфере контекста SSPI не подразумевает отношения цепочки сертификатов.
Используя конечный сертификат, необходимо проверить следующее:
- Цепочка сертификатов завершена, а корневая — это сертификат из доверенного центра сертификации (ЦС).
- Текущее время не превышает даты начала и окончания для каждого сертификата в цепочке сертификатов.
- Ни один из сертификатов в цепочке сертификатов не был отозван.
- Глубина конечного сертификата не превышает максимально допустимую глубину, указанную в расширении сертификата. Это проверка необходимо, только если указана глубина.
- Использование сертификата является правильным, например, сертификат клиента не должен использоваться для проверки подлинности сервера.
- Для проверки подлинности сервера удостоверение сервера, содержащееся в конечном сертификате сервера, соответствует серверу, с которым клиент пытается связаться. Как правило, клиент сопоставляет некоторый элемент в поле "Имя субъекта" сертификата с IP-адресом сервера или DNS-именем.