ICertServerExit
COMIDispatch (デュアル)comobj 経由でメソッド名による遅延バインド呼び出しができます(vtableインデックス不要)。公式ドキュメント
サーバーエンジンによってエクスポートされ、終了モジュールから呼び出されます。
メソッド 12
vtbl = vtable インデックス(0始まり)。IDispatch 実装のため HSP ではメソッド名でも呼べます(上記)。低レベルの index 呼び出し用に vtbl も掲載。0〜2 は IUnknown。
インターフェイスの現在のインスタンスが、Context によって参照される要求に対して動作するようにします。
| Context | INT | in | 構築中の要求および関連する証明書を指定します。 |
戻り値
VB
メソッドが成功した場合、S_OK を返します。メソッドが失敗した場合、エラーを示す HRESULT 値を返します。一般的なエラーコードの一覧については、Common HRESULT Values を参照してください。
要求から名前付きプロパティを返します。
| strPropertyName | LPWSTR | in | 取得するプロパティを指定します。名前プロパティと呼ばれる、常に有効でこのメソッドを呼び出して取得できる、あらかじめ用意された証明書プロパティのセットがあります。 これらのプロパティについては、 Name Properties を参照してください。 証明書要求に対して有効なその他のプロパティには、要求プロパティが含まれます。 Note The request's DistinguishedName and RawName properties are accessible by GetRequestProperty only if the certificate is requested by using a PKCS #10 certificate request or another supported request format that contains encoded subject name information. Note that KeyGen requests do not contain encoded subject name information.
次のプロパティは要求に固有であり、GetRequestProperty メソッドを使用してアクセスできます。
RequestType プロパティは次のいずれかの値になります。
さらに、特定の要求の種類、要求の拡張、または要求のヘッダーに設定された名前付き属性によって、他のプロパティが設定される場合があります。 | ||||||||||||||||||||||||||||||||
| PropertyType | INT | in | プロパティの種類を指定します。種類は次のいずれかになります。
| ||||||||||||||||||||||||||||||||
| pvarPropertyValue | VARIANT* | out | 要求プロパティの種類を格納する VARIANT へのポインター。 |
戻り値
C++
メソッドが成功した場合、S_OK を返し、*pvarPropertyValue には要求プロパティの値を格納した VARIANT が設定されます。メソッドが失敗した場合、エラーを示す HRESULT 値を返します。一般的なエラーコードの一覧については、Common HRESULT Values を参照してください。
VB
戻り値は要求プロパティの値です。解説(Remarks)
このメソッドを使用する前に、 ICertServerExit::SetContext を呼び出す必要があります。
例
BSTR bstrPropName = NULL;
VARIANT varProp;
VariantInit( &varProp );
bstrPropName = SysAllocString(L"RequestID");
// Retrieve the request property.
// pCertServerExit has been used to call SetContext previously.
hr = pCertServerExit->GetRequestProperty( bstrPropName,
PROPTYPE_LONG,
&varProp );
if (FAILED(hr))
{
printf("Failed GetRequestProperty [%x]\n", hr);
goto error;
}
else
{
// Successfully retrieved property; use varProp as needed.
// ...
}
// Done processing.
VariantClear( &varProp );
if ( NULL != bstrPropName )
SysFreeString( bstrPropName );
要求から名前付き属性の値を返します。
| strAttributeName | LPWSTR | in | 取得する属性の名前。 |
| pstrAttributeValue | LPWSTR* | out | 属性の値を格納する BSTR 値へのポインター。 |
戻り値
C++
メソッドが成功した場合、S_OK を返し、*pstrAttributeValue には属性の値を格納した BSTR が設定されます。このメソッドを使用するには、BSTR 型の変数を作成し、その変数に NULL を設定して、その変数のアドレスを pstrAttributeValue として渡します。
BSTR の使用を終えたら、SysFreeString 関数を呼び出して解放してください。
メソッドが失敗した場合、エラーを示す HRESULT 値を返します。一般的なエラーコードの一覧については、Common HRESULT Values を参照してください。
VB
戻り値は属性の値を表す文字列です。解説(Remarks)
このメソッドを使用する前に、 ICertServerExit::SetContext を呼び出す必要があります。
次の要求属性は KEYGEN スタイルの要求に固有です。
| プロパティ名 | 種類 | 説明 |
|---|---|---|
| Challenge | String | 要求に付随するチャレンジ文字列。 |
| ExpectedChallenge | String | チャレンジ文字列が正しくない場合、サーバーはこの要求属性の値に期待されるチャレンジを設定し、失敗を診断できるようにします。 |
例
BSTR bstrAttribValue = NULL;
HRESULT hr;
// Get the request attribute.
// bstrAttribName is a BSTR assigned by EnumerateAttributes.
// Also, ICertServerExit::SetContext has already been
// called by pCertServerExit.
hr = pCertServerExit->GetRequestAttribute(bstrAttribName,
&bstrAttribValue);
if (FAILED(hr))
{
printf("Failed GetRequestAttribute [%x]\n", hr);
goto error;
}
else
{
// Successful call. Use bstrAttribValue as needed.
// ...
}
// Done processing. Free BSTR.
if (NULL != bstrAttribValue)
SysFreeString(bstrAttribValue);
証明書から名前付きプロパティを返します。(ICertServerExit.GetCertificateProperty)
| strPropertyName | LPWSTR | in | 取得する名前付きプロパティを指定します。名前プロパティと呼ばれる、常に有効でこのメソッドを呼び出して取得できる、あらかじめ用意された証明書プロパティのセットがあります。 これらのプロパティについては、 Name Properties を参照してください。 取得できるその他のプロパティには、証明書プロパティが含まれます。 次のプロパティは証明書に固有であり、GetCertificateProperty で読み取ることができます。
証明書の DistinguishedName、RawName、SerialNumber の各プロパティは、ポリシーモジュールが要求の処理を完了し、証明書が発行された後にのみ、GetCertificateProperty でアクセスできます。 次のプロパティは証明機関(CA)に適用されます。これらのプロパティを読み取るには、コンテキストが 0 である必要があります。コンテキストは、ICertServerExit オブジェクトが最初に作成されたときに 0 に設定されます。SetContext メソッドを呼び出して 0 に設定することもできます。
| ||||||||||||||||||||||||||||||||||||||||||||||||||
| PropertyType | INT | in | プロパティの種類を指定します。種類は次のいずれかになります。
| ||||||||||||||||||||||||||||||||||||||||||||||||||
| pvarPropertyValue | VARIANT* | out | プロパティの値を格納する VARIANT へのポインター。返される値は BSTR としてエンコードされます。BSTR の長さを取得するには、SysStringByteLen 関数を使用します。バイナリ BLOB は、Distinguished Encoding Rules でエンコードされた X.509 証明書として格納されます。 |
戻り値
C++
メソッドが成功した場合、S_OK を返します。メソッドが失敗した場合、エラーを示す HRESULT 値を返します。一般的なエラーコードの一覧については、Common HRESULT Values を参照してください。
VB
戻り値は要求したプロパティの値です。解説(Remarks)
このメソッドを使用する前に、 ICertServerExit::SetContext を呼び出す必要があります。
例
BSTR bstrPropName = NULL;
VARIANT varProp;
VariantInit(&varProp);
// Set the property name to RequestID.
bstrPropName = SysAllocString(L"RequestID");
// Retrieve the certificate property.
// pCertServerExit has been used to call SetContext previously.
hr = pCertServerExit->GetCertificateProperty(bstrPropName,
PROPTYPE_LONG,
&varProp );
if (FAILED(hr))
{
printf("Failed GetCertificateProperty [%x]\n", hr);
goto error;
}
else
{
// Successfully retrieved property; use varProp as needed.
// ...
}
// Done processing.
if (NULL != bstrPropName)
SysFreeString(bstrPropName);
VariantClear(&varProp);
指定した証明書の拡張を取得します。
| strExtensionName | LPWSTR | in | 拡張の名前を格納する文字列。 | ||||||||||
| Type | INT | in | 拡張の種類を指定します。種類は次のいずれかになります。
| ||||||||||
| pvarValue | VARIANT* | out | 要求した拡張の値を受け取る VARIANT へのポインター。 |
戻り値
C++
メソッドが成功した場合、S_OK を返し、*pvarValue には拡張の値を格納した VARIANT が設定されます。メソッドが失敗した場合、エラーを示す HRESULT 値を返します。一般的なエラーコードの一覧については、Common HRESULT Values を参照してください。
VB
戻り値は要求した拡張の値です。解説(Remarks)
このメソッドを使用する前に、 ICertServerExit::SetContext を呼び出す必要があります。
例
VARIANT varExt;
HRESULT hr;
VariantInit(&varExt);
// Get the Extension value
// bstrExtName is BSTR assigned by EnumerateExtensions.
// pCertServerExit has been used to call SetContext previously.
hr = pCertServerExit->GetCertificateExtension(bstrExtName,
PROPTYPE_BINARY,
&varExt);
if (FAILED(hr))
{
printf("Failed GetCertificateExtension [%x]\n", hr);
goto error;
}
// Successful call; Use the value in varExt as needed.
// ...
// When done, clear the Variant
VariantClear(&varExt);
直前の ICertServerExit::GetCertificateExtension の呼び出しで取得した拡張のフラグを取得します。
| pExtFlags | INT* | out | 拡張のフラグを格納する LONG 変数へのポインター。 |
戻り値
C++
メソッドが成功した場合、S_OK を返し、*pExtFlags には、直前の ICertServerExit::GetCertificateExtension の呼び出しで取得した拡張のフラグを格納した変数が設定されます。メソッドが失敗した場合、エラーを示す HRESULT 値を返します。一般的なエラーコードの一覧については、Common HRESULT Values を参照してください。
VB
戻り値は、直前の ICertServerExit::GetCertificateExtension の呼び出しで取得した拡張のフラグです。解説(Remarks)
拡張で使用されるフラグには、ポリシーフラグとオリジンフラグの 2 種類があります。
| フラグの種類 | 説明 |
|---|---|
| ポリシー | 証明書の拡張に関する情報を提供します。ポリシーフラグはポリシーモジュールによって設定できます。 |
| オリジン | 証明書の拡張を設定したモジュールを示します。オリジンフラグはサーバーエンジンによってのみ設定されます。 |
拡張からは 1 つ以上のポリシーフラグが返される場合があります。次に、あらかじめ定義されたポリシーフラグを示します。
| ポリシーフラグの値 | 説明 |
|---|---|
| EXTENSION_CRITICAL_FLAG | これはクリティカルな拡張です。 |
| EXTENSION_DISABLE_FLAG | 拡張は使用されません。 |
次のオリジンフラグのいずれかが返される場合もあります。
| オリジンフラグの値 | 説明 |
|---|---|
| EXTENSION_ORIGIN_REQUEST | 拡張は、PKCS #10 要求の szOID_CERT_EXTENSIONS (1.3.6.1.4.1.311.2.1.14) 属性または szOID_RSA_certExtensions (1.2.840.113549.1.9.14) 属性に格納された拡張の配列から抽出されました。 |
| EXTENSION_ORIGIN_POLICY | ポリシーモジュールが拡張を設定しました。 |
| EXTENSION_ORIGIN_ADMIN | 管理者が拡張を設定しました。詳細については、 ICertAdmin::SetCertificateExtension を参照してください。 |
| EXTENSION_ORIGIN_SERVER | サーバーエンジンが拡張を設定しました。 |
| EXTENSION_ORIGIN_RENEWALCERT | 拡張は、PKCS #10 更新要求の szOID_RENEWAL_CERTIFICATE (1.3.6.1.4.1.311.13.1) 属性に格納された証明書から抽出されました。 |
| EXTENSION_ORIGIN_IMPORTEDCERT | 拡張は、インポートされた証明書(ICertAdmin::ImportCertificate に渡された証明書)から抽出されました。 |
| EXTENSION_ORIGIN_PKCS7 | 拡張は、PKCS #7 要求の szOID_CERT_EXTENSIONS (1.3.6.1.4.1.311.2.1.14) 属性または szOID_RSA_certExtensions (1.2.840.113549.1.9.14) 属性に格納された拡張の配列から抽出されました。 |
戻り値でどのフラグが設定されているかを判断しやすくするために、あらかじめ定義されたマスクが用意されています。次のマスクが用意されています。
| マスクの値 | 説明 |
|---|---|
| EXTENSION_POLICY_MASK | この値(0x0000FFFF)は、ポリシーフラグを調べるために使用します。 |
| EXTENSION_ORIGIN_MASK | この値(0x000F0000)は、オリジンフラグを調べるために使用します。 |
EXTENSION_POLICY_MASK の上位 8 ビットは、カスタムデータのために安全に使用できます。これらのビットはデータベースに永続的に保存されますが、証明書の拡張には書き込まれません。
このメソッドを使用する前に、 ICertServerExit::SetContext を呼び出す必要があります。
例
HRESULT hr;
LONG ExtFlags;
// pCertServerExit has been used to call SetContext previously.
hr = pCertServerExit->GetCertificateExtensionFlags(&ExtFlags);
// More than one policy flag may be set.
LONG ExtPolicyFlags = ExtFlags & EXTENSION_POLICY_MASK;
if (ExtPolicyFlags & EXTENSION_CRITICAL_FLAG)
{
// Perform the desired operation.
}
if (ExtPolicyFlags & EXTENSION_DISABLE_FLAG)
{
// Perform the desired operation.
}
// Only one origin flag can be set.
switch (ExtFlags & EXTENSION_ORIGIN_MASK)
{
case EXTENSION_ORIGIN_REQUEST:
// Extension was set in certificate request.
break;
case EXTENSION_ORIGIN_POLICY:
// Extension was set by policy module.
break;
case EXTENSION_ORIGIN_ADMIN:
// Extension was set by administrator.
break;
case EXTENSION_ORIGIN_SERVER:
// Extension was set by server engine.
break;
case EXTENSION_ORIGIN_RENEWALCERT:
// Extension was set by renewal certificate.
break;
case EXTENSION_ORIGIN_IMPORTEDCERT:
// Extension was set by imported certificate.
break;
case EXTENSION_ORIGIN_PKCS7:
// Extension was set by PKCS #7.
break;
default:
break;
}
内部の列挙ポインターを、現在のコンテキストに関連付けられた最初の証明書の拡張に初期化します。(ICertServerExit.EnumerateExtensionsSetup)
| Flags | INT | in | このパラメーターは予約されており、0 に設定する必要があります。 |
戻り値
VB
メソッドが成功した場合、S_OK を返します。メソッドが失敗した場合、エラーを示す HRESULT 値を返します。一般的なエラーコードの一覧については、Common HRESULT Values を参照してください。
解説(Remarks)
このメソッドを使用する前に、 ICertServerExit::SetContext を呼び出す必要があります。
例
// Set the context. The value nContext (long) would be the same
// as the context parameter in ICertExit::Notify.
// hr is defined as an HRESULT.
hr = pCertServerExit->SetContext( nContext );
if (FAILED(hr))
{
printf("Failed SetContext [%x]\n", hr);
goto error;
}
// Setup the enumeration.
hr = pCertServerExit->EnumerateExtensionsSetup( 0 );
if (FAILED(hr))
{
printf("Failed EnumerateExtensionsSetup [%x]\n", hr);
goto error;
}
列挙される次の証明書の拡張のオブジェクト識別子(OID)文字列(拡張名とも呼ばれます)を返し、その後、内部ポインターを次の拡張に進めます。
| pstrExtensionName | LPWSTR* | out | 列挙された拡張名へのポインター。 |
戻り値
C++
メソッドが成功した場合、S_OK を返し、*pstrExtensionName には列挙された拡張の名前を格納した BSTR が設定されます。最後の拡張が既に列挙されている場合は、S_FALSE が返されます。このメソッドを使用するには、BSTR 型の変数を作成し、その変数に NULL を設定して、その変数のアドレスを pstrExtensionName として渡します。
BSTR の使用を終えたら、SysFreeString 関数を呼び出して解放してください。
メソッドが失敗した場合、エラーを示す HRESULT 値を返します。一般的なエラーコードの一覧については、Common HRESULT Values を参照してください。
VB
列挙された拡張の名前を格納した文字列を返します。最後の拡張が既に列挙されている場合は空文字列を返します。解説(Remarks)
このメソッドは、データベースに記録された証明書の拡張を列挙します。これには、無効化されていて証明書には現れない拡張も含まれます。拡張が無効になっているかどうかを判断するには、 ICertServerExit::GetCertificateExtensionFlags を使用して、拡張の EXTENSION_DISABLE_FLAG ビットをテストします。
例
BSTR bstrExt = NULL;
VARIANT varExt;
LONG ExtFlags;
HRESULT hr;
VariantInit(&varExt);
// Enumerate the extensions.
while (S_OK ==
(hr = pCertServerExit->EnumerateExtensions(&bstrExt)))
{
// Retrieve the extension data.
if (FAILED(pCertServerExit->GetCertificateExtension(
bstrExt,
PROPTYPE_BINARY,
&varExt)))
printf("Failed GetCertificateExtension\n");
else
{
// Retrieve the extension flags.
if (FAILED(pCertServerExit->GetCertificateExtensionFlags(
&ExtFlags)))
printf("Failed GetCertificateExtensionFlags\n");
else
// This sample will display the extension OID string,
// the extension flags (in hex) and
// the length of the BSTR binary ASN-encode extension.
printf("Extension: %ws\tFlags:%x\tLength:%u\n",
bstrExt,
ExtFlags,
SysStringByteLen(varExt.bstrVal));
}
}
// Determine if hr was S_FALSE, meaning the enumeration
// was completed, or some other error.
if (S_FALSE != hr)
printf("Failed EnumerateExtensions - %x\n", hr);
// Free BSTR resource.
if (NULL != bstrExt)
SysFreeString(bstrExt);
// Free VARIANT resource.
VariantClear(&varExt);
拡張の列挙に関連付けられたすべてのリソースを解放します。
内部の列挙ポインターを、現在のコンテキストに関連付けられた最初の要求属性に初期化します。(ICertServerExit.EnumerateAttributesSetup)
| Flags | INT | in | このパラメーターは予約されており、0 に設定する必要があります。 |
戻り値
VB
メソッドが成功した場合、S_OK を返します。メソッドが失敗した場合、エラーを示す HRESULT 値を返します。一般的なエラーコードの一覧については、Common HRESULT Values を参照してください。
解説(Remarks)
このメソッドを使用する前に、 ICertServerExit::SetContext を呼び出す必要があります。
例
// Set up the enumeration.
hr = pCertServerExit->EnumerateAttributesSetup(0);
if (FAILED(hr))
{
printf("Failed EnumerateAttributesSetup [%x]\n", hr);
goto error;
}
現在のコンテキスト内の次の要求属性の名前を返し、その後、内部ポインターを次の属性に進めます。
| pstrAttributeName | LPWSTR* | out | 列挙された属性名へのポインター。 |
戻り値
C++
メソッドが成功した場合、S_OK を返し、*pstrAttributeName には列挙された属性の名前を格納した BSTR が設定されます。最後の属性が既に列挙されている場合は、S_FALSE が返されます。このメソッドを使用するには、BSTR 型の変数を作成し、その変数に NULL を設定して、その変数のアドレスを pstrAttributeName として渡します。
BSTR の使用を終えたら、SysFreeString 関数を呼び出して解放してください。
メソッドが失敗した場合、エラーを示す HRESULT 値を返します。一般的なエラーコードの一覧については、Common HRESULT Values を参照してください。
VB
列挙された属性の名前を格納した文字列を返します。最後の属性が既に列挙されている場合は空文字列を返します。属性の列挙に関連付けられたすべてのリソースを解放します。
戻り値
VB
メソッドが成功した場合、S_OK を返します。メソッドが失敗した場合、エラーを示す HRESULT 値を返します。一般的なエラーコードの一覧については、Common HRESULT Values を参照してください。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_ICertServerExit "{4BA9EB90-732C-11D0-8816-00A0C903B83C}" #usecom global ICertServerExit IID_ICertServerExit "{}" #comfunc global ICertServerExit_SetContext 7 int #comfunc global ICertServerExit_GetRequestProperty 8 wstr,int,var #comfunc global ICertServerExit_GetRequestAttribute 9 wstr,var #comfunc global ICertServerExit_GetCertificateProperty 10 wstr,int,var #comfunc global ICertServerExit_GetCertificateExtension 11 wstr,int,var #comfunc global ICertServerExit_GetCertificateExtensionFlags 12 var #comfunc global ICertServerExit_EnumerateExtensionsSetup 13 int #comfunc global ICertServerExit_EnumerateExtensions 14 var #comfunc global ICertServerExit_EnumerateExtensionsClose 15 #comfunc global ICertServerExit_EnumerateAttributesSetup 16 int #comfunc global ICertServerExit_EnumerateAttributes 17 var #comfunc global ICertServerExit_EnumerateAttributesClose 18 ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※IDispatch 実装。HSP では comobj 経由でメソッド名による呼び出しも可能(vtbl 不要)。#define global IID_ICertServerExit "{4BA9EB90-732C-11D0-8816-00A0C903B83C}" #usecom global ICertServerExit IID_ICertServerExit "{}" #comfunc global ICertServerExit_SetContext 7 int #comfunc global ICertServerExit_GetRequestProperty 8 wstr,int,sptr #comfunc global ICertServerExit_GetRequestAttribute 9 wstr,sptr #comfunc global ICertServerExit_GetCertificateProperty 10 wstr,int,sptr #comfunc global ICertServerExit_GetCertificateExtension 11 wstr,int,sptr #comfunc global ICertServerExit_GetCertificateExtensionFlags 12 sptr #comfunc global ICertServerExit_EnumerateExtensionsSetup 13 int #comfunc global ICertServerExit_EnumerateExtensions 14 sptr #comfunc global ICertServerExit_EnumerateExtensionsClose 15 #comfunc global ICertServerExit_EnumerateAttributesSetup 16 int #comfunc global ICertServerExit_EnumerateAttributes 17 sptr #comfunc global ICertServerExit_EnumerateAttributesClose 18 ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※IDispatch 実装。HSP では comobj 経由でメソッド名による呼び出しも可能(vtbl 不要)。