Заголовочный файл: WinCryptEx.h
Библиотека: crypt32.dll (Windows), capilite.so (Unix)
Библиотека импорта: crypt32.lib (Windows)

Функция проверки цепочки сертификатов на допустимость в соответствии с регламентом. Здесь описаны только типы проверок, дополнительные к проверкам, реализованным в CryptoAPI .

Expand imageСинтаксис

C/C++ Copy Code
 BOOL CertVerifyCertificateChainPolicy (
   LPCSTR pszPolicyOID,
   PCCERT_CHAIN_CONTEXT pChainContext,
   PCERT_CHAIN_POLICY_PARA pPolicyPara,
   PCERT_CHAIN_POLICY_STATUS pPolicyStatus
 );

Параметры

pszPolicyOID
Аналогичен параметру функции CertVerifyCertificateChainPolicy . Дополнительные политики проверки цепочек:
Имя Описание
CPCERT_CHAIN_POLICY_PRIVATEKEY_USAGE_PERIOD

Реализует общую проверку цепочки сертификатов с дополнительным контролем регламента использования закрытых ключей сертификатов цепочки. Дополнительные парметры могут быть переданы в структуре CPPRIVATEKEY_USAGE_PERIOD_EXTRA_CERT_CHAIN_POLICY_PARA путём указания её адреса в поле pvExtraPolicyPara в pPolicyPara.

Последовательно выполняются следующие проверки:

  1. CERT_CHAIN_POLICY_BASE — Выполняет основную проверку цепочки. Флаги, переданные в младшем слове dwFlags в pPolicyPara передаются в эту проверку. Возможные значения флагов для данной проверки описаны в CERT_CHAIN_POLICY_PARA .

  2. CERT_CHAIN_POLICY_BASIC_CONSTRAINTS — Выполняет проверку основных ограничений, указанных в сертификатах цепочки. После проверки CERT_CHAIN_POLICY_BASE имеет смысл только для контроля конечного сертификата цепочки. В старшем слове параметра dwFlags в pPolicyPara можно указать флаги, требующие проверить, что конечный сертификат цепочки может использоваться как сертификат ЦС или как сертификат конечного пользователя. Возможные значения флагов для данной проверки описаны в CERT_CHAIN_POLICY_PARA .

  3. Проверяет регламент использования закрытого ключа конечного сертификата. Время проверки может быть задано в структуре CPPRIVATEKEY_USAGE_PERIOD_EXTRA_CERT_CHAIN_POLICY_PARA. Если время использования закрытого ключа конечного сертификата неизвестно, то проверка может быть пропущена указанием в параметре dwFlags в pPolicyPara флага CPPRIVATEKEY_USAGE_PERIOD_CERT_CHAIN_POLICY_SKIP_END_CERT_FLAG.

  4. Проверяет регламент использования закрытого ключа каждого сертификата цепочки выше конечного. Проверяется допустимость использования для подписи изданного сертфиката, базового и разностного CRL, помещённых в цепочку, CTL, если цепочка построена через CTL.


Информация о результате проверки помещается в pPolicyStatus. Подробнее см. примечания.

Результаты проверок 1 и 2 в любом случае возвращаются в полях структуры pPolicyStatus.

Если в pPolicyStatus в параметре pvExtraPolicyStatus передана структура CPPRIVATEKEY_USAGE_PERIOD_EXTRA_CERT_CHAIN_POLICY_STATUS, то результат проверок 3 и 4 возвращается в ней. Возможные коды ошибок: CPCERT_TRUST_PRIVATE_KEY_IS_NOT_TIME_VALID, CPCERT_TRUST_PRIVATE_KEY_IS_NOT_TIME_VALID_FOR_CRL.

Если pvExtraPolicyStatus равен NULL, то проверка прекращается при первой ошибке. В случае ошибки проверки 3 или 4 возвращается CERT_E_EXPIRED.

NoteЗамечание:

Проверка регламента использования закрытых ключей осуществляется по полям notBefore и notAfter расширения Private Key Usage Period (см. ISO/IEC 9594-8, X.509). Присутствие в сертификате данного расширения означает ограничение по времени на использование закрытого ключа, соответствующего данному сертификату. Если расширение отсутствует, то закрытый ключ может использоваться в течение всего срока действия сертификата.

NoteЗамечание:

Цепочка содержит CRL только если была построена с указанием флага проверки на отзыв.
КриптоПро Revocation Provider версии 1.01 и выше, входящий также в состав КриптоПро CSP 3.6 , при проверке статуса сертификата самостоятельно осуществляет контроль правильности использования закрытого ключа для подписи CRL.

CPCERT_CHAIN_POLICY_SIGNATURE

Реализует проверку использования конечного сертификата для подписи. Дополнительные парметры могут быть переданы в структуре CPSIGNATURE_EXTRA_CERT_CHAIN_POLICY_PARA путём указания её адреса в поле pvExtraPolicyPara в pPolicyPara.

Последовательно выполняются следующие проверки:

  1. CPCERT_CHAIN_POLICY_PRIVATEKEY_USAGE_PERIOD - Выполняет общую проверку цепочки и проверку регламента использования закрытых ключей. Подробности см. выше. Содержимое dwFlags будет передано в эту проверку без изменений. Если в pPolicyStatus в параметре pvExtraPolicyStatus передана структура CPSIGNATURE_EXTRA_CERT_CHAIN_POLICY_STATUS, то в неё будут помещены дополнительные результаты данной проверки из структуры CPPRIVATEKEY_USAGE_PERIOD_EXTRA_CERT_CHAIN_POLICY_STATUS.

  2. Для конечного сертификата проверяется наличие разрешённого бита digitalSignature (подпись) или nonRepudiation (неотказуемость) в расширении Key Usage (использование ключа). Отсутствие расширения означает отсутствие ограничений, и в этом случае проверка закончится успешно.


Информация о результате проверки помещается в pPolicyStatus. Подробнее см. примечания.

Если в pPolicyStatus в параметре pvExtraPolicyStatus передана структура CPSIGNATURE_EXTRA_CERT_CHAIN_POLICY_STATUS, то результат проверки 2 возвращается в ней. Возможный код ошибки: CPCERT_TRUST_IS_NOT_VALID_BY_KEYUSAGE.

Если pvExtraPolicyStatus равен NULL, то проверка прекращается при первой ошибке. В случае ошибки проверки 2 возвращается CERT_E_WRONG_USAGE.

CPCERT_CHAIN_POLICY_TIMESTAMP_SIGNING

Реализует проверку использования конечного сертификата для подписи штампов времени. Дополнительные парметры могут быть переданы в структуре CPTIMESTAMP_SIGNING_EXTRA_CERT_CHAIN_POLICY_PARA путём указания её адреса в поле pvExtraPolicyPara в pPolicyPara.

Последовательно выполняются следующие проверки:

  1. CPCERT_CHAIN_POLICY_SIGNATURE - Выполняет проверку использования конечного сертификата для подписи. Подробности см. выше. В поле dwFlags структуры pPolicyPara передаётся младшее слово из переданного в функцию значения dwFlags структуры pPolicyPara (флаги проверки для CERT_CHAIN_POLICY_BASE), дополнительно выставляется флаг BASIC_CONSTRAINTS_CERT_CHAIN_POLICY_END_ENTITY_FLAG. Если в pPolicyStatus в параметре pvExtraPolicyStatus передана структура CPTIMESTAMP_SIGNING_CERT_CHAIN_POLICY_STATUS, то в неё будут помещены дополнительные результаты данной проверки из структуры CPSIGNATURE_EXTRA_CERT_CHAIN_POLICY_STATUS.

  2. Проверяется корректность использования конечного сертификата для подписи штампов времени. В старшем слове dwFlags структуры pPolicyPara могут быть переданы флаги CPTIMESTAMP_SIGNING_CERT_CHAIN_POLICY_IGNORE_NOT_CRITICAL_EKU_FLAG (не выдавать ошибку, если расширение Extended Key Usage (EKU) - некритическое) или CPTIMESTAMP_SIGNING_CERT_CHAIN_POLICY_IGNORE_NOT_ONE_EKU_FLAG (не выдавать ошибку, если сертификат содержит предназначение не только для подписи штампов времени).


В dwFlags можно указать только флаги CPTIMESTAMP_SIGNING_CERT_CHAIN_POLICY_IGNORE_NOT_CRITICAL_EKU_FLAG, CPTIMESTAMP_SIGNING_CERT_CHAIN_POLICY_IGNORE_NOT_ONE_EKU_FLAG и флаги проверки для CERT_CHAIN_POLICY_BASE.

Информация о результате проверки помещается в pPolicyStatus. Подробнее см. примечания.

Если в pPolicyStatus в параметре pvExtraPolicyStatus передана структура CPTIMESTAMP_SIGNING_EXTRA_CERT_CHAIN_POLICY_STATUS, то результат проверки 2 вовращается в ней. Возможные коды ошибок: CPCERT_TRUST_IS_NOT_VALID_FOR_USAGE, CPCERT_TRUST_IS_NOT_CRITICAL_EKU, CPCERT_TRUST_IS_NOT_ONE_EKU.

Если pvExtraPolicyStatus равен NULL, то проверка прекращается при первой ошибке. В случае ошибки проверки 2 возвращается CERT_E_WRONG_USAGE.

CPCERT_CHAIN_POLICY_OCSP_SIGNING

Реализует проверку использования конечного сертификата для подписи OCSP-ответов. Дополнительные парметры могут быть переданы в структуре CPOCSP_SIGNING_EXTRA_CERT_CHAIN_POLICY_PARA путём указания её адреса в поле pvExtraPolicyPara в pPolicyPara.

Последовательно выполняются следующие проверки:

  1. CPCERT_CHAIN_POLICY_SIGNATURE - Выполняет проверку использования конечного сертификата для подписи. Подробности см. выше. Содержимое dwFlags будет передано в эту проверку без изменений. Если в pPolicyStatus в параметре pvExtraPolicyStatus передана структура CPOCSP_SIGNING_EXTRA_CERT_CHAIN_POLICY_STATUS, то в неё будут помещены дополнительные результаты данной проверки из структуры CPSIGNATURE_EXTRA_CERT_CHAIN_POLICY_STATUS.

  2. Выполняется проверка конечного сертфиката. Если сертификат может быть сертификатом ЦС, то он считается допустимым для использования для подписи OCSP-ответов, если же он является сертификатом конечного пользователя, тогда назначение сертификата проверяется по расширению Extended Key Usage (EKU).

  3. Выполняется проверка переданных в CPOCSP_SIGNING_EXTRA_CERT_CHAIN_POLICY_PARA идентификаторов сертификатов. Для каждого идентификатора проверятся, уполномочен ли OCSP-сервер подписывать информацию о статусе соответствующего идентификатору сертификата. Если в pPolicyStatus в параметре pvExtraPolicyStatus передана структура CPOCSP_SIGNING_EXTRA_CERT_CHAIN_POLICY_STATUS, то результат проверки по каждому идентификатору заносится в rgCertIdStatus.


В dwFlags можно указать только флаги проверки для CERT_CHAIN_POLICY_BASE.

Информация о результате проверки помещается в pPolicyStatus. Подробнее см. примечания.

Если в pPolicyStatus в параметре pvExtraPolicyStatus передана структура CPOCSP_SIGNING_EXTRA_CERT_CHAIN_POLICY_STATUS, то результат проверок 2 и 3 возвращается в ней. Возвращаемые коды ошибок: CPCERT_TRUST_IS_NOT_VALID_FOR_USAGE, CPCERT_TRUST_IS_NOT_VALID_FOR_OCSP_SIGNING.

Если pvExtraPolicyStatus равен NULL, то проверка прекращается при первой ошибке. В случае ошибки проверок 2 и 3 возвращается CERT_E_WRONG_USAGE.

Проверка CPCERT_CHAIN_POLICY_OCSP_SIGNING в клиентских приложениях имеет смысл только для конкретного OCSP-ответа, причём в этом случае будет задан один или несколько идентификаторов сертификатов в CPOCSP_SIGNING_EXTRA_CERT_CHAIN_POLICY_PARA. Поэтому данная проверка без указания идентификаторов сертификатов является особенным случаем и отличается от проверки с указанием идентификаторов следующим образом: проверяемый сертификат считается сертификатом ЦС только в случае явного указания этого в расширении Basic Constraints (основные ограничения). Это отличие вводится для того, чтобы сертификатом службы OCSP не был признан произвольный сертификат конечного пользователя, в котором обычно отсутствует это расширение.

pChainContext
Указатель на структуру CERT_CHAIN_CONTEXT , содержащую цепочку для проверки. Аналогичен параметру функции CertVerifyCertificateChainPolicy .
pPolicyPara
Указатель на структуру CERT_CHAIN_POLICY_PARA , содержащую критерии для проверки цепочки. Аналогичен параметру функции CertVerifyCertificateChainPolicy .
pPolicyStatus
[in, out] Указатель на структуру CERT_CHAIN_POLICY_STATUS , содержащую информацию ос статусе проверки цепочки. Аналогичен параметру функции CertVerifyCertificateChainPolicy .

Возвращаемое значение

Аналогично функции CertVerifyCertificateChainPolicy с тем отличием, что цепочка считается прошедшей проверку только в том случае, если значения статуса проверки dwError в pPolicyStatus и в pvExtraPolicyStatus (если задано) оба равны 0 (ERROR_SUCCESS или S_OK).


Expand imageПримечания

Результат проверки возвращается в pPolicyStatus в структуре CERT_CHAIN_POLICY_STATUS .

Если в pPolicyStatus была передана структура для дополнительного статуса (в поле pvExtraPolicyStatus), то результат проверок, дополнительных к CERT_CHAIN_POLICY_BASE и CERT_CHAIN_POLICY_BASIC_CONSTRAINTS будет возвращён в полях этой дополнительной структуры, при этом поле dwError в pPolicyStatus может быть нулевым, что указывает на отсутствие ошибок при проверках CERT_CHAIN_POLICY_BASE и CERT_CHAIN_POLICY_BASIC_CONSTRAINTS, а поле dwError в структуре дополнительного статуса указывать на ошибку. Ошибки в это поле заносятся в виде битовой маски, поэтому может быть указано сразу несколько обнаруженных ошибок.

Описания кодов ошибок в pvExtraPolicyStatus представлены в таблице:
Имя Описание
CPCERT_TRUST_PRIVATE_KEY_IS_NOT_TIME_VALID

Один из сертификатов цепочки был использован для подписи вне периода действия закрытого ключа.

CPCERT_TRUST_PRIVATE_KEY_IS_NOT_TIME_VALID_FOR_CRL

Один из сертификатов цепочки был использован для подписи CRL вне периода действия закрытого ключа.

CPCERT_TRUST_IS_NOT_CRITICAL_EKU

Не выполнено требование критичности расширения Extended Key Usage (EKU).

CPCERT_TRUST_IS_NOT_ONE_EKU

В сертификате должно содержаться только одно значение в расширении Extended Key Usage (EKU).

CPCERT_TRUST_IS_NOT_VALID_FOR_USAGE

Сертификат признан недопустимым для использования по назначению.

CPCERT_TRUST_IS_NOT_VALID_BY_KEYUSAGE

Сертификат признан недопустимым для использования для подписи из-за отсутствия в расширении Key Usage (использование ключа) битов digitalSignature (подпись) и nonRepudation (неотказуемость).

CPCERT_TRUST_IS_NOT_VALID_FOR_OCSP_SIGNING

Сертификат не содержит в расширении Extended Key Usage (EKU) назначения для подписи ответа службы OCSP.

Expand imageСм. также