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在 pVerifyUsageStatus 的 dwFlags 成员中设置。 如果设置了此标志,则不会进行更新,即使收到存储区中且时间不再有效的 CTL 的有效更新 CTL。
如果设置了CERT_VERIFY_TRUSTED_SIGNERS_FLAG,则仅搜索CTL_VERIFY_USAGE_PARA中 rghSignerStore 指定的签名者存储以查找签名者。 否则,签名者存储会提供其他源来查找签名者的证书。 有关详细信息,请参阅“备注”。
如果设置了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 。 否则,返回 FALSE 。 GetLastError 可以返回以下错误代码之一。
值 | 说明 |
---|---|
|
找不到 DLL 或导出的函数来验证使用者使用情况。 |
|
调用的函数无法对主题执行使用检查。 |
|
服务器处于脱机状态;因此,调用的 函数无法完成检查的使用。 |
|
在 CTL 中找不到该主题。 |
|
找不到受信任的签名者来验证消息或信任列表的签名。 |
pVerifyUsageStatus 指向的CTL_VERIFY_USAGE_PARA的 dwError 成员设置为相同的错误代码。
注解
CertVerifyCTLUsage 是函数的调度程序,可以使用 对象标识符 (OID) 进行安装。 首先,它会尝试查找与 pSubjectUsage 指向的 CLT_USAGE 结构中的第一个使用对象标识符匹配的 OID 函数。 如果此操作失败,它将使用默认 的 CertDllVerifyCTLUsage 函数。
可以使用 OID 安装 Cryptnet.dll 中的 CertDllVerifyCTLUsage 函数;它具有以下属性:
- 如果 CTL 存储由 pVerifyUsagePara 中的 rghCtlStore 指定,则仅搜索这些存储以查找 CTL。 否则,将搜索信任系统存储以查找 CTL。
- 如果设置了CERT_VERIFY_TRUSTED_SIGNERS_FLAG,则仅搜索 pVerifyUsagePara 中 rghSignerStore 指定的签名者存储,以查找与签名者颁发者和序列号相对应的证书。 否则,将搜索 CTL 消息的存储、pVerifyUsagePara 中 rghSignerStore 指定的签名者存储、信任系统存储、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 |