CertAddSerializedElementToStore 函数 (wincrypt.h)

CertAddSerializedElementToStore 函数将序列化证书、证书吊销列表 (CRL) 或证书信任列表 (CTL) 元素添加到存储中。 序列化元素包含编码的证书、CRL 或 CTL 及其扩展属性。 扩展属性与证书相关联,不是 证书颁发机构颁发的证书的一部分。 在非 Microsoft 平台上使用证书时,扩展属性在证书上不可用。

语法

BOOL CertAddSerializedElementToStore(
  [in]  HCERTSTORE hCertStore,
  [in]  const BYTE *pbElement,
  [in]  DWORD      cbElement,
  [in]  DWORD      dwAddDisposition,
  [in]  DWORD      dwFlags,
  [in]  DWORD      dwContextTypeFlags,
  [out] DWORD      *pdwContextType,
  [out] const void **ppvContext
);

参数

[in] hCertStore

将存储所创建 证书 的证书存储的句柄。 如果 hCertStoreNULL,则该函数会使用其扩展属性创建证书、CRL 或 CTL 上下文的副本,但证书、CRL 或 CTL 不会保留在任何存储中。

[in] pbElement

指向缓冲区的指针,该缓冲区包含要序列化并添加到证书存储的证书、CRL 或 CTL 信息。

[in] cbElement

pbElement 缓冲区的大小(以字节为单位)。

[in] dwAddDisposition

指定在存储中已存在证书、CRL 或 CTL 时要执行的操作。 下表显示了当前定义的处置值。

含义
CERT_STORE_ADD_NEW
如果证书、CRL 或 CTL 是新的,则会创建该证书并将其保存到存储中。 如果存储中已存在相同的证书、CRL 或 CTL,则操作失败。 最后一个错误代码设置为CRYPT_E_EXISTS。
CERT_STORE_ADD_USE_EXISTING
如果证书、CRL 或 CTL 是新的,则会将其添加到存储中。 如果已存在相同的证书、CRL 或 CTL,则使用现有元素。 如果 ppvContext 不为 NULL,则现有上下文将重复。 函数仅添加尚不存在的属性。 不会复制 SHA-1 和 MD5 哈希属性。
CERT_STORE_ADD_REPLACE_EXISTING
如果存储中已存在相同的证书、CRL 或 CTL,则会在创建新上下文之前删除现有证书、CRL 或 CTL 上下文。
CERT_STORE_ADD_ALWAYS
不进行检查来确定是否已存在相同的证书、CRL 或 CTL。 始终创建一个新元素。 这可能会导致存储中出现重复项。 若要确定该元素是否已存在于存储中,请调用 CertGetCRLFromStoreCertGetSubjectCertificateFromStore
CERT_STORE_ADD_NEWER
如果存在匹配的 CRL 或 CTL,或者存在指向匹配 CRL 或 CTL 的链接,则函数将比较 CRL 或 CTL 上的 NotBefore 时间。 如果现有 CRL 或 CTL 的 NotBefore 时间小于新元素上的 NotBefore 时间,则旧元素或链接将替换为CERT_STORE_ADD_REPLACE_EXISTING。 如果现有元素的 NotBefore 时间大于或等于要添加的元素上的 NotBefore 时间,则函数将失败,并返回CRYPT_E_EXISTS代码的 GetLastError

如果在存储中找不到匹配的 CRL 或 CTL,或者指向匹配的 CRL 或 CTL 的链接,则会向存储区添加新元素。

CERT_STORE_ADD_NEWER_INHERIT_PROPERTIES
操作与CERT_STORE_ADD_NEWER操作相同。 但是,如果替换了较旧的 CRL 或 CTL,则旧元素的属性将合并到替换中。
CERT_STORE_ADD_REPLACE_EXISTING_INHERIT_PROPERTIES
如果存储中存在匹配的证书,则会在创建和添加新上下文之前删除现有上下文。 新添加的上下文从现有证书继承属性。

[in] dwFlags

保留以供将来使用,必须为零。

[in] dwContextTypeFlags

具体说明可添加的上下文。 例如,若要添加证书、CRL 或 CTL,请将 dwContextTypeFlags 设置为 CERT_STORE_CERTIFICATE_CONTEXT_FLAGCERT_STORE_CRL_CONTEXT_FLAG

下表显示了当前定义的上下文类型标志。

含义
CERT_STORE_ALL_CONTEXT_FLAG
添加任何上下文。
CERT_STORE_CERTIFICATE_CONTEXT_FLAG
仅添加证书上下文。
CERT_STORE_CRL_CONTEXT_FLAG
仅添加 CRL 上下文。
CERT_STORE_CTL_CONTEXT_FLAG
仅添加 CTL 上下文。

[out] pdwContextType

指向已添加的序列化元素的上下文类型的指针。 这是一个可选参数,可以为 NULL,表示调用应用程序不需要 上下文 类型。

下表显示了当前定义的上下文类型。

含义
CERT_STORE_CERTIFICATE_CONTEXT
证书
CERT_STORE_CRL_CONTEXT
CRL
CERT_STORE_CTL_CONTEXT
CTL

[out] ppvContext

指向指向已解码证书、CRL 或 CTL 上下文的指针的指针。 这是一个可选参数,可以为 NULL,表示调用应用程序不需要已添加或现有证书、CRL 或 CTL 的上下文。

如果 ppvContext 不为 NULL,则它必须是指向 CERT_CONTEXTCRL_CONTEXTCTL_CONTEXT指针的地址。 当应用程序使用完上下文后,必须使用 CertFreeCertificateContext (用于证书)、使用 CertFreeCRLContext (用于 CRL)或 使用 CertFreeCTLContext (用于 CTL)来释放上下文。

返回值

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

如果函数失败,则返回零。 有关扩展的错误信息,请调用 GetLastError。 下面是一些可能的错误代码。

返回代码 说明
CRYPT_E_EXISTS
如果将 dwAddDisposition 参数设置为 CERT_STORE_ADD_NEW,则存储中已存在证书、CRL 或 CTL。
E_INVALIDARG
dwAddDisposition 参数中指定了无效的处置值。
 

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

要求

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

另请参阅

CertSerializeCRLStoreElement

CertSerializeCertificateStoreElement

证书和证书存储维护函数