Функция проверки цепочки сертификатов на допустимость в соответствии с регламентом. Здесь описаны только типы проверок, дополнительные к
Синтаксис
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.
Последовательно выполняются следующие проверки:-
CERT_CHAIN_POLICY_BASE — Выполняет основную проверку цепочки. Флаги, переданные в младшем слове dwFlags в pPolicyPara передаются в эту проверку. Возможные значения флагов для данной проверки описаны в
CERT_CHAIN_POLICY_PARA . -
CERT_CHAIN_POLICY_BASIC_CONSTRAINTS — Выполняет проверку основных ограничений, указанных в сертификатах цепочки. После проверки CERT_CHAIN_POLICY_BASE имеет смысл только для контроля конечного сертификата цепочки. В старшем слове параметра dwFlags в pPolicyPara можно указать флаги, требующие проверить, что конечный сертификат цепочки может использоваться как сертификат ЦС или как сертификат конечного пользователя. Возможные значения флагов для данной проверки описаны в
CERT_CHAIN_POLICY_PARA . -
Проверяет регламент использования закрытого ключа конечного сертификата. Время проверки может быть задано в структуре CPPRIVATEKEY_USAGE_PERIOD_EXTRA_CERT_CHAIN_POLICY_PARA. Если время использования закрытого ключа конечного сертификата неизвестно, то проверка может быть пропущена указанием в параметре dwFlags в pPolicyPara флага CPPRIVATEKEY_USAGE_PERIOD_CERT_CHAIN_POLICY_SKIP_END_CERT_FLAG.
-
Проверяет регламент использования закрытого ключа каждого сертификата цепочки выше конечного. Проверяется допустимость использования для подписи изданного сертфиката, базового и разностного 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.ЗамечаниеПроверка регламента использования закрытых ключей осуществляется по полям notBefore и notAfter расширения Private Key Usage Period (см. ISO/IEC 9594-8, X.509). Присутствие в сертификате данного расширения означает ограничение по времени на использование закрытого ключа, соответствующего данному сертификату. Если расширение отсутствует, то закрытый ключ может использоваться в течение всего срока действия сертификата.
ЗамечаниеЦепочка содержит CRL только если была построена с указанием флага проверки на отзыв.
КриптоПро Revocation Provider версии 1.01 и выше, входящий также в составКриптоПро CSP 3.6 , при проверке статуса сертификата самостоятельно осуществляет контроль правильности использования закрытого ключа для подписи CRL.CPCERT_CHAIN_POLICY_SIGNATURE Реализует проверку использования конечного сертификата для подписи. Дополнительные парметры могут быть переданы в структуре CPSIGNATURE_EXTRA_CERT_CHAIN_POLICY_PARA путём указания её адреса в поле pvExtraPolicyPara в pPolicyPara.
Последовательно выполняются следующие проверки:-
CPCERT_CHAIN_POLICY_PRIVATEKEY_USAGE_PERIOD - Выполняет общую проверку цепочки и проверку регламента использования закрытых ключей. Подробности см. выше. Содержимое dwFlags будет передано в эту проверку без изменений. Если в pPolicyStatus в параметре pvExtraPolicyStatus передана структура CPSIGNATURE_EXTRA_CERT_CHAIN_POLICY_STATUS, то в неё будут помещены дополнительные результаты данной проверки из структуры CPPRIVATEKEY_USAGE_PERIOD_EXTRA_CERT_CHAIN_POLICY_STATUS.
-
Для конечного сертификата проверяется наличие разрешённого бита 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.
Последовательно выполняются следующие проверки:-
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.
-
Проверяется корректность использования конечного сертификата для подписи штампов времени. В старшем слове 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.
Последовательно выполняются следующие проверки:-
CPCERT_CHAIN_POLICY_SIGNATURE - Выполняет проверку использования конечного сертификата для подписи. Подробности см. выше. Содержимое dwFlags будет передано в эту проверку без изменений. Если в pPolicyStatus в параметре pvExtraPolicyStatus передана структура CPOCSP_SIGNING_EXTRA_CERT_CHAIN_POLICY_STATUS, то в неё будут помещены дополнительные результаты данной проверки из структуры CPSIGNATURE_EXTRA_CERT_CHAIN_POLICY_STATUS.
-
Выполняется проверка конечного сертфиката. Если сертификат может быть сертификатом ЦС, то он считается допустимым для использования для подписи OCSP-ответов, если же он является сертификатом конечного пользователя, тогда назначение сертификата проверяется по расширению Extended Key Usage (EKU).
-
Выполняется проверка переданных в 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 .
Возвращаемое значение
Аналогично функции
Примечания
Результат проверки возвращается в pPolicyStatus в структуре
Если в 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. |
Требования
Заголовочный файл | WinCryptEx.h |
---|---|
Библиотека | crypt32.dll (Windows), capilite.so (Unix) |
Библиотека импорта | crypt32.lib (Windows) |
Минимальная версия продукта | 1.0 |
См. также
CPPRIVATEKEY_USAGE_PERIOD_EXTRA_CERT_CHAIN_POLICY_PARA
CPPRIVATEKEY_USAGE_PERIOD_EXTRA_CERT_CHAIN_POLICY_STATUS
CPSIGNATURE_EXTRA_CERT_CHAIN_POLICY_PARA
CPSIGNATURE_EXTRA_CERT_CHAIN_POLICY_STATUS
CPTIMESTAMP_SIGNING_EXTRA_CERT_CHAIN_POLICY_PARA
CPTIMESTAMP_SIGNING_EXTRA_CERT_CHAIN_POLICY_STATUS
CPOCSP_SIGNING_EXTRA_CERT_CHAIN_POLICY_PARA
CPOCSP_SIGNING_EXTRA_CERT_CHAIN_POLICY_STATUS