Win32 API 日本語リファレンス
ホームSecurity.Cryptography.Certificates › ICertServerPolicy

ICertServerPolicy

COMIDispatch (デュアル)
IDispatch を実装(デュアルインターフェース)。HSP では comobj 経由でメソッド名による遅延バインド呼び出しができます(vtableインデックス不要)。
IIDaa000922-ffbe-11cf-8800-00a0c903b83c継承元IDispatch呼び出し名前(IDispatch) または vtbl自前メソッド開始 vtbl7

公式ドキュメント

ポリシーモジュールが証明書サービス(Certificate Services)と通信できるようにします。

メソッド 14

vtbl = vtable インデックス(0始まり)。IDispatch 実装のため HSP ではメソッド名でも呼べます(上記)。低レベルの index 呼び出し用に vtbl も掲載。0〜2 は IUnknown。

vtbl 7 HRESULT SetContext(INT Context)

証明書サービスへの後続の呼び出しでコンテキストとして使用する要求を指定します。

ContextINTin要求を指定します。このパラメーターには、ICertPolicy::VerifyRequest メソッドの Context パラメーターで返された値と同一の値を設定する必要があります。

戻り値

VB

メソッドが成功した場合、S_OK を返します。

メソッドが失敗した場合、エラーを示す HRESULT 値を返します。一般的なエラーコードの一覧については、Common HRESULT Values を参照してください。

解説(Remarks)

インターフェイスが有効な要求を参照できるように、ポリシーモジュールは他のいずれの ICertServerPolicy メソッドを呼び出すよりも前に、まず SetContext メソッドを呼び出す必要があります。

// Set the context. The value nContext (long) would be the same
// as the context parameter in ICertPolicy::VerifyRequest.
// hr is defined as an HRESULT.
hr = pCertServerPolicy->SetContext( nContext );
if (FAILED(hr))
{
    printf("Failed SetContext [%x]\n", hr);
    goto error;
}
vtbl 8 HRESULT GetRequestProperty(LPWSTR strPropertyName, INT PropertyType, VARIANT* pvarPropertyValue)

要求から特定のプロパティを取得します。

strPropertyNameLPWSTRin

取得するプロパティの名前を指定します。このパラメーターには、名前プロパティ(name property)または要求プロパティ(request property)を設定できます。

名前プロパティには、常に有効で、このメソッドを呼び出すことで取得できる標準的な証明書プロパティのセットが含まれます。 これらのプロパティについては、Name Properties を参照してください。

要求プロパティは要求に固有であり、次の値を取ることができます。

意味
RequestID
符号付き long
内部の要求 ID(requestID)。
RawRequest
バイナリ
未加工の要求バイト。
RequestAttributes
文字列
属性文字列(切り詰められる場合があります)。
RequestType
符号付き long
PKCS #10 要求か KeyGen 要求かを示します。このプロパティの詳細については、「解説(Remarks)」を参照してください。
SubmittedWhen
日付/時刻
到着した日時。
RequesterName
文字列
"DomainName\UserID" の形式で表される要求者の名前。
 

Note ポリシーモジュールが要求の処理を完了するまで設定されないため、GetRequestProperty ではアクセスできない要求プロパティが他にもあります。さらに、特定の要求の種類、要求の拡張、または要求のヘッダーに設定された名前付き属性によって、他のプロパティが設定される場合があります。

PropertyTypeINTin

プロパティの種類を指定します。PropertyType パラメーターには、次のいずれかの種類を指定できます。

意味
PROPTYPE_LONG
符号付き long データ。
PROPTYPE_DATE
日付/時刻。
PROPTYPE_BINARY
バイナリデータ。
PROPTYPE_STRING
Unicode 文字列データ。
pvarPropertyValueVARIANT*out要求プロパティの種類を格納する VARIANT へのポインター。

戻り値

C++

メソッドが成功した場合、S_OK を返し、pvarPropertyValue パラメーターに要求プロパティが格納されます。

メソッドが失敗した場合、エラーを示す HRESULT 値を返します。一般的なエラーコードの一覧については、Common HRESULT Values を参照してください。

VB

戻り値は要求プロパティです。

解説(Remarks)

このメソッドを呼び出す前に SetContext メソッドを呼び出す必要があります。SetContext の呼び出しによって、現在のコンテキストとして使用する要求が指定されます。

要求は、証明書の一部ではない、要求および最終的に発行される証明書に関連するすべての状態を保持します。そのため、失効日時や処理結果(disposition)などのデータは、要求データオブジェクトに保持されます。

RequestType プロパティには、次のいずれかの値を設定できます。

意味
CR_IN_PKCS 要求が PKCS #7 の更新要求または登録要求であることを示します。
CR_IN-PKCS10 要求が PKCS #10 要求であることを示します。
CR_IN_KEYGEN 要求が Keygen 要求(Netscape 形式)であることを示します。
 

BSTR      bstrPropName = NULL;
VARIANT   varProp;

VariantInit( &varProp );

bstrPropName = SysAllocString(L"RequestID");

// Retrieve the request property.
// pCertServerPolicy has been used to call SetContext previously.
hr = pCertServerPolicy->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 );
vtbl 9 HRESULT GetRequestAttribute(LPWSTR strAttributeName, LPWSTR* pstrAttributeValue)

要求から名前付き属性を返します。

strAttributeNameLPWSTRin取得する属性の名前。
pstrAttributeValueLPWSTR*out属性値を格納する BSTR 値へのポインター。

戻り値

C++

メソッドが成功した場合、S_OK を返し、*pstrAttributeValue に属性値を格納する BSTR が設定されます。

このメソッドを使用するには、BSTR 型の変数を作成し、その変数に NULL を設定して、その変数のアドレスを pstrAttributeValue として渡します。

BSTR の使用を終えたら、SysFreeString 関数を呼び出して解放してください。

メソッドが失敗した場合、エラーを示す HRESULT 値を返します。一般的なエラーコードの一覧については、Common HRESULT Values を参照してください。

VB

戻り値は属性値を表す文字列です。

解説(Remarks)

このメソッドを使用する前に ICertServerPolicy::SetContext を呼び出す必要があります。

次の要求属性は KEYGEN スタイルの要求に固有です。

プロパティ名 種類 説明
Challenge String 要求に付随するチャレンジ文字列。
ExpectedChallenge String チャレンジ文字列が正しくない場合、失敗を診断できるように、サーバーはこの要求属性の値を、期待されるチャレンジに設定します。
 

BSTR     bstrAttribValue = NULL;
HRESULT  hr;

// Get the request attribute.
// bstrAttribName is BSTR assigned by EnumerateAttributes.
// pCertServerPolicy has been used to call SetContext previously.
hr = pCertServerPolicy->GetRequestAttribute(bstrAttribName,
                                            &bstrAttribValue);

if (FAILED(hr))
{
    printf("Failed GetRequestAttribute [%x]\n", hr);
    goto error;
}
else
{

    // Successful call. Use the bstrAttribValue as needed.
    // ...
}

// Done processing. Free BSTR.
if (NULL != bstrAttribValue)
    SysFreeString(bstrAttribValue);
vtbl 10 HRESULT GetCertificateProperty(LPWSTR strPropertyName, CERT_PROPERTY_TYPE PropertyType, VARIANT* pvarPropertyValue)

証明書から名前付きプロパティを返します。(ICertServerPolicy.GetCertificateProperty)

strPropertyNameLPWSTRin

取得する名前付きプロパティを指定します。名前プロパティ(name properties) と呼ばれる、常に有効で、このメソッドの呼び出しによって取得できる標準的な証明書プロパティのセットがあります。 これらのプロパティについては、Name Properties を参照してください。 名前プロパティ以外のプロパティも取得できます。

証明書の DistinguishedName プロパティおよび RawName プロパティは、ポリシーモジュールが要求の処理を完了し、証明書が発行された後にのみ、ICertServerExit::GetCertificateProperty でアクセスできます。発行された証明書の DistinguishedName プロパティおよび RawName プロパティは、ICertServerExit::GetCertificateProperty を使用して終了モジュール(exit module)から読み取ることもできます。

GetCertificateProperty ではアクセスできない証明書プロパティが他にもあります。これらのプロパティは、ポリシーモジュールが VR_INSTANT_OK を返して証明書が発行されるまで設定されません。発行された証明書に含まれるすべてのプロパティの完全な一覧については、GetCertificateProperty を参照してください。

次のプロパティは証明書に固有であり、GetCertificateProperty で読み取ることができます。

証明書プロパティ 意味
RequestID
符号付き long
内部の要求 ID
NotBefore
日付/時刻
証明書の有効期間の開始日
NotAfter
日付/時刻
証明書の有効期限
RawPublicKey
バイナリ
サブジェクトのキー
PublicKeyAlgorithm
文字列
サブジェクトのキーアルゴリズムの オブジェクト ID(OID)
RawPublicKeyAlgorithmParameters
バイナリ
サブジェクトのキーアルゴリズムのパラメーター
GeneralFlags
PROPTYPE_LONG
登録要求内の GeneralFlags。これは複数の値のビットごとの OR です。ここで注目すべき唯一の値はフラグ値 0x00000400 であり、これは要求をデータベースに永続化しないよう CA に指示します。CA がデータベースレスモードの場合(すなわち、Windows Server 2008 R2 以降の CA では、CA のデータベースに DBFLAGS_ENABLEVOLATILEREQUESTS フラグが設定されている場合)、CA をデータベースレスモードで構成するには certutil -getreg DbFlags および certutil -setreg DBFlags を使用します。

Windows Vista および Windows Storage Server 2003: このフィールドはサポートされていません。

RequesterNameFromOldCertificate
PROPTYPE_STRING
更新要求の場合、要求者のアカウント名(例: contoso\requester)を返します。
 

次のプロパティは 証明機関(CA) に適用されます。

CA プロパティ 意味
CAType
Long
証明機関の種類。これは次のいずれかの値になります(Certsrv.h で定義):
CertCount
Long
CA 証明書の数。この値は、CA が更新された回数に 1 を加えた値になります。更新については、証明機関の更新 を参照してください。
CertState
Long
CA 証明書の 状態。これは次のいずれかの値になります: このプロパティ名には '.#' を付加できます。ここで # は CA 証明書のインデックス(CRLSuffix プロパティの場合は CRL インデックス)を表します。証明書と CRL のインデックスについては、証明機関の更新(Certification Authority Renewal) を参照してください。
CertSuffix
文字列
CA 証明書のサフィックス。インデックスが 0 の CA 証明書ではサフィックスは空の文字列です。それ以外の場合、サフィックス("(nn)" の形式。nn は証明書のインデックス)は、ファイルまたはディレクトリサービスオブジェクトに格納された CA 証明書を指すすべての URL に適用されます。LDAP 以外の URL では、サフィックスは通常 ".crt" というテキストの前に現れます。LDAP URL では、サフィックスは通常、完全な識別名の最初の 'CN=' に付加されます。

このプロパティ名には '.#' を付加できます。ここで # は CA 証明書のインデックス(CRLSuffix プロパティの場合は CRL インデックス)を表します。証明書と CRL のインデックスについては、証明機関の更新(Certification Authority Renewal) を参照してください。

CRLIndex
Long
証明書失効リスト(CRL)のインデックス。このプロパティ名に証明書インデックスを付加すると、CRL インデックスを取得できます。CRL インデックスは必ずしも証明書インデックスと一致しません。詳細については、証明機関の更新 を参照してください。

このプロパティ名には '.#' を付加できます。ここで # は CA 証明書のインデックス(CRLSuffix プロパティの場合は CRL インデックス)を表します。証明書と CRL のインデックスについては、証明機関の更新(Certification Authority Renewal) を参照してください。

CRLState
Long
CRL の 状態。これは次のいずれかの値になります:
  • CA_DISP_ERROR: この CRL は別の CA 証明書によって管理されています。
  • CA_DISP_REVOKED: この CA 証明書の CRL を使用する、有効期限が切れていないすべての CA 証明書が失効しています。
  • CA_DISP_VALID: この CA 証明書は、必要に応じて CRL を発行するために引き続き使用されています。
  • CA_DISP_INVALID: この CA 証明書の CRL を使用するすべての CA 証明書が有効期限切れです。
このプロパティ名には '.#' を付加できます。ここで # は CA 証明書のインデックス(CRLSuffix プロパティの場合は CRL インデックス)を表します。証明書と CRL のインデックスについては、証明機関の更新(Certification Authority Renewal) を参照してください。
CRLSuffix
文字列
CA の CRL のサフィックス。インデックスが 0 の CRL ではサフィックスは空の文字列です。それ以外の場合、サフィックス("(nn)" の形式。nn は CRL インデックス)は、ファイルまたはディレクトリサービスオブジェクトに格納された CRL を指すすべての URL に適用されます。LDAP 以外の URL では、サフィックスは通常 .crl というテキストの前に現れます。LDAP URL では、サフィックスは通常、完全な識別名の最初の 'CN=' に付加されます。

このプロパティ名には '.#' を付加できます。ここで # は CA 証明書のインデックス(CRLSuffix プロパティの場合は CRL インデックス)を表します。証明書と CRL のインデックスについては、証明機関の更新(Certification Authority Renewal) を参照してください。

fUseDS
Long
CA がディレクトリサービスを使用するかどうかを示します。これは次のいずれかの値になります:
  • 0=いいえ
  • 1=はい
MachineDNSName
文字列
CA をホストしているサーバーの DNS 名。
ModuleRegistryLocation
文字列
モジュールが使用できるレジストリの場所。
RawCACertificate
バイナリ
CA 証明書。

このプロパティ名には '.#' を付加できます。ここで # は CA 証明書のインデックス(CRLSuffix プロパティの場合は CRL インデックス)を表します。証明書と CRL のインデックスについては、証明機関の更新(Certification Authority Renewal) を参照してください。

RawCRL
バイナリ
CA の 証明書失効リスト(CRL)。

このプロパティ名には '.#' を付加できます。ここで # は CA 証明書のインデックス(CRLSuffix プロパティの場合は CRL インデックス)を表します。証明書と CRL のインデックスについては、証明機関の更新(Certification Authority Renewal) を参照してください。

RequesterCAAccess
Long
要求者が証明書を要求する権限を持っているかどうかを示します。これは次のいずれかの値になります:
  • 0=いいえ
  • 1=はい
(証明機関 MMC スナップインを使用して、証明書要求 のアクセス許可を制御できます。)
SanitizedCAName
文字列
CA の サニタイズされた名前。サニタイズされた CA 名については、ICertConfig::GetConfig を参照してください。
SanitizedShortName
文字列
CA のサニタイズされた名前。短縮されており、一意性を保証するためのハッシュ値を含みます。
PropertyTypeCERT_PROPERTY_TYPEin

プロパティの種類を指定します。種類は次のいずれかの値になります。

種類 意味
PROPTYPE_LONG
符号付き long データ
PROPTYPE_DATE
日付/時刻
PROPTYPE_BINARY
バイナリデータ
PROPTYPE_STRING
Unicode 文字列データ
pvarPropertyValueVARIANT*outプロパティ値を格納する VARIANT へのポインター。

戻り値

メソッドが成功した場合、S_OK を返し、*pvarPropertyValue に要求されたプロパティ値を格納する VARIANT が設定されます。

メソッドが失敗した場合、エラーを示す HRESULT 値を返します。一般的なエラーコードの一覧については、Common HRESULT Values を参照してください。

vtbl 11 HRESULT SetCertificateProperty(LPWSTR strPropertyName, INT PropertyType, VARIANT* pvarPropertyValue)

証明書に関連付けられたプロパティを設定します。

strPropertyNameLPWSTRin

設定するプロパティを指定します。証明書に関連付けられた Name Properties のいずれも設定できます。

さらに、次の証明書プロパティを設定できます。

意味
NotBefore
日付/時刻
証明書は指定された日付より前は有効になりません。
NotAfter
日付/時刻
証明書は指定された日付より後は有効になりません。
GeneralFlags
要求が CA データベースに永続化されないようにするには、このプロパティを 0x00000400 に設定します。
Caution  このプロパティを設定するときは、GetCertificateProperty によって返されたマスク値を上書きしないでください。既存の値とのビットごとの OR を実行して値を設定してください。
 
Windows Storage Server 2003:  このフィールドはサポートされていません。
CrossForest
PROPTYPE_LONG
CA がクロスフォレストの登録(エンロール)モードで動作するかどうかを指定するブール値。

Windows Server 2008 および Windows Server 2003: クロスフォレストの登録(エンロール)はサポートされていません。クロスフォレストの登録は Windows Server 2008 R2 以降でサポートされます。

RequesterSAMName
PROPTYPE_STRING
要求者のアカウント名("RequesterName")と識別名を設定するよう CA に指示します。
RequesterUPN
PROPTYPE_STRING
要求者の ユーザープリンシパル名(UPN)を要求者名("RequesterName")に変換し、要求者名と要求者の識別名を設定するよう CA に指示します。
RequesterDN
PROPTYPE_STRING
要求者の FQDN 1779 名を要求者名に変換し、要求者名("RequesterName")と要求者の識別名を設定するよう CA に指示します。
PropertyTypeINTin

設定するプロパティの種類を指定します。Type パラメーターは、VARIANT 構造体の vt フィールドに設定される pvarValue のデータ型と一致している必要があります。Type パラメーターには、次のいずれかの種類を設定できます。

意味
PROPTYPE_LONG
符号付き long データ。
PROPTYPE_DATE
日付/時刻データ。
PROPTYPE_BINARY
バイナリデータ。
PROPTYPE_STRING
Unicode 文字列データ
pvarPropertyValueVARIANT*inプロパティに設定する値を指定します。

戻り値

VB

メソッドが成功した場合、S_OK を返します。

メソッドが失敗した場合、エラーを示す HRESULT 値を返します。一般的なエラーコードの一覧については、Common HRESULT Values を参照してください。

解説(Remarks)

このメソッドを使用する前に ICertServerPolicy::SetContext を呼び出す必要があります。

NotBefore および NotAfter の証明書プロパティは、証明書が有効である期間を制約します。これらのプロパティのデータ型は、オートメーションの COleDateTime から派生した浮動小数点の VARIANT 日付です。

SetCertificateProperty で NotBefore および NotAfter の証明書プロパティを設定する場合、次の制約が適用されます:

次の例では、SetCertificateProperty メソッドを呼び出して NotBefore 証明書プロパティを設定します。この例では、pServer が有効であり、ICertServerPolicy::SetContext メソッドが呼び出されていることを前提としています。

HRESULT hr;
ICertServerPolicy *pServer;
SYSTEMTIME st;
BSTR bstrPropName;
VARIANT vPropValue;

bstrPropName = SysAllocString(L"NotBefore");
if (NULL == bstrPropName)
{
    printf("Unable to allocate memory.\n"); 
    return E_OUTOFMEMORY;
}

// Set the 'NotBefore' property to Noon on Jan. 1, 2000.
memset( &st, 0, sizeof(SYSTEMTIME));
st.wYear = 2000;
st.wMonth = 1;     // Jan.
st.wDay = 1;       // 1st day of month.
st.wHour = 12;     // Noon.

// Place the date into VARIANT required format.
VariantInit( &vPropValue );
vPropValue.vt = VT_DATE;
if ( !SystemTimeToVariantTime( &st, &vPropValue.date))
{
    printf("Unable to convert time.\n");
    SysFreeString(bstrPropName);
    return E_FAIL
}

// Set the NotBefore property in the certificate:
hr = pServer->SetCertificateProperty(bstrPropName,
                                     PROPTYPE_DATE, 
                                     &vPropValue);
SysFreeString(bstrPropName);
VariantClear(&vPropValue);
if (FAILED(hr))
{
    printf("SetCertificateProperty failed [%x]\n", hr);
    return hr;
}
vtbl 12 HRESULT GetCertificateExtension(LPWSTR strExtensionName, CERT_PROPERTY_TYPE Type, VARIANT* pvarValue)

特定の証明書拡張を取得します。

strExtensionNameLPWSTRin拡張の名前を含む文字列。
TypeCERT_PROPERTY_TYPEin

拡張の種類を指定します。種類は次のいずれかの値になります。

意味
PROPTYPE_LONG
符号付き long データ
PROPTYPE_DATE
日付/時刻
PROPTYPE_BINARY
拡張値はそのまま取得され、必要に応じて ASN.1 エンコードされます。
PROPTYPE_STRING
拡張値は IA5 文字列として ASN.1 エンコードされます。
pvarValueVARIANT*out要求された拡張値を受け取る VARIANT へのポインター。

戻り値

C++

メソッドが成功した場合、S_OK を返し、pvarValue パラメーターに拡張値が格納されます。

メソッドが失敗した場合、エラーを示す HRESULT 値を返します。一般的なエラーコードの一覧については、Common HRESULT Values を参照してください。

VB

戻り値は要求された拡張値です。

解説(Remarks)

このメソッドを呼び出す前に SetContext メソッドを呼び出す必要があります。SetContext の呼び出しによって、現在のコンテキストとして使用する要求が指定されます。

証明書拡張は証明書プロパティとは区別されます。プロパティは要求に添付される汎用的なデータです。これらのプロパティの一部は証明書にエンコードされますが(例: BeginDate)、その他はキューやログ内で要求をマークするためだけに使用されます。無効化されていない拡張は証明書にエンコードされます。拡張は常に オブジェクト識別子 でマークされ、常に critical/noncritical フラグを持ちます。

VARIANT    varExt;
HRESULT    hr;

VariantInit(&varExt);
// Get the Extension value.
// bstrExtName is BSTR assigned by EnumerateExtensions.
// pCertServerPolicy has been used to call SetContext previously.
hr = pCertServerPolicy->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);
vtbl 13 HRESULT GetCertificateExtensionFlags(INT* pExtFlags)

直近の GetCertificateExtension の呼び出しで取得した拡張に関連付けられたフラグを取得します。

pExtFlagsINT*out拡張フラグを格納する LONG 変数へのポインター。

戻り値

C++

メソッドが成功した場合、S_OK を返し、pExtFlags パラメーターに、直近の GetCertificateExtension の呼び出しで取得した拡張のフラグが格納されます。

メソッドが失敗した場合、エラーを示す HRESULT 値を返します。一般的なエラーコードの一覧については、Common HRESULT Values を参照してください。

VB

戻り値は、直近の GetCertificateExtension の呼び出しで取得した拡張のフラグです。

解説(Remarks)

GetCertificateExtensionFlags を呼び出す前に、SetContext メソッドと GetCertificateExtension メソッドを呼び出す必要があります。SetContext メソッドは現在のコンテキストとして使用する要求を指定し、GetCertificateExtension メソッドはその要求の拡張を取得します。

拡張には、ポリシーフラグと生成元(origin)フラグを含めることができます。ポリシーフラグは証明書拡張に関する情報を提供します。ポリシーフラグはポリシーモジュールが設定できます。生成元フラグは、証明書拡張を設定したモジュールを示します。生成元フラグはサーバーエンジンによってのみ設定されます。

拡張からは 1 つ以上のポリシーフラグが返される場合があります。次に、あらかじめ定義されているポリシーフラグを示します。

ポリシーフラグの値 説明
EXTENSION_CRITICAL_FLAG これは critical(必須)拡張です。
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 ビットは、カスタムデータのために使用しても安全です。これらのビットはデータベースに永続的に保存されますが、証明書拡張には書き込まれません。

HRESULT  hr;
LONG     ExtFlags;
// pCertServerPolicy has been used to call SetContext previously.
hr = pCertServerPolicy->GetCertificateExtensionFlags( &ExtFlags);

// More than one policy flag might be set.
LONG ExtPolicyFlags = ExtFlags & EXTENSION_POLICY_MASK;

if (ExtPolicyFlags & EXTENSION_CRITICAL_FLAG)
{
    // Do something.
}

if (ExtPolicyFlags & EXTENSION_DISABLE_FLAG)
{
    // Do something.
}

// 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;
    default:
        break;
}
vtbl 14 HRESULT SetCertificateExtension(LPWSTR strExtensionName, INT Type, INT ExtFlags, VARIANT* pvarValue)

証明書に新しい拡張を追加します。

strExtensionNameLPWSTRin設定する拡張の オブジェクト識別子(OID)を指定します。文字列の長さは、null 文字を除いて 31 文字以下でなければなりません。
TypeINTin

設定する拡張の種類を指定します。Type パラメーターは、VARIANT 構造体の vt フィールドに設定される pvarValue のデータ型と一致している必要があります。Type パラメーターには、次のいずれかの種類を設定できます。

意味
PROPTYPE_LONG
符号付き long データ。
PROPTYPE_DATE
日付/時刻。
PROPTYPE_BINARY
拡張値はそのまま設定され、必要に応じて ASN.1 エンコードされているものとみなされます。
PROPTYPE_STRING
拡張値は、新しい証明書に配置される前に IA5 文字列として ASN.1 エンコードされます。
Note  単一の URL から成る拡張値については、その URL を自動的に IA5 文字列としてエンコードしたい場合にのみ PROPTYPE_STRING を使用してください。そうでない場合は、URL を自分で IA5 文字列としてエンコードし、エンコード済みの値を PROPTYPE_BINARY として渡してください。
 
ExtFlagsINTin

設定する拡張のフラグを指定します。フラグを設定しない場合は 0 を使用し、それ以外の場合は次のフラグ値のいずれかを使用します。これらのフラグは OR 演算子で結合できます。また、ポリシーのプライベート拡張フラグ(EXTENSION_POLICY_MASK フィールドの上位 8 ビット)と OR 演算子で結合することもできます。

Note  ExtFlagsEXTENSION_DISABLE_FLAG を設定すると、拡張はサーバーログで無効化され、証明書には追加されません。
 
意味
EXTENSION_CRITICAL_FLAG
これは critical(必須)拡張です。
EXTENSION_DISABLE_FLAG
拡張は使用されません。
pvarValueVARIANT*in

拡張に関連付ける値を指定します。値の VARIANT 型は、次の表に示すように Type パラメーターと一致している必要があることに注意してください。

意味
PROPTYPE_LONG
VT_I4
PROPTYPE_DATE
VT_DATE
PROPTYPE_BINARY
VT_BSTR
PROPTYPE_STRING
VT_BSTR

戻り値

VB

メソッドが成功した場合、S_OK を返します。

メソッドが失敗した場合、エラーを示す HRESULT 値を返します。一般的なエラーコードの一覧については、Common HRESULT Values を参照してください。

解説(Remarks)

補足的なサブジェクト情報や用途情報など、追加情報を証明書に含めるには拡張を使用します。詳細については、Extension Handlers を参照してください。

SetCertificateExtension メソッドは、ICertPolicy2::VerifyRequest メソッドの実装内から呼び出します。SetCertificateExtension メソッドを呼び出す前に、ICertServerPolicy::SetContext メソッドを呼び出す必要があります。

vtbl 15 HRESULT EnumerateExtensionsSetup(INT Flags)

内部の列挙ポインターを、現在のコンテキストに関連付けられた最初の証明書拡張に初期化します。(ICertServerPolicy.EnumerateExtensionsSetup)

FlagsINTinこのパラメーターは予約されており、0 に設定する必要があります。

戻り値

VB

メソッドが成功した場合、S_OK を返します。

メソッドが失敗した場合、エラーを示す HRESULT 値を返します。一般的なエラーコードの一覧については、Common HRESULT Values を参照してください。

解説(Remarks)

このメソッドを呼び出す前に SetContext メソッドを呼び出す必要があります。SetContext の呼び出しによって、どの要求が現在のコンテキストであるかが指定されます。

拡張を取得するには、EnumerateExtensions メソッドを呼び出します。EnumerateExtensions の呼び出しによって最初の拡張が取得され、次の拡張が存在する場合はインデックスがそれに移動します。

// Set the context. The value nContext (long) would be the same
// as the context parameter in ICertPolicy::VerifyRequest.
// hr is defined as an HRESULT.
// pCertServerPolicy has been used to call SetContext previously.
hr = pCertServerPolicy->SetContext( nContext );
if (FAILED(hr))
{
    printf("Failed SetContext [%x]\n", hr);
    goto error;
}
// Setup the enumeration.
hr = pCertServerPolicy->EnumerateExtensionsSetup( 0 );
if (FAILED(hr))
{
    printf("Failed EnumerateExtensionsSetup [%x]\n", hr);
    goto error;
}
vtbl 16 HRESULT EnumerateExtensions(LPWSTR* pstrExtensionName)

現在の拡張のオブジェクト識別子(OID)を取得し、内部の列挙ポインターを次の拡張に移動します。

pstrExtensionNameLPWSTR*out現在の拡張の OID を格納する BSTR へのポインター。

戻り値

C++

メソッドが成功した場合、S_OK を返し、pstrExtensionName パラメーターに現在の拡張の OID が格納されます。最後の拡張が既に列挙されている場合は S_FALSE が返されます。

このメソッドを使用するには、BSTR 型の変数を作成し、その変数に NULL を設定して、その変数のアドレスを pstrExtensionName として渡します。

BSTR の使用を終えたら、SysFreeString 関数を呼び出して解放してください。

メソッドが失敗した場合、エラーを示す HRESULT 値を返します。一般的なエラーコードの一覧については、Common HRESULT Values を参照してください。

VB

拡張の OID を含む文字列を返します。最後の拡張が既に列挙されている場合は空の文字列を返します。

解説(Remarks)

このメソッドは、無効化されていて証明書に現れないものも含め、データベースに記録されている証明書拡張を列挙します。拡張が無効化されているかどうかを判定するには、GetCertificateExtensionFlags を使用して、その拡張の EXTENSION_DISABLE_FLAG ビットをテストします。

列挙が完了したら、EnumerateExtensionsClose メソッドを呼び出して、列挙の呼び出しで使用したリソースを解放します。

#include <windows.h>
#include <stdio.h>
#include <Certif.h>

BSTR     bstrExt = NULL;
VARIANT  varExt;
LONG     ExtFlags;
HRESULT  hr;

VariantInit(&varExt);

// Enumerate the extensions.
while (S_OK ==
      (hr = pCertServerPol->EnumerateExtensions(&bstrExt)))
{
  // Retrieve the extension data.
  if (FAILED(pCertServerPol->GetCertificateExtension(
                             bstrExt,
                             PROPTYPE_BINARY,
                             &varExt)))
      printf("Failed GetCertificateExtension\n");
  else
  {
     // Retrieve the extension flags.
    if (FAILED(pCertServerPol->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);
vtbl 17 HRESULT EnumerateExtensionsClose()

拡張の列挙に関連するリソースを解放します。

戻り値

VB

メソッドが成功した場合、S_OK を返します。

メソッドが失敗した場合、エラーを示す HRESULT 値を返します。一般的なエラーコードの一覧については、Common HRESULT Values を参照してください。

解説(Remarks)

すべてのポリシーモジュールは、EnumerateExtensionsSetup および ICertServerPolicy::EnumerateExtensions メソッドを呼び出した後に、EnumerateExtensionsClose メソッドを呼び出す必要があります。

// Close the enumeration.
// hr is defined as an HRESULT.
hr = pCertServerPolicy->EnumerateExtensionsClose();
if (FAILED(hr))
{
    printf("Failed EnumerateExtensionsClose [%x]\n", hr);
    goto error;
}
vtbl 18 HRESULT EnumerateAttributesSetup(INT Flags)

内部の列挙ポインターを、現在のコンテキストに関連付けられた最初の要求属性に初期化します。(ICertServerPolicy.EnumerateAttributesSetup)

FlagsINTinこのパラメーターは予約されており、0 に設定する必要があります。

戻り値

VB

メソッドが成功した場合、S_OK を返します。

メソッドが失敗した場合、エラーを示す HRESULT 値を返します。一般的なエラーコードの一覧については、Common HRESULT Values を参照してください。

解説(Remarks)

このメソッドを呼び出す前に SetContext メソッドを呼び出す必要があります。SetContext の呼び出しによって、現在のコンテキストとして使用する要求が指定されます。

属性を取得するには、EnumerateAttributes メソッドを呼び出します。EnumerateAttributes の呼び出しによって最初の属性が取得され、次の属性が存在する場合はインデックスがそれに移動します。

// Set the context. The value nContext (long) would be the same
// as the context parameter in ICertPolicy::VerifyRequest.
// hr is defined as an HRESULT.
// pCertServerPolicy has been used to call SetContext previously.
hr = pCertServerPolicy->SetContext(nContext);
if (FAILED(hr))
{
    printf("Failed SetContext [%x]\n", hr);
    goto error;
}

// Setup the enumeration.
hr = pCertServerPolicy->EnumerateAttributesSetup(0);
if (FAILED(hr))
{
    printf("Failed EnumerateAttributesSetup [%x]\n", hr);
    goto error;
}
vtbl 19 HRESULT EnumerateAttributes(LPWSTR* pstrAttributeName)

現在の属性の名前を取得し、内部の列挙ポインターを次の属性に移動します。

pstrAttributeNameLPWSTR*out属性名へのポインター。

戻り値

C++

メソッドが成功した場合、S_OK を返し、pstrAttributeName パラメーターに属性の名前を格納する BSTR が設定されます。最後の属性が既に列挙されている場合は S_FALSE が返されます。

このメソッドを使用するには、BSTR 型の変数を作成し、その変数に NULL を設定して、その変数のアドレスを pstrAttributeName として渡します。

BSTR の使用を終えたら、SysFreeString 関数を呼び出して解放してください。

メソッドが失敗した場合、エラーを示す HRESULT 値を返します。一般的なエラーコードの一覧については、Common HRESULT Values を参照してください。

VB

属性の名前を含む文字列を返します。最後の属性が既に列挙されている場合は空の文字列を返します。

解説(Remarks)

EnumerateAttributes メソッドを初めて呼び出す前に、EnumerateAttributesSetup メソッドを呼び出して、列挙ポインターを最初の属性に初期化します。

列挙が完了したら、EnumerateAttributesClose メソッドを呼び出して、列挙の呼び出しで使用したリソースを解放します。

vtbl 20 HRESULT EnumerateAttributesClose()

属性の列挙に関連するリソースを解放します。

戻り値

VB

メソッドが成功した場合、S_OK を返します。

メソッドが失敗した場合、エラーを示す HRESULT 値を返します。一般的なエラーコードの一覧については、Common HRESULT Values を参照してください。

解説(Remarks)

すべてのポリシーモジュールは、EnumerateAttributesSetup および EnumerateAttributes メソッドを呼び出した後に、EnumerateAttributesClose メソッドを呼び出す必要があります。

// Close the enumeration.
// hr is defined as an HRESULT.
hr = pCertServerPolicy->EnumerateAttributesClose();
if (FAILED(hr))
{
    printf("Failed EnumerateAttributesClose [%x]\n", hr);
    goto error;
}
出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

HSP用 COM定義

#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"

出力引数:
#define global IID_ICertServerPolicy "{AA000922-FFBE-11CF-8800-00A0C903B83C}"
#usecom global ICertServerPolicy IID_ICertServerPolicy "{}"
#comfunc global ICertServerPolicy_SetContext                    7 int
#comfunc global ICertServerPolicy_GetRequestProperty            8 wstr,int,var
#comfunc global ICertServerPolicy_GetRequestAttribute           9 wstr,var
#comfunc global ICertServerPolicy_GetCertificateProperty        10 wstr,int,var
#comfunc global ICertServerPolicy_SetCertificateProperty        11 wstr,int,var
#comfunc global ICertServerPolicy_GetCertificateExtension       12 wstr,int,var
#comfunc global ICertServerPolicy_GetCertificateExtensionFlags  13 var
#comfunc global ICertServerPolicy_SetCertificateExtension       14 wstr,int,int,var
#comfunc global ICertServerPolicy_EnumerateExtensionsSetup      15 int
#comfunc global ICertServerPolicy_EnumerateExtensions           16 var
#comfunc global ICertServerPolicy_EnumerateExtensionsClose      17
#comfunc global ICertServerPolicy_EnumerateAttributesSetup      18 int
#comfunc global ICertServerPolicy_EnumerateAttributes           19 var
#comfunc global ICertServerPolicy_EnumerateAttributesClose      20
; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。
; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。
; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。
; ※IDispatch 実装。HSP では comobj 経由でメソッド名による呼び出しも可能(vtbl 不要)。