В документации WinVerifyTrust на MSDN вы можете прочитать
Для проверки сертификата используйте CertGetCertificateChain и
CertVerifyCertificateChainPolicy функции.
Проблема в том, что нужно выполнить довольно много работы, если нужно проверить, разрешен ли один сертификат для подписи кода. Прежде всего, сам сертификат должен быть действительным и иметь szOID_PKIX_KP_CODE_SIGNING
(«1.3.6.1.5.5.7.3.3»). Кроме того, его родитель и родительский родитель должны быть в порядке. Например, если родитель имеет только szOID_PKIX_KP_CLIENT_AUTH
(«1.3.6.1.5.5.7.3.2») в расширенном использовании ключа или если один из родительских сертификатов перемещен, сертификат, который вы пытаетесь проверить, будет недействительным. Таким образом, цепь должна быть построена, и цепь должна быть проверена.
Может случиться много интересных замен. Например, возможно, срок действия одного из родительских сертификатов истек. С другой стороны, сертификаты обычно не только подписываются, но и используется Time Stamping . Таким образом, можно проверить, что срок действия корневого сертификата как эмитента истек, но корневой сертификат все еще действовал на момент выдачи дочернего сертификата. Если время подписания дочернего сертификата было подтверждено соответствующей временной подписью, а выданный сертификат еще не истек, дочерний сертификат будет действительным. Надеюсь, пример не слишком сложный. Я хочу только показать, что не только каждый сертификат в цепочке должен быть проверен, но вся цепочка должна быть проверена . Извините за столь длинное объяснение.
Я полагаю, что WinVerifyTrust
внутренне использует функции CertGetCertificateChain
и CertVerifyCertificateChainPolicy
, но с какими параметрами точно не ясно. Многое зависит от параметров WINTRUST_DATA
, которые вы используете.
В любом случае ошибка CERT_E_CHAINING
может исходить от CertGetCertificateChain
, CertVerifyCertificateChainPolicy
или любого другого API, используемого внутри. Например, оно может быть из поля dwError
CERT_CHAIN_POLICY_STATUS , используемого в качестве параметра pPolicyStatus
CertVerifyCertificateChainPolicy
.
Вы написали, что «некоторые пользователи сообщают» об ошибке, поэтому может случиться, что пользователи попытаются использовать ваше приложение неправильно или некоторые сертификаты будут установлены неправильно . Если один экспортный сертификат, например, один может сделать это вместе с родительскими сертификатами без родителей. Если один экспортный сертификат без родителей, проверка импортированного сертификата будет немного сложнее. В некоторых ситуациях корневой сертификат может быть загружен на основе URL-адресов дочернего сертификата, но в другой ситуации это будет невозможно. Если родительский сертификат или родительский родитель не может быть найден или загружен, у вас будет ошибка CERT_E_CHAINING
.