IX509CertificateRequestPkcs7::InitializeFromCertificate 方法 (certenroll.h)

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

Syntax

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

[in] Encoding

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

[in] InheritOptions

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

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

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

价值 Meaning
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 值

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

注解

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

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

要求

Requirement 价值
最低支持的客户端 Windows Vista [仅限桌面应用]
支持的最低服务器 Windows Server 2008 [仅限桌面应用]
目标平台 Windows操作系统
Header certenroll.h
DLL CertEnroll.dll

另请参阅

IX509CertificateRequestPkcs7