CertVerifyCTLUsage 函数 (wincrypt.h)

CertVerifyCTLUsage 函数通过查找签名且时间有效的证书信任列表 (CTL) 包含该使用者的使用标识符来验证使用者是否为指定用途所信任。 证书的使用者可以通过其 证书上下文 或任何唯一标识符(如使用者证书的 SHA1 哈希 )来标识。

语法

BOOL CertVerifyCTLUsage(
  [in]           DWORD                    dwEncodingType,
  [in]           DWORD                    dwSubjectType,
  [in]           void                     *pvSubject,
  [in]           PCTL_USAGE               pSubjectUsage,
  [in]           DWORD                    dwFlags,
  [in, optional] PCTL_VERIFY_USAGE_PARA   pVerifyUsagePara,
  [in, out]      PCTL_VERIFY_USAGE_STATUS pVerifyUsageStatus
);

参数

[in] dwEncodingType

指定使用的编码类型。 目前,仅使用X509_ASN_ENCODING和PKCS_7_ASN_ENCODING:但是,将来可以添加其他编码类型。 对于当前编码类型之一,请使用

X509_ASN_ENCODING |PKCS_7_ASN_ENCODING。

[in] dwSubjectType

如果 dwSubjectType 参数设置为 CTL_CERT_SUBJECT_TYPE, 则 pvSubject 指向 CERT_CONTEXT 结构。 检查结构的 SubjectAlgorithm 成员以确定主体标识的表示形式。 最初,仅支持 SHA1 和 MD5 哈希作为 SubjectAlgorithm 的值。 从 CERT_CONTEXT 结构获取相应的哈希属性。

如果 dwSubjectType 参数设置为 CTL_ANY_SUBJECT_TYPE, 则 pvSubject 指向 CTL_ANY_SUBJECT_INFO 结构。 此结构的 SubjectAlgorithm 成员必须与 CTL 的算法类型匹配, SubjectIdentifier 成员必须与其中一个 CTL 条目匹配。

如果 dwSubjectType 设置为上述值之一,则不使用 dwEncodingType

[in] pvSubject

dwSubjectType 参数结合使用的值。

[in] pSubjectUsage

指向 CTL_USAGE 结构的指针,用于指定主题的预期用法。

[in] dwFlags

如果未设置CERT_VERIFY_INHIBIT_CTL_UPDATE_FLAG,则可以替换其时间在 CTL_VERIFY_USAGE_PARA中 rghCtlStore 指定的某个存储区中不再有效的 CTL。 替换后,CERT_VERIFY_UPDATED_CTL_FLAG在 pVerifyUsageStatusdwFlags 成员中设置。 如果设置了此标志,则不会进行更新,即使收到存储区中且时间不再有效的 CTL 的有效更新 CTL。

如果设置了CERT_VERIFY_TRUSTED_SIGNERS_FLAG,则仅搜索CTL_VERIFY_USAGE_PARArghSignerStore 指定的签名者存储以查找签名者。 否则,签名者存储会提供其他源来查找签名者的证书。 有关详细信息,请参阅“备注”。

如果设置了CERT_VERIFY_NO_TIME_CHECK_FLAG,则不会检查 CTL 的时间有效性。 否则,它们为 。

如果设置了CERT_VERIFY_ALLOW_MORE_USAGE_FLAG,CTL 除了 pSubjectUsage 指定的标识符外,还可以包含使用标识符。 否则,找到的 CTL 将不包含其他用法标识符。

[in, optional] pVerifyUsagePara

指向 CTL_VERIFY_USAGE_PARA 结构的指针,该结构指定要搜索以查找 CTL 的存储以及包含可接受的 CTL 签名者的存储。 设置 ListIdentifier 成员会进一步限制搜索。

[in, out] pVerifyUsageStatus

指向 CTL_VERIFY_USAGE_STATUS 结构的指针。 结构的 cbSize 成员必须设置为结构的大小(以字节为单位),并且所有其他字段必须在调用 CertVerifyCTLUsage 之前设置为零。 有关详细信息,请参阅 CTL_VERIFY_USAGE_STATUS

返回值

如果使用者对指定的用法受信任,则返回 TRUE 。 否则,返回 FALSEGetLastError 可以返回以下错误代码之一。

说明
CRYPT_E_NO_VERIFY_USAGE_DLL
找不到 DLL 或导出的函数来验证使用者使用情况。
CRYPT_E_NO_VERIFY_USAGE_CHECK
调用的函数无法对主题执行使用检查。
CRYPT_E_VERIFY_USAGE_OFFLINE
服务器处于脱机状态;因此,调用的 函数无法完成检查的使用。
CRYPT_E_NOT_IN_CTL
在 CTL 中找不到该主题。
CRYPT_E_NO_TRUSTED_SIGNER
找不到受信任的签名者来验证消息或信任列表的签名。
 

pVerifyUsageStatus 指向的CTL_VERIFY_USAGE_PARAdwError 成员设置为相同的错误代码。

注解

CertVerifyCTLUsage 是函数的调度程序,可以使用 对象标识符 (OID) 进行安装。 首先,它会尝试查找与 pSubjectUsage 指向的 CLT_USAGE 结构中的第一个使用对象标识符匹配的 OID 函数。 如果此操作失败,它将使用默认 的 CertDllVerifyCTLUsage 函数。

可以使用 OID 安装 Cryptnet.dll 中的 CertDllVerifyCTLUsage 函数;它具有以下属性:

  • 如果 CTL 存储由 pVerifyUsagePara 中的 rghCtlStore 指定,则仅搜索这些存储以查找 CTL。 否则,将搜索信任系统存储以查找 CTL。
  • 如果设置了CERT_VERIFY_TRUSTED_SIGNERS_FLAG,则仅搜索 pVerifyUsagePararghSignerStore 指定的签名者存储,以查找与签名者颁发者和序列号相对应的证书。 否则,将搜索 CTL 消息的存储、pVerifyUsagePararghSignerStore 指定的签名者存储、信任系统存储、CA 系统存储、ROOT 和软件发布者证书 (SPC) 系统存储以查找签名者的证书。 在任一情况下,找到的证书中的公钥都用于验证 CTL 的签名。
  • 如果 CTL 具有一组 NextUpdate 成员,并且未设置CERT_VERIFY_NO_TIME_CHECK,则会验证其时间有效性。
  • 如果从存储中获取的 CTL 的时间无效,则尝试获取时间有效的版本。 CertDllVerifyCTLUsage 函数使用 CTL 的 NextUpdateLocation 属性或 NextUpdateLocation 扩展,或者搜索签名者的信息以获取 NextUpdateLocation 属性。

要求

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

另请参阅

CTL_VERIFY_USAGE_PARA

CTL_VERIFY_USAGE_STATUS

CertFindCTLInStore

CertFindSubjectInCTL

使用 CTL 的验证函数