CryptQueryObject 函数 (wincrypt.h)

重要 此 API 已弃用。 新的和现有的软件应开始使用 加密下一代 API。 Microsoft 可能会在将来的版本中删除此 API。
 
CryptQueryObject 函数检索有关加密 API 对象内容的信息,例如证书证书吊销列表证书信任列表。 对象可以驻留在内存中的结构中,也可以包含在文件中。

语法

BOOL CryptQueryObject(
  [in]  DWORD      dwObjectType,
  [in]  const void *pvObject,
  [in]  DWORD      dwExpectedContentTypeFlags,
  [in]  DWORD      dwExpectedFormatTypeFlags,
  [in]  DWORD      dwFlags,
  [out] DWORD      *pdwMsgAndCertEncodingType,
  [out] DWORD      *pdwContentType,
  [out] DWORD      *pdwFormatType,
  [out] HCERTSTORE *phCertStore,
  [out] HCRYPTMSG  *phMsg,
  [out] const void **ppvContext
);

参数

[in] dwObjectType

指示要查询的对象的类型。 这必须是以下值之一。

含义
CERT_QUERY_OBJECT_BLOB
对象存储在内存中的 结构中。
CERT_QUERY_OBJECT_FILE
对象存储在 文件中。

[in] pvObject

指向要查询的 对象的指针。 数据指针的类型取决于 dwObjectType 参数的内容。

dwObjectType 含义
CERT_QUERY_OBJECT_BLOB
此参数是指向包含要查询对象的 CERT_BLOB或类似结构的指针。
CERT_QUERY_OBJECT_FILE
此参数是指向以 null 结尾的 Unicode 字符串的指针,该字符串包含要查询的文件的路径和名称。

[in] dwExpectedContentTypeFlags

指示预期的内容类型。 这可以是以下值之一。

含义
CERT_QUERY_CONTENT_FLAG_ALL
内容可以是任意类型。 这不包括 CERT_QUERY_CONTENT_FLAG_PFX_AND_LOAD 标志。

如果指定了此标志,此函数将尝试获取有关对象的信息,尝试不同的内容类型,直到找到正确的内容类型或内容类型已用尽。 这显然效率低下,因此仅当内容类型未知时,才应使用此标志。

CERT_QUERY_CONTENT_FLAG_CERT
内容是单个证书。
CERT_QUERY_CONTENT_FLAG_CERT_PAIR
内容是 抽象语法表示法 One (ASN.1) 编码X509_CERT_PAIR (包含正向、反向或正向和反向交叉证书) 的编码证书对。
CERT_QUERY_CONTENT_FLAG_CRL
内容是单个 CRL。
CERT_QUERY_CONTENT_FLAG_CTL
内容是单个 CTL。
CERT_QUERY_CONTENT_FLAG_PFX
内容是 PFX (PKCS #12) 数据包,但此函数不会加载它。 可以使用 PFXImportCertStore 函数将其加载到存储中。
CERT_QUERY_CONTENT_FLAG_PFX_AND_LOAD
内容是 PFX (PKCS #12) 数据包,此函数将根据以下说明中指定的条件加载。
注意  

如果 PFX 数据包包含的嵌入密码不是空字符串或 NULL,并且密码未受到 Active Directory (AD) 主体(包括调用用户)的保护,则此函数将无法解密 PFX 数据包。 但是,如果创建 PFX 数据包时使用的密码已加密给 AD 主体,并且用户作为该主体的一部分有权解密密码,则可以解密该数据包。 有关详细信息,请参阅 pvPara 参数和 PFXExportCertStoreEx 函数的 PKCS12_PROTECT_TO_DOMAIN_SIDS 标志。

可以从Windows 8和Windows Server 2012开始保护 AD 主体的 PFX 密码。

 
Windows Server 2003 和 Windows XP: 不支持此值。
CERT_QUERY_CONTENT_FLAG_PKCS7_SIGNED
内容是 PKCS #7 签名的消息。
CERT_QUERY_CONTENT_FLAG_PKCS7_SIGNED_EMBED
内容是嵌入的 PKCS #7 签名消息。
CERT_QUERY_CONTENT_FLAG_PKCS7_UNSIGNED
内容是 PKCS #7 未签名的消息。
CERT_QUERY_CONTENT_FLAG_PKCS10
内容是 PKCS #10 消息。
CERT_QUERY_CONTENT_FLAG_SERIALIZED_CERT
内容是序列化的单个证书。
CERT_QUERY_CONTENT_FLAG_SERIALIZED_CRL
内容是序列化的单个 CRL。
CERT_QUERY_CONTENT_FLAG_SERIALIZED_CTL
内容序列化为单个 CTL。
CERT_QUERY_CONTENT_FLAG_SERIALIZED_STORE
内容是序列化存储区。

[in] dwExpectedFormatTypeFlags

指示返回类型的预期格式。 这可以是以下值之一。

含义
CERT_QUERY_FORMAT_FLAG_ALL
可以采用任何格式返回内容。
CERT_QUERY_FORMAT_FLAG_ASN_ASCII_HEX_ENCODED
内容应以带有“{ASN}”前缀的 ASCII 十六进制编码格式返回。
CERT_QUERY_FORMAT_FLAG_BASE64_ENCODED
内容应以 Base64 编码格式返回。
CERT_QUERY_FORMAT_FLAG_BINARY
内容应以二进制格式返回。

[in] dwFlags

此参数保留供将来使用,必须设置为零。

[out] pdwMsgAndCertEncodingType

指向接收消息中使用的编码类型的 DWORD 值的指针。 如果不需要此信息,请将此参数设置为 NULL

此参数可以接收以下一个或多个值的组合。

含义
PKCS_7_ASN_ENCODING
65536 (0x10000)
指定 PKCS 7 消息编码。
X509_ASN_ENCODING
1 (0x1)
指定 X.509 证书编码。

[out] pdwContentType

指向接收内容的实际类型的 DWORD 值的指针。 如果不需要此信息,请将此参数设置为 NULL。 返回的内容类型可以是以下值之一。

含义
CERT_QUERY_CONTENT_CERT
内容是单个证书。
CERT_QUERY_CONTENT_CERT_PAIR
内容是 ASN.1 编码X509_CERT_pair。
CERT_QUERY_CONTENT_CRL
内容是单个 CRL。
CERT_QUERY_CONTENT_CTL
内容是单个 CTL。
CERT_QUERY_CONTENT_PFX
内容是 PFX (PKCS #12) 数据包。 此函数仅验证对象是否为 PKCS #12 数据包。 PKCS #12 数据包未加载到证书存储中。
CERT_QUERY_CONTENT_PFX_AND_LOAD
内容是 PFX (PKCS #12) 数据包,并且已加载到证书存储中。

Windows Server 2003 和 Windows XP: 不支持此值。

CERT_QUERY_CONTENT_PKCS7_SIGNED
内容是 PKCS #7 签名的消息。
CERT_QUERY_CONTENT_PKCS7_SIGNED_EMBED
内容是嵌入的 PKCS #7 签名消息。
CERT_QUERY_CONTENT_PKCS7_UNSIGNED
内容是 PKCS #7 未签名消息。
CERT_QUERY_CONTENT_PKCS10
内容是 PKCS #10 消息。
CERT_QUERY_CONTENT_SERIALIZED_CERT
内容是序列化的单个证书。
CERT_QUERY_CONTENT_SERIALIZED_CRL
内容是序列化的单个 CRL。
CERT_QUERY_CONTENT_SERIALIZED_CTL
内容是序列化的单个 CTL。
CERT_QUERY_CONTENT_SERIALIZED_STORE
内容是序列化存储。

[out] pdwFormatType

指向接收内容的实际格式类型的 DWORD 值的指针。 如果不需要此信息,请将此参数设置为 NULL。 返回的格式类型可以是以下值之一。

含义
CERT_QUERY_FORMAT_ASN_ASCII_HEX_ENCODED
内容采用 ASCII 十六进制编码格式,前缀为“{ASN}”。
CERT_QUERY_FORMAT_BASE64_ENCODED
内容采用 Base64 编码格式。
CERT_QUERY_FORMAT_BINARY
内容采用二进制格式。

[out] phCertStore

指向 HCERTSTORE 值的指针,该值接收包含 对象中所有证书、CRL 和 CTL 的证书存储的句柄。

仅当 dwContentType 参数收到以下值之一时,此参数才会接收证书存储句柄。 此参数接收所有其他内容类型的 NULL

CERT_QUERY_CONTENT_CERT

CERT_QUERY_CONTENT_CRL

CERT_QUERY_CONTENT_CTL

CERT_QUERY_CONTENT_PFX_AND_LOAD

CERT_QUERY_CONTENT_PKCS7_SIGNED

CERT_QUERY_CONTENT_PKCS7_SIGNED_EMBED

CERT_QUERY_CONTENT_SERIALIZED_CERT

CERT_QUERY_CONTENT_SERIALIZED_CRL

CERT_QUERY_CONTENT_SERIALIZED_CTL

CERT_QUERY_CONTENT_SERIALIZED_STORE

使用完句柄后,通过将句柄传递给 CertCloseStore 函数来释放它。

如果不需要此信息,请将此参数设置为 NULL

[out] phMsg

指向接收打开的消息句柄的 HCRYPTMSG 值的指针。

仅当 dwContentType 参数收到以下值之一时,此参数才会接收消息句柄。 此参数接收所有其他内容类型的 NULL

CERT_QUERY_CONTENT_PKCS7_SIGNED

CERT_QUERY_CONTENT_PKCS7_SIGNED_EMBED

CERT_QUERY_CONTENT_PKCS7_UNSIGNED

使用完句柄后,通过将句柄传递给 CryptMsgClose 函数来释放它。

如果不需要此信息,请将此参数设置为 NULL

[out] ppvContext

指向接收有关对象的其他信息的指针的指针。

此数据的格式取决于 dwContentType 参数接收的值。 下表列出了指定 dwContentType 值的数据格式。

dwContentType 含义
CERT_QUERY_CONTENT_CERT
此参数接收指向 CERT_CONTEXT 结构的指针。 使用完 结构后,通过将此指针传递到 CertFreeCertificateContext 函数来释放它。
CERT_QUERY_CONTENT_CRL
此参数接收指向 CRL_CONTEXT 结构的指针。 使用完 结构后,通过将此指针传递给 CertFreeCRLContext 函数来释放它。
CERT_QUERY_CONTENT_CTL
此参数接收指向 CTL_CONTEXT 结构的指针。 使用完 结构后,通过将此指针传递给 CertFreeCTLContext 函数来释放它。
CERT_QUERY_CONTENT_SERIALIZED_CERT
此参数接收指向 CERT_CONTEXT 结构的指针。 使用完 结构后,通过将此指针传递到 CertFreeCertificateContext 函数来释放它。
CERT_QUERY_CONTENT_SERIALIZED_CRL
此参数接收指向 CRL_CONTEXT 结构的指针。 使用完 结构后,通过将此指针传递给 CertFreeCRLContext 函数来释放它。
CERT_QUERY_CONTENT_SERIALIZED_CTL
此参数接收指向 CTL_CONTEXT 结构的指针。 使用完 结构后,通过将此指针传递给 CertFreeCTLContext 函数来释放它。
 

如果不需要此信息,请将此参数设置为 NULL

返回值

如果函数成功,该函数将返回非零值。

如果函数失败,则返回零。 有关扩展的错误信息,请调用 GetLastError

要求

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

另请参阅

数据管理函数