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
实现基链策略验证检查。 dwFlagspPolicyPara 指向的结构的成员可以设置为更改默认策略检查行为。
CERT_CHAIN_POLICY_AUTHENTICODE
(LPCSTR) 2
实现 Authenticode 链策略验证检查。 pvExtraPolicyParapPolicyPara 指向的结构的成员可以设置为指向 AUTHENTICODE_EXTRA_CERT_CHAIN_POLICY_PARA 结构。

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

pvExtraPolicyStatuspPolicyStatus 指向的数据结构的成员未使用,必须设置为 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_CONSTRAINTSszOID_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 身份验证链策略,该策略按以下顺序由三个不同的链验证组成:

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

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

dwFlagspPolicyPara 参数指向的 CERT_CHAIN_POLICY_PARA 结构的成员可以包含 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
检查链中的任何证书是否具有弱加密或第三方根证书符合性并提供错误字符串。 pvExtraPolicyStatuspPolicyStatus 参数指向的CERT_CHAIN_POLICY_STATUS结构的成员必须指向 SSL_F12_EXTRA_CERT_CHAIN_POLICY_STATUS,该参数通过弱加密和根程序符合性检查的结果进行更新。

在调用之前,pPolicyStatus 参数指向的CERT_CHAIN_POLICY_STATUS结构的 cbSize 成员必须设置为大于或等于 sizeof(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、具有 KB3163912 的 Windows 10 RTM、Windows 8.1 和带有 KB3163912 的 Windows Server 2012 R2,以及具有 SP1 和 Windows Server 2008 R2 SP1 的 Windows 7 以及具有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 成员。 0ERROR_SUCCESSS_OK)的 dwError 表示链满足指定的策略。

如果无法验证链,则返回值 TRUE,需要验证实际错误的 pPolicyStatus 参数。

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

言论

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

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

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

使用 CertGetCertificateChain 函数启用和执行证书吊销检查。 CertVerifyCertificateChainPolicy 函数不会检查证书链中的证书是否已吊销。

要求

要求 价值
最低支持的客户端 Windows XP [桌面应用 |UWP 应用]
支持的最低服务器 Windows Server 2003 [桌面应用 |UWP 应用]
目标平台 窗户
标头 wincrypt.h
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

证书链验证函数