IX509CertificateRequestPkcs7::InitializeFromCertificate 方法 (certenroll.h)

InitializeFromCertificate 方法使用现有证书初始化证书请求。 该证书包含在使用 可辨别编码规则 ( DER) 编码的字节数组中,如抽象语法表示法 One (ASN.1) 标准所定义。 DER 编码的字节数组由纯二进制序列或 Unicode 编码的字符串表示。

语法

HRESULT InitializeFromCertificate(
  [in] X509CertificateEnrollmentContext Context,
  [in] VARIANT_BOOL                     RenewalRequest,
  [in] BSTR                             strCertificate,
  [in] EncodingType                     Encoding,
  [in] X509RequestInheritOptions        InheritOptions
);

参数

[in] Context

一个 X509CertificateEnrollmentContext 枚举值,该值指定请求的证书是面向最终用户、计算机还是代表计算机的管理员。

[in] RenewalRequest

指示最终实体是否请求续订 strCertificate 参数标识的证书的VARIANT_BOOL

[in] strCertificate

包含 DER 编码证书的 BSTR 变量。

从 Windows 7 和 Windows Server 2008 R2 开始,可以指定证书指纹或序列号,而不是编码的证书。 这样做会导致函数在相应的本地存储中搜索匹配的证书。 请注意以下几点:

  • BSTR 必须是偶数个十六进制数字。
  • 忽略十六进制对之间的空格。
  • Encoding 参数必须设置为 XCN_CRYPT_STRING_HEXRAW
  • Context 参数确定是搜索本地存储还是计算机存储或同时搜索两者。
  • 如果需要私钥,则仅搜索个人和请求存储。
  • 如果不需要私钥,则还会搜索根和中间 CA 存储。

[in] Encoding

一个 EncodingType 枚举值,该值指定应用于 DER 编码证书的编码类型。 默认值为 XCN_CRYPT_STRING_BASE64

[in] InheritOptions

一个 X509RequestInheritOptions 枚举值,该值指定如何从现有证书创建证书请求对象。 可以通过选择以下值之一来指定如何继承密钥。 默认值为 InheritDefault

含义
InheritDefault
未指定提供程序和密钥继承。
InheritNewDefaultKey
创建新密钥,但继承默认加密提供程序。
InheritNewSimilarKey
创建新密钥,但继承用于创建现有证书的加密提供程序。
InheritPrivateKey
继承私钥和公钥。
InheritPublicKey
仅继承公钥。
 

还可以使用按位 AND 运算将键继承值与以下值的任意组合组合。

含义
InheritRenewalCertificateFlag
继承续订证书。 指定此标志将设置 ICertPropertyRenewal 值。
InheritTemplateFlag
继承证书模板。
InheritSubjectFlag
继承使用者可分辨名称。
InheritExtensionsFlag
从证书继承相关扩展。
InheritSubjectAltNameFlag
继承 SubjectAlternativeName 扩展。
InheritValidityPeriodFlag
继承有效期。
 

还可以指定 InheritNone ,以防止上表中的任何标志 (与键继承) 无关的标志默认实现。 如果指定 InheritNone, 但同时指定与键继承无关的标志,该方法将返回 E_INVALIDARG

如果将 InheritOptions 参数设置为零 (0) 或指定 InheritDefault 且未指定键继承值,则默认使用 InheritNewSimilarKey

如果将 InheritOptions 参数设置为零 (0) 或指定 InheritDefault 且未指定与键继承无关的任何值,则默认情况下会设置以下标志:

  • InheritSubjectFlag
  • InheritExtensionsFlag
  • InheritValidityPeriodFlag
  • 如果证书包含模板扩展) ,则 InheritTemplateFlag (
  • 如果客户端续订证书,则 InheritRenewalCertificateFlag ()

返回值

如果函数成功,该函数将返回 S_OK

如果函数失败,它将返回指示错误的 HRESULT 值。 可能的值包括(但并不限于)下表中的项。 有关常见错误代码的列表,请参阅 常见 HRESULT 值

返回代码 说明
ERROR_ALREADY_INITIALIZED
证书请求对象已初始化。

注解

InitializeFromCertificate 方法验证 InheritOptions 参数中指定的选项,并通过执行以下操作初始化新的 PKCS #7 请求对象:

  • 从证书、注册上下文创建 PKCS #10 请求对象,并在输入时指定继承选项。 PKCS #10 对象继承:
    • 如果原始证书中存在模板,则为模板,并设置 InheritTemplateFlag 值。
    • 如果指定 InheritSubjectFlag,则为使用者可分辨名称。
    • 如果指定 InheritSubjectAltNameFlag,则为使用者可选名称。
    • 如果指定 InheritExtensionsFlag,则为扩展。
  • 将原始证书(如果要续订)复制到新 PKCS #10 请求上的 RenewalCertificate 属性。
  • 从原始证书创建 ISignerCertificate (如果要续订),并在 SignerCertificate 属性上设置它。
  • 将 PKCS #10 请求设置为内部请求对象。

要求

要求
最低受支持的客户端 Windows Vista [仅限桌面应用]
最低受支持的服务器 Windows Server 2008 [仅限桌面应用]
目标平台 Windows
标头 certenroll.h
DLL CertEnroll.dll

另请参阅

IX509CertificateRequestPkcs7