扩展处理程序

X.509 证书格式版本 3 开始,证书可能包含证书扩展。 (有关 X.509 证书的内容,请参阅 证书属性。)这些扩展指示其他信息。 例如,扩展可以指示其他使用者标识信息,也可以指示密钥使用信息,该信息指定可以使用密钥的任务(如签名或加密)。 为应用程序使用定义了一组标准扩展,还可以自定义扩展。

每个扩展都有一个关联的对象标识符字符串,用于标识附加信息和包含此信息的数据结构。 例如,密钥使用对象标识符为“2.5.29.15”,指示密钥使用情况信息。 其关联的数据结构是一个 CRYPT_BIT_BLOB(位字段),用于指定密钥的使用方式。

在颁发扩展之前,可以将其添加到证书。 颁发证书时,任何已启用的扩展都是证书的一部分。 如果扩展标记为关键,则其使用必须由 using 应用程序知道,并且应用程序必须遵循扩展的意向或值。 证书服务允许通过 ICertAdmin 提供的方法在未颁发的证书上设置扩展,ICertServerPolicy。 有关证书扩展的详细信息,请参阅 CryptoAPI 文档中 CERT_EXTENSION。 有关常见证书扩展数据结构的信息,请参阅 X.509 证书扩展结构

扩展处理程序是一个 COM 对象,它提供用于编码更复杂的但常用的扩展和数据类型(如 IA5String 或 PrintableString)的例程。

具有数据类型的扩展 DATELONGBSTR 不需要扩展处理程序。 策略模块只需调用 ICertServerPolicy::SetCertificateExtension,并将 Type 参数设置为表示扩展数据类型的值:PROPTYPE_DATE、PROPTYPE_LONG或PROPTYPE_STRING。 然后,它将扩展传递给服务器引擎。 服务器引擎反过来又在证书中存储扩展之前执行 抽象语法表示法一(ASN.1)编码。

但是,在策略模块将数据类型传递给服务器引擎之前,具有这些默认类型的数据类型的扩展必须由扩展处理程序编码为 ASN.1。 当策略模块调用 ICertServerPolicy::SetCertificateExtension 将 ASN.1 编码的扩展传递给服务器引擎时,它必须将 Type 参数设置为PROPTYPE_BINARY。 然后,服务器引擎只需将此编码的扩展存储在证书中。

默认扩展处理程序(Certenc.dll)导出许多 ICertEncodeXXX 接口,可由策略模块调用。 必要的类型信息也包含在平台软件开发工具包(SDK)中提供的 Certencl.dll 中。 每个接口都提供一个 编码 方法,该方法以二进制格式将 ASN.1 编码的证书扩展返回到策略模块。 然后,策略模块可以通过调用 ICertServerPolicy::SetCertificateExtension 方法在证书中设置扩展。

有关详细信息,请参阅 编写自定义扩展处理程序