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