Поиск сертификата

января 7 2010 by admin in Безопасность

В сертификатах содержится порядочный объем информации, и CryptoAPI позволяет искать сертификаты на основе любой содержащейся в них информации. Однако большая часть информации в сертификатах не уникальна, что делает критерии поиска неоднозначными. Обычно на сертификаты ссылаются по их общим именам, так что при поиске следует использовать именно их.
Общее имя сертификата является его атрибутом. При поиске сертификата в хранилище вы можете в качестве критерия использовать один или несколько атрибутов. Для этого создается массив структур, по одной для каждого атрибута, и этот массив передается функции CertFindCertificatelnStore.
Собственно критерий поиска задается параметром pvF.indPara. Если вы ищете сертификат по его атрибутам, указав флаг CERT_FIND_SUBJECT_ATTR, этот параметр должен содержать указатель на структуру CERT_RDN.
CertFindCertificatelnStore позволяет перебрать сертификаты в хранилище. Параметр pPrevCertContext указывает последний найденный контекст. Его нужно установить в NULL для контекста первого сертификата, а также когда вы ищете только один сертификат.
Если поиск завершен успешно, CertFindCertificatelnStore возвращает указатель на структуру контекста сертификата. Закончив работу с этой структурой, вы должны освободить ее с помощью CertFreeCertificateContext.
Конструкция этой структуры обладает большой гибкостью, необходимой для хранения различных типов данных, которыми могут быть представлены атрибуты сертификата. Элем сит pszObjIci является идентификатором рассматриваемого атрибута. Для общего имени сертификата установите его значение в szOID_COMMON_NAME. Элемент dwValueType указывает тип данных этого значения. Для общего имени устанавливайте его в CERT_RDN_PRINTABLE_ STRING. (Для общих имен сертификатов всегда используйте ANSI-строки.)
Элемент Value — это блоб-структура с двумя элементами: cbData npbData. Они являются размером данных и указателем на данные соответственно.
Некоторые типы атрибутов и их типы данных описаны в документации Platform SDK. Если структуры, которые вы хотите заполнить, не описаны в документации, можете использовать другой подход для поиска сертификата. Например, откройте сертификат и просмотрите его значения RDN, чтобы в дальнейшем для поиска сертификатов использовать сходные данные.
Приведенный далее пример кода показывает, как применяются рассмотренные функции работы с сертификатами. В нем открывается персональное хранилище локальной машины и ищется сертификат с общим именем «Jason's Test Certificate».
Хотя «Jason's Test Certificate» — допустимое общее имя сертификата, оно не демонстрирует наиболее распространенный подход использования общих имен. Обычно сертификат называется в соответствии с расположением сервера в сети. Таким образом, клиентское ПО может сравнить общее имя сертификата с именем сервера, с которым оно пытается установить защищенный сеанс взаимодействия.