CertGetIssuerCertificateFromStore 函数 (wincrypt.h)

CertGetIssuerCertificateFromStore 函数从指定使用者证书的第一个或下一个颁发者的证书存储中检索证书上下文。 建议使用新的 证书链验证函数 ,而不是使用此函数。

语法

PCCERT_CONTEXT CertGetIssuerCertificateFromStore(
  [in]           HCERTSTORE     hCertStore,
  [in]           PCCERT_CONTEXT pSubjectContext,
  [in, optional] PCCERT_CONTEXT pPrevIssuerContext,
  [in, out]      DWORD          *pdwFlags
);

参数

[in] hCertStore

证书存储的句柄。

[in] pSubjectContext

指向包含主题信息的 CERT_CONTEXT 结构的指针。 此参数可以从任何证书存储中获取,也可以由调用应用程序使用 CertCreateCertificateContext 函数创建。

[in, optional] pPrevIssuerContext

指向包含颁发者信息的 CERT_CONTEXT 结构的指针。 颁发者可以有多个证书,尤其是在有效期即将更改时。 若要获取第一个颁发者证书,调用时此参数必须为 NULL 。 若要获取颁发者的下一个证书,请将 pPrevIssuerContext 设置为上一次调用返回的 CERT_CONTEXT 结构。

此函数释放由此参数的非 NULL 值引用的CERT_CONTEXT

[in, out] pdwFlags

以下标志对返回的证书启用验证检查。 可以使用按位 OR 操作将它们组合在一起,以启用多个验证。

含义
CERT_STORE_NO_CRL_FLAG
指示找不到匹配的 CRL。
CERT_STORE_NO_ISSUER_FLAG
指示找不到颁发者证书。
CERT_STORE_REVOCATION_FLAG
检查使用者证书是否在颁发者的吊销列表中。
CERT_STORE_SIGNATURE_FLAG
使用颁发者证书中的公钥来验证使用者证书上的签名。
CERT_STORE_TIME_VALIDITY_FLAG
获取当前时间,并验证它是否在使用者证书的有效期内。
 

如果已启用类型的验证检查成功,则其标志设置为零。 如果失败,其标志在返回时保持设置。 对于CERT_STORE_REVOCATION_FLAG,如果函数找不到与使用者证书相关的 CRL,则验证成功。

如果设置了CERT_STORE_REVOCATION_FLAG,并且颁发者在存储中没有 CRL,则设置CERT_STORE_NO_CRL_FLAG,CERT_STORE_REVOCATION_FLAG保持设置。

如果设置了CERT_STORE_SIGNATURE_FLAG或CERT_STORE_REVOCATION_FLAG,则如果函数在存储区中找不到颁发者证书,则设置CERT_STORE_NO_ISSUER_FLAG。 有关更多详细信息,请参阅“备注”。

如果验证检查失败,仍返回指向颁发者的CERT_CONTEXT的指针,并且不会更新 GetLastError

返回值

如果函数成功,则返回值是指向只读颁发者的指针 CERT_CONTEXT

如果函数失败并且找不到第一个或下一个颁发者证书,则返回值为 NULL

只能通过调用 CertFreeCertificateContext 来释放最后返回CERT_CONTEXT结构。 当对函数的一次调用返回 CERT_CONTEXT 作为 pPrevIssuerContext 参数在后续调用中提供时,上下文将作为函数操作的一部分释放。

有关扩展的错误信息,请调用 GetLastError。 一些可能的错误代码随之而来。

返回代码 说明
CRYPT_E_NOT_FOUND
找不到使用者证书的颁发者。
CRYPT_E_SELF_SIGNED
颁发者证书与使用者证书相同。 它是自签名 根证书
E_INVALIDARG
hCertStore 参数中的句柄与 pPrevIssuerContext 参数指向的证书上下文的句柄不同,或者在 pdwFlags 中设置了不受支持的标志。

注解

在后续调用函数时,当作为 pPrevIssuerContext 参数传递时,将释放返回的指针。 否则,必须通过调用 CertFreeCertificateContext 显式释放指针。 CertGetIssuerCertificateFromStore 始终使用调用 CertFreeCertificateContext 释放非 NULLpPrevIssuerContext即使函数中存在错误也是如此。

可以调用 CertDuplicateCertificateContext 来复制颁发者证书。

可以使用按位 OR 操作组合 dwFlags 的十六进制值来启用多个验证。 例如,若要启用签名和时间有效性,0x00000003值在输入时传入 dwFlags 。 在这种情况下,如果CERT_STORE_SIGNATURE_FLAG验证成功,但CERT_STORE_TIME_VALIDITY_FLAG验证失败, dwFlags 将在输出时返回为0x00000002。

要求

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

另请参阅

证书函数