Поделиться через


Проверка учетных данных Schannel вручную

По умолчанию Schannel проверяет сертификат сервера , вызывая функцию WinVerifyTrust ; Однако если вы отключили эту функцию с помощью флага ISC_REQ_MANUAL_CRED_VALIDATION, необходимо проверить сертификат, предоставленный сервером, который пытается установить его удостоверение.

Чтобы проверить сертификат сервера вручную, необходимо сначала получить его. Используйте функцию QueryContextAttributes (General) и укажите значение атрибута SECPKG_ATTR_REMOTE_CERT_CONTEXT. Этот атрибут возвращает CERT_CONTEXT структуру с цепочкой сертификатов, предоставленной сервером. Эта цепочка сертификатов содержит конечный сертификат. Он называется конечным сертификатом, так как он является последним сертификатом в цепочке сертификатов и находится далеко от корневого сертификата. Порядок сертификатов в буфере контекста SSPI не подразумевает отношения цепочки сертификатов.

Используя конечный сертификат, необходимо проверить следующее:

  • Цепочка сертификатов завершена, а корневая — это сертификат из доверенного центра сертификации (ЦС).
  • Текущее время не превышает даты начала и окончания для каждого сертификата в цепочке сертификатов.
  • Ни один из сертификатов в цепочке сертификатов не был отозван.
  • Глубина конечного сертификата не превышает максимально допустимую глубину, указанную в расширении сертификата. Это проверка необходимо, только если указана глубина.
  • Использование сертификата является правильным, например, сертификат клиента не должен использоваться для проверки подлинности сервера.
  • Для проверки подлинности сервера удостоверение сервера, содержащееся в конечном сертификате сервера, соответствует серверу, с которым клиент пытается связаться. Как правило, клиент сопоставляет некоторый элемент в поле "Имя субъекта" сертификата с IP-адресом сервера или DNS-именем.