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


Обработчики расширений

Начиная с формата сертификата X.509 версии 3, сертификат может содержать расширения сертификатов. (Содержимое сертификата X.509 см. в разделе Свойства сертификата.) Эти расширения указывают дополнительные сведения. Например, расширение может указывать дополнительные сведения об идентификации субъекта или сведения об использовании ключа, которые указывают задачи (например, подпись или шифрование), для которых можно использовать ключ. Набор стандартных расширений определяется для использования приложениями, и расширения также могут быть настроены.

Каждое расширение имеет связанную строку идентификатора объекта, которая определяет тип дополнительных сведений и структуру данных, содержащую эти сведения. Например, идентификатор объекта использования ключа — "2.5.29.15", который указывает сведения об использовании ключа. Связанная с ней структура данных представляет собой CRYPT_BIT_BLOB (битовое поле), указывающее, как можно использовать ключ.

Расширение можно добавить в сертификат перед его выдачей. При выдаче сертификата все включенные расширения являются частью сертификата. Если расширение помечено как критическое, его использование должно быть известно приложению using, а приложение должно соответствовать намерению или значению расширения. Службы сертификатов позволяют задавать расширения для невыдаваемого сертификата с помощью методов, предоставляемых ICertAdmin и ICertServerPolicy. Дополнительные сведения о расширениях сертификатов см. в CERT_EXTENSION документации по CryptoAPI. Сведения об общих структурах данных расширения сертификатов см. в разделе Структуры расширений сертификатов X.509.

Обработчик расширения — это COM-объект, который предоставляет подпрограммы для кодирования более сложных, но часто используемых расширений и типов данных, таких как IA5String или PrintableString.

Расширениям с типами данных DATE, LONG и BSTR не требуется обработчик расширений. Модуль политики просто вызывает ICertServerPolicy::SetCertificateExtension с параметром Type , значением, представляющим тип данных расширения: PROPTYPE_DATE, PROPTYPE_LONG или PROPTYPE_STRING. Затем он передает расширение подсистеме сервера. Серверная подсистема, в свою очередь, выполняет кодирование абстрактной синтаксической нотации 1 (ASN.1) перед сохранением расширения в сертификате.

Однако расширения, имеющие типы данных, отличные от этих типов по умолчанию, должны быть закодированы обработчиком расширений ASN.1, прежде чем модуль политики передает их подсистеме сервера. Когда модуль политики вызывает ICertServerPolicy::SetCertificateExtension для передачи расширения в кодировке ASN.1 подсистеме сервера, он должен задать для параметра Type значение PROPTYPE_BINARY. Затем подсистема сервера просто сохраняет это закодированное расширение в сертификате.

Обработчик расширения по умолчанию, Certenc.dll, экспортирует ряд интерфейсов ICertEncodeXXX и может вызываться модулем политики. Необходимые сведения о типе также содержатся в Certencl.dll который предоставляется в пакете SDK для платформенного программного обеспечения. Каждый интерфейс предоставляет метод Encode , который возвращает расширение сертификата в кодировке ASN.1 модулю политики в двоичном формате. Затем модуль политики может задать расширение в сертификате, вызвав метод ICertServerPolicy::SetCertificateExtension .

Дополнительные сведения см. в статье Написание пользовательских обработчиков расширений.