CryptVerifyCertificateSignatureEx 函数 (wincrypt.h)

CryptVerifyCertificateSignatureEx 函数使用颁发者的公钥验证使用者证书、证书吊销列表证书请求或 keygen 请求的签名。 函数不需要访问 私钥

语法

BOOL CryptVerifyCertificateSignatureEx(
  [in]                HCRYPTPROV_LEGACY hCryptProv,
  [in]                DWORD             dwCertEncodingType,
  [in]                DWORD             dwSubjectType,
  [in]                void              *pvSubject,
  [in]                DWORD             dwIssuerType,
  [in]                void              *pvIssuer,
  [in]                DWORD             dwFlags,
  [in, out, optional] void              *pvExtra
);

参数

[in] hCryptProv

此参数未使用,应设置为 NULL

Windows Server 2003 和 Windows XP: 用于验证签名的 加密服务提供程序 的句柄。此参数的数据类型为 HCRYPTPROV

除非有充分的理由传入特定的加密提供程序,否则将传递 NULL。 传入 NULL 会导致获取默认 RSA 或 DSS 提供程序。

[in] dwCertEncodingType

用于加密使用者的 证书编码类型 。 此函数将忽略包含在此值的高 WORD 中的消息编码类型标识符。

此参数可以是以下当前定义的证书编码类型。

含义
X509_ASN_ENCODING
1 (0x1)
指定 X.509 证书编码。

[in] dwSubjectType

主题类型。 此参数可以是以下主题类型之一。

含义
CRYPT_VERIFY_CERT_SIGN_SUBJECT_BLOB
1 (0x1)
pvSubject 是指向 CRYPT_DATA_BLOB 结构的指针。
CRYPT_VERIFY_CERT_SIGN_SUBJECT_CERT
2 (0x2)
pvSubject 是指向 CCERT_CONTEXT 结构的指针。
CRYPT_VERIFY_CERT_SIGN_SUBJECT_CRL
3 (0x3)
pvSubject 是指向 CCRL_CONTEXT 结构的指针。
CRYPT_VERIFY_CERT_SIGN_SUBJECT_OCSP_BASIC_SIGNED_RESPONSE
4 (0x4)
pvSubject 是指向 OCSP_BASIC_SIGNED_RESPONSE_INFO 结构的指针。

Windows Server 2003 和 Windows XP: 不支持此主题类型。

[in] pvSubject

指向由 dwSubjectType 指示的类型的结构的指针,该类型包含要验证的签名。

[in] dwIssuerType

颁发者类型。 此参数可以是以下颁发者类型之一。

含义
CRYPT_VERIFY_CERT_SIGN_ISSUER_PUBKEY
1 (0x1)
pvIssuer 是指向 CERT_PUBLIC_KEY_INFO 结构的指针。
CRYPT_VERIFY_CERT_SIGN_ISSUER_CERT
2 (0x2)
pvIssuer 是指向 CCERT_CONTEXT 结构的指针。
CRYPT_VERIFY_CERT_SIGN_ISSUER_CHAIN
3 (0x3)
pvIssuer 是指向 CCERT_CHAIN_CONTEXT 结构的指针。
CRYPT_VERIFY_CERT_SIGN_ISSUER_NULL
4 (0x4)
pvIssuer 必须为 NULL
 
注意 如果 dwIssuerTypeCRYPT_VERIFY_CERT_SIGN_ISSUER_NULL 并且签名算法是哈希算法,则签名应仅包含未加密的哈希八进制数。 在此非加密签名事例中只能指定 CRYPT_VERIFY_CERT_SIGN_ISSUER_NULL 。 如果指定了任何其他 dwIssuerType ,验证将失败, GetLastError 将返回E_INVALIDARG。
 

[in] pvIssuer

指向 由 dwIssuerType 的值指示的类型结构的指针。 结构包含对验证签名所需的公钥的访问权限。

[in] dwFlags

修改函数行为的标志。 这可以是零,也可以是以下值的按位 OR

含义
CRYPT_VERIFY_CERT_SIGN_DISABLE_MD2_MD4_FLAG
0x00000001
如果设置了此标志,并且 CryptVerifyCertificateSignatureEx 检测到 MD2 或 MD4 算法,则函数返回 FALSE 并将 GetLastError 设置为 NTE_BAD_ALGID。 签名仍会得到验证,但这种错误组合使调用方(现在知道使用了 MD2 或 MD4 算法)能够决定是信任还是拒绝签名。

Windows 8 和 Windows Server 2012: 开始支持此标志。

CRYPT_VERIFY_CERT_SIGN_SET_STRONG_PROPERTIES_FLAG
0x00000002
成功验证后,针对 pvSubject 参数指向的主题设置强签名属性。

在证书上下文中设置以下属性:

  • CERT_SIGN_HASH_CNG_ALG_PROP_ID
在 CRL 上下文中设置以下属性:
  • CERT_SIGN_HASH_CNG_ALG_PROP_ID
  • CERT_ISSUER_PUB_KEY_BIT_LENGTH_PROP_ID
注意仅当在 dwSubjectType 参数中指定了 CRYPT_VERIFY_CERT_SIGN_SUBJECT_CRL 时,此标志才适用。
 
Windows 8 和 Windows Server 2012: 开始支持此标志。
CRYPT_VERIFY_CERT_SIGN_RETURN_STRONG_PROPERTIES_FLAG
0x00000004
返回指向 pvExtra 参数中CRYPT_VERIFY_CERT_SIGN_STRONG_PROPERTIES_INFO结构的指针。 结构包含公钥的长度(以位为单位)以及所使用的签名和哈希算法的名称。

必须调用 CryptMemFree 才能释放结构。 如果无法为 CRYPT_VERIFY_CERT_SIGN_STRONG_PROPERTIES_INFO 结构分配内存,此函数将成功返回,但将 pvExtra 参数设置为 NULL

注意仅当在 dwSubjectType 参数中指定了 CRYPT_VERIFY_CERT_SIGN_SUBJECT_OCSP_BASIC_SIGNED_RESPONSE 时,此标志才适用。
 
Windows 8 和 Windows Server 2012: 开始支持此标志。

[in, out, optional] pvExtra

如果 dwFlags 参数设置为 CRYPT_VERIFY_CERT_SIGN_RETURN_STRONG_PROPERTIES_FLAG,则指向 CRYPT_VERIFY_CERT_SIGN_STRONG_PROPERTIES_INFO 结构的指针。

必须调用 CryptMemFree 才能释放结构。

返回值

如果成功,则返回非零值,否则返回零。

有关扩展的错误信息,请调用 GetLastError

注意 来自调用函数 CryptCreateHashCryptImportKeyCryptVerifySignatureCryptHashData 的错误 可能会传播到此函数。
 
如果失败,此函数将导致从 GetLastError 返回以下错误代码。
返回代码 说明
ERROR_FILE_NOT_FOUND
证书编码类型无效。 目前仅支持 X509_ASN_ENCODING
NTE_BAD_ALGID
签名算法的对象 标识符 (OID) 不映射到已知或支持的 哈希 算法。
NTE_BAD_SIGNATURE
签名无效。
 

如果函数失败, GetLastError 可能会返回 抽象语法表示法 One (ASN.1) 编码/解码错误。 有关这些错误的信息,请参阅 ASN.1 编码/解码返回值

注解

使用者缓冲区可以包含已编码 的 BLOB 或证书或 CRL 的上下文。 对于 证书上下文,如果缺少证书的公钥参数,并且这些参数可以从证书的颁发者继承,例如从 DSS 公钥参数继承,则上下文的 CERT_PUBKEY_ALG_PARA_PROP_ID 属性将更新为颁发者的公钥算法参数,以获取有效的签名。

要求

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

另请参阅

CryptVerifyCertificateSignature