对证书上下文进行编码和解码

CryptoAPI 支持 证书的编码和解码。 CryptoAPI 包括一个广泛、灵活的函数和 C 结构系统,允许以各种方式进行编码和解码。 CryptoAPI 支持标准 X.509 证书结构和标准 抽象语法表示法 One (ASN.1) 编码,以提供与其他系统的互操作性。

有关编码数据的概述,请参阅 编码和解码的数据

证书上下文

证书上下文(CERT_CONTEXT)是一个 C 结构,其中包含编码成员、证书存储的句柄、指向原始编码证书 BLOB 的指针和指向CERT_INFO C 结构的指针。

CERT_INFO结构是证书的核心。 它以直接形式和编码形式包含证书中的所有基本信息。 下图显示了 CERT_INFO 结构,其所有编码成员都显示为阴影。

cert-info 结构

IssuerUniqueIDSubjectUniqueID 成员是 X.509 版本 2 证书实现的一部分,但很少使用。 版本 3 中的证书扩展替换了这些成员的功能。

如果需要编码 (着色) 成员 IssuerSubject 中包含的信息,则必须解码这些成员。 使用 CryptDecodeObject 解码这些成员。 下图显示了解码其中一个成员的过程。

使用 cryptdecodeobject 进行解码

在演示的情况下, CryptDecodeObject 函数创建 CERT_NAME_INFO 结构、 CERT_RDN 结构的数组、 CERT_RDN_ATTR结构的相应 数组以及包含名称的字符串。 CERT_RDN_ATTR 结构的成员确定字符串的内容。 例如,如果 pszObjId 成员为 2.5.4.3,则字符串包含公用名。 如果是 2.5.4.10,则字符串将包含组织名称。 有关这些 对象标识符 (OID) 的列表,请参阅 CERT_RDN_ATTR

dwValueType 成员包含有关字符串类型的信息。 如果它是CERT_RDN_PRINTABLE_STRING,则值成员包含字节宽度、以零结尾的字符串。 如果为CERT_RDN_UNICODE_STRING,则字符串为双宽度 (字大小的) 字符串。

有关证书编码和解码的详细过程,请参阅编码CERT_INFO结构和解码CERT_INFO结构