X.509 証明書形式バージョン 3 以降では、証明書に証明書の拡張機能が含まれている場合があります。 (X.509 証明書の内容については、「証明書のプロパティ」を参照してください)。これらの拡張機能は、追加情報を示します。 たとえば、拡張機能は、追加のサブジェクト識別情報を示したり、キーを使用できるタスク (署名や暗号化など) を指定するキー使用法情報を示したりすることができます。 一連の標準拡張機能はアプリケーションで使用するために定義されており、拡張機能もカスタマイズできます。
各拡張機能には、追加情報の種類と、この情報を含むデータ構造を識別するオブジェクト識別子文字列が関連付けられています。 たとえば、キー使用法オブジェクト識別子は "2.5.29.15" であり、キーの使用状況情報を示します。 関連付けられたデータ構造は、キーの使用方法を指定する CRYPT_BIT_BLOB (ビットフィールド) です。
証明書を発行する前に、証明書に拡張機能を追加できます。 証明書が発行されると、有効になっている拡張機能が証明書の一部になります。 拡張機能がクリティカルとマークされている場合、その使用は using アプリケーションによって認識され、アプリケーションは拡張機能の意図または値に従う必要があります。 Certificate Services を使用すると、ICertAdminおよび ICertServerPolicyによって提供されるメソッドを使用して、発行されていない証明書に拡張機能を設定できます。 証明書の拡張機能の詳細については、CryptoAPI ドキュメントの CERT_EXTENSION を参照してください。 一般的な証明書拡張データ構造の詳細については、「X.509 Certificate Extension Structures」を参照してください。
拡張ハンドラーは COM オブジェクトであり、IA5String や PrintableString など、より複雑ですが、一般的に使用される拡張機能やデータ型をエンコードするためのルーチンを提供します。
DATE 、LONG、および BSTRデータ型を持つ拡張機能には、拡張機能ハンドラーは必要ありません。 ポリシー モジュールは、拡張データ型 (PROPTYPE_DATE、PROPTYPE_LONG、またはPROPTYPE_STRING) を表す値に Type パラメーターを設定して、ICertServerPolicy::SetCertificateExtensionを呼び出すだけです。 その後、拡張機能がサーバー エンジンに渡されます。 サーバー エンジンは、証明書に拡張機能を格納する前に、Abstract Syntax Notation One (ASN.1) エンコードを実行します。
ただし、これらの既定の型以外のデータ型を持つ拡張機能は、ポリシー モジュールがサーバー エンジンに渡す前に、拡張機能ハンドラーによって ASN.1 エンコードされている必要があります。 ポリシー モジュールが ICertServerPolicy::SetCertificateExtension を呼び出して ASN.1 でエンコードされた拡張機能をサーバー エンジンに渡す場合は、Type パラメーターをPROPTYPE_BINARYに設定する必要があります。 その後、サーバー エンジンは、このエンコードされた拡張機能を証明書に格納するだけです。
既定の拡張ハンドラー Certenc.dllは、ICertEncodeXXX インターフェイス 多数をエクスポートし、ポリシー モジュールから呼び出すことができます。 必要な型情報は、プラットフォーム ソフトウェア開発キット (SDK) で提供される Certencl.dll にも含まれています。 各インターフェイスには、ASN.1 でエンコードされた証明書拡張機能をバイナリ形式でポリシー モジュールに返す Encode メソッドが用意されています。 その後、ポリシー モジュールは、ICertServerPolicy::SetCertificateExtension メソッドを呼び出すことによって、証明書に拡張機能を設定できます。
詳細については、「カスタム拡張機能ハンドラーの作成 」を参照してください。