CertVerifyCertificateChainPolicy 函数 (wincrypt.h)

CertVerifyCertificateChainPolicy 函数检查证书链以验证其有效性,包括其是否符合任何指定的有效性策略条件。

语法

BOOL CertVerifyCertificateChainPolicy(
  [in]      LPCSTR                    pszPolicyOID,
  [in]      PCCERT_CHAIN_CONTEXT      pChainContext,
  [in]      PCERT_CHAIN_POLICY_PARA   pPolicyPara,
  [in, out] PCERT_CHAIN_POLICY_STATUS pPolicyStatus
);

参数

[in] pszPolicyOID

下表列出了当前的预定义验证链策略结构。

含义
CERT_CHAIN_POLICY_BASE
(LPCSTR) 1
实现基链策略验证检查。 pPolicyPara 指向的 结构的 dwFlags 成员可以设置为更改默认策略检查行为。
CERT_CHAIN_POLICY_AUTHENTICODE
(LPCSTR) 2
实现 Authenticode 链策略验证检查。 pPolicyPara 指向的结构的 pvExtraPolicyPara 成员可以设置为指向AUTHENTICODE_EXTRA_CERT_CHAIN_POLICY_PARA结构。

pPolicyStatus 指向的结构的 pvExtraPolicyStatus 成员可以设置为指向AUTHENTICODE_EXTRA_CERT_CHAIN_POLICY_STATUS结构。

CERT_CHAIN_POLICY_AUTHENTICODE_TS
(LPCSTR) 3
实现验证码时间戳链策略验证检查。 pPolicyPara 指向的数据结构的 pvExtraPolicyPara 成员可以设置为指向AUTHENTICODE_TS_EXTRA_CERT_CHAIN_POLICY_PARA结构。

不使用 pPolicyStatus 指向的数据结构的 pvExtraPolicyStatus 成员,必须设置为 NULL

CERT_CHAIN_POLICY_SSL
(LPCSTR) 4
实现 SSL 客户端/服务器链策略验证检查。 pPolicyPara 指向的数据结构中的 pvExtraPolicyPara 成员可以设置为指向使用其他策略条件初始化的SSL_EXTRA_CERT_CHAIN_POLICY_PARA结构。
注意 为了区分服务器和客户端授权证书,调用 CertGetCertificateChain 函数以获取链上下文时,应通过设置预期的用法来指定证书类型。 通过设置在 CertGetCertificateChain 函数的 pChainPara 输入参数中传递的 CERT_CHAIN_PARA 结构的 RequestedUsage 成员来设置预期使用情况。
 
CERT_CHAIN_POLICY_BASIC_CONSTRAINTS
(LPCSTR) 5
实现基本约束链策略。 循环访问链中的所有证书,检查szOID_BASIC_CONSTRAINTS或szOID_BASIC_CONSTRAINTS2扩展。 如果两个扩展都不存在,则假定证书具有有效的策略。 否则,对于第一个证书元素,检查它是否与 pPolicyPara 参数指向的 CERT_CHAIN_POLICY_PARA 结构的 dwFlags 成员中指定的预期CA_FLAG或END_ENTITY_FLAG匹配。 如果两个或两个标志均未设置,则第一个元素可以是 CA 或END_ENTITY。 所有其他元素必须是 CA) (证书颁发机构 。 如果扩展中存在 PathLenConstraint,则会对其进行检查。

其余简单链中的第一个元素 (,即,用于对 CTL) 进行签名的证书被检查为END_ENTITY。 如果此验证失败, dwError 将设置为 TRUST_E_BASIC_CONSTRAINTS。

CERT_CHAIN_POLICY_NT_AUTH
(LPCSTR) 6
实现 Windows NT 身份验证链策略,该策略由三个不同的链验证组成,顺序如下:
  1. CERT_CHAIN_POLICY_BASE — 实现基链策略验证检查。 可以在 pPolicyPara 中设置 dwFlags 的 LOWORD 以更改默认策略检查行为。 有关详细信息,请参阅 CERT_CHAIN_POLICY_BASE。
  2. CERT_CHAIN_POLICY_BASIC_CONSTRAINTS — 实现基本约束链策略。 可以设置 dwFlags 的 HIWORD,以指定第一个元素必须是 CA 还是END_ENTITY。 有关详细信息,请参阅 CERT_CHAIN_POLICY_BASIC_CONSTRAINTS。
  3. 检查链中的第二个元素(颁发最终证书的 CA)是否是 Windows NT 身份验证的受信任 CA。 如果 CA 存在于CERT_SYSTEM_STORE_LOCAL_MACHINE_ENTERPRISE存储位置中的“NTAuth”系统注册表存储中,则它被视为受信任。 如果此验证失败,则 CA 不受信任,dwError 设置为 CERT_E_UNTRUSTEDCA。如果在由 CERT_PROT_ROOT_FLAGS_REGPATH 定义的 HKEY_LOCAL_MACHINE 策略 ProtectedRoots 子项的 Flags 值中设置了CERT_PROT_ROOT_DISABLE_NT_AUTH_REQUIRED_FLAG,并且上述检查失败,则会检查链中是否CERT_TRUST_HAS_VALID_NAME_CONSTRAINTS在 dwInfoStatus 中设置。 如果所有命名空间(包括 UPN)都有有效的名称约束,则会设置此限制。 如果链未设置此信息状态, 则 dwError 设置为 CERT_E_UNTRUSTEDCA。
CERT_CHAIN_POLICY_MICROSOFT_ROOT
(LPCSTR) 7
检查 Microsoft 根公钥的第一个简单链的最后一个元素。 如果该元素不包含 Microsoft 根公钥,则 pPolicyStatus 参数指向的 CERT_CHAIN_POLICY_STATUS 结构的 dwError 成员将设置为 CERT_E_UNTRUSTEDROOT

pPolicyStatus 参数指向的 CERT_CHAIN_POLICY_PARA 结构的 dwFlags 成员可以包含 MICROSOFT_ROOT_CERT_CHAIN_POLICY_CHECK_APPLICATION_ROOT_FLAG 标志,这会导致此函数改为为 Microsoft 应用程序根目录“Microsoft 根证书颁发机构 2011”检查。

pPolicyPara 参数指向的 CERT_CHAIN_POLICY_PARA 结构的 dwFlags 成员可以包含 MICROSOFT_ROOT_CERT_CHAIN_POLICY_ENABLE_TEST_ROOT_FLAG 标志,这会导致此函数也为 Microsoft 测试根检查。

注意 此策略 对象标识符 (OID) 本身不执行任何策略验证检查,旨在与其他策略结合使用。
 
CERT_CHAIN_POLICY_EV
(LPCSTR) 8
指定执行证书的扩展验证。

Windows Server 2008、Windows Vista、Windows Server 2003 和 Windows XP: 不支持此值。

CERT_CHAIN_POLICY_SSL_F12
(LPCSTR) 9
检查链中的任何证书是否具有弱加密或第三方根证书合规性,并提供错误字符串。 pPolicyStatus 参数指向的 CERT_CHAIN_POLICY_STATUS 结构的 pvExtraPolicyStatus 成员必须指向 SSL_F12_EXTRA_CERT_CHAIN_POLICY_STATUS,该成员使用弱加密和根程序合规性检查的结果进行更新。

在调用之前,pPolicyStatus 参数指向的 CERT_CHAIN_POLICY_STATUS 结构的 cbSize 成员必须设置为大于或等于 size of (SSL_F12_EXTRA_CERT_CHAIN_POLICY_STATUS) 的值。

pPolicyStatus 参数指向的 CERT_CHAIN_POLICY_STATUS 结构中的 dwError 成员将设置为潜在弱加密的 TRUST_E_CERT_SIGNATURE,并设置为不符合 Microsoft 根计划的第三方根的 CERT_E_UNTRUSTEDROOT

Windows 10版本 1607、Windows Server 2016、Windows 10、版本 1511(带 KB3172985)Windows 10 RTM(带 KB3163912、Windows 8.1 和 Windows Server 2012 R2 KB3163912)以及 Windows 7 SP1 和 Windows Server 2008 R2 SP1(带 KB3161029

[in] pChainContext

指向包含要验证 的链的CERT_CHAIN_CONTEXT 结构的指针。

[in] pPolicyPara

指向 CERT_CHAIN_POLICY_PARA 结构的指针,该结构为链提供策略验证条件。 可以将该结构的 dwFlags 成员设置为更改默认策略检查行为。

此外,还可以在 结构的 pvExtraPolicyPara 成员中传递特定于策略的参数。

[in, out] pPolicyStatus

指向 CERT_CHAIN_POLICY_STATUS 结构的指针,其中返回链上的状态信息。 可以在此结构的 pvExtraPolicyStatus 成员中返回特定于 OID 的额外状态。

返回值

返回值指示函数是否能够为策略检查,它并不指示策略检查失败或已通过。

如果可以为指定策略验证链,则返回 TRUE 并更新 pPolicyStatusdwError 成员。 dwError 为 0 (ERROR_SUCCESS 或 S_OK) 表示链满足指定的策略。

如果无法验证链,则返回值为 TRUE ,并且需要验证 pPolicyStatus 参数是否存在实际错误。

值为 FALSE 表示函数无法为策略检查。

注解

pPolicyStatus 指向的 CERT_CHAIN_POLICY_STATUS 结构的 dwError 成员可以应用于单个链元素、简单链或整个链上下文。 如果 dwError 应用于整个链上下文,则 lChainIndexCERT_CHAIN_POLICY_STATUS 结构的 lElementIndex 成员都设置为 –1。 如果 dwError 应用于完整的简单链, 则 lElementIndex 设置为 –1, lChainIndex 设置为具有错误的第一个链的索引。 如果 dwError 应用于单个证书元素, 则 lChainIndexlElementIndex 将索引包含错误的第一个证书。

若要获取证书元素,请使用以下语法:

pChainContext->rgpChain[lChainIndex]->rgpElement[lElementIndex];

使用 CertGetCertificateChain 函数启用并执行证书吊销检查。 如果证书链中的证书被吊销,则 CertVerifyCertificateChainPolicy 函数不会检查。

要求

   
最低受支持的客户端 Windows XP [桌面应用 | UWP 应用]
最低受支持的服务器 Windows Server 2003 [桌面应用 | UWP 应用]
目标平台 Windows
标头 wincrypt.h
Library Crypt32.lib
DLL Crypt32.dll

另请参阅

AUTHENTICODE_EXTRA_CERT_CHAIN_POLICY_PARA

AUTHENTICODE_EXTRA_CERT_CHAIN_POLICY_STATUS

AUTHENTICODE_TS_EXTRA_CERT_CHAIN_POLICY_PARA

CERT_CHAIN_CONTEXT

CERT_CHAIN_POLICY_PARA

CERT_CHAIN_POLICY_STATUS

CertGetCertificateChain

证书链验证函数