IBackgroundCopyJobHttpOptions
COM公式ドキュメント
証明書ベースのクライアント認証に使用するクライアント証明書や、HTTP リクエストに含めるカスタムヘッダーを指定するためのインターフェイスです。
メソッド 8
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
HTTPS (SSL) リクエストでのクライアント認証に使用するクライアント証明書の識別子を指定します。
| StoreLocation | BG_CERT_STORE_LOCATION | in | 証明書の検索に使用するシステムストアの場所を示します。指定可能な値については、BG_CERT_STORE_LOCATION 列挙型を参照してください。 | ||||||||||
| StoreName | LPWSTR | in | 証明書ストアの名前を含む、NULL 終端の文字列です。文字列は NULL 終端文字を含めて 256 文字までに制限されます。次のシステムストアのいずれか、またはアプリケーション定義のストアを指定できます。ストアはローカルでもリモートでもかまいません。
| ||||||||||
| pCertHashBlob | BYTE* | in | 証明書を識別する SHA1 ハッシュです。ハッシュには 20 バイトのバッファーを使用します。詳細については「解説」を参照してください。 |
戻り値
次の表に、返される可能性のある値の一部を示します。
| 戻り値 | 説明 |
|---|---|
| 成功しました。 | |
| ユーザーにストアの場所へアクセスする権限がありません。 | |
| StoreLocation パラメーターの値が BG_CERT_STORE_LOCATION 列挙型に定義されていません。 | |
|
StoreName パラメーターに一致するストアが見つかりませんでした。 |
| ハッシュに一致する証明書が見つかりませんでした。 | |
| StoreName または pCertHashBlob パラメーターに NULL は指定できません。 | |
| pCertHashBlob バッファーのサイズが 20 バイトではありません。 | |
| StoreName パラメーターが 256 文字を超えています。 | |
| ジョブの状態が BG_JOB_STATE_CANCELLED または BG_JOB_STATE_ACKNOWLEDGED であってはなりません。 |
解説(Remarks)
クライアント証明書を指定できるのはジョブの所有者だけです。ジョブの所有権が変わると、BITS はジョブから証明書を削除します。
クライアント証明書は、HTTP または HTTPS プロトコルを使用するリモートファイルに対してのみ適用されます。証明書はすべてのジョブの種類に指定できます。
Web サイトが SSL クライアント証明書を必須とはしないが受け入れる構成で、かつ BITS ジョブがクライアント証明書を指定していない場合、ジョブは ERROR_WINHTTP_CLIENT_AUTH_CERT_NEEDED (0x80072f0c) で失敗します。
ジョブまたはアプリケーション用に証明書を作成する場合、その証明書の識別子 (拇印) をレジストリまたはデータベースに保存しておき、証明書が必要なジョブで使用できます。また、ストア内の証明書を列挙してユーザーに選択させることもできます。もう 1 つの方法として、CertFindCertificateInStore 関数を呼び出して、何らかの条件に基づいて証明書コンテキストを取得する方法があります。そのコンテキストを使用して CertGetCertificateContextProperty 関数を呼び出し、ハッシュを取得します (dwPropId には CERT_HASH_PROP_ID を指定します)。
スマートカードの拇印はサポートされていません。
例
次の例は、証明書の拇印を使用してジョブにクライアント証明書を指定する方法を示しています。この例では証明書の拇印をハードコードしており、pJob が有効なジョブを指していることを前提としています。
HRESULT hr = S_OK;
IBackgroundCopyJob* pJob = NULL;
IBackgroundCopyJobHttpOptions* pHttpOptions = NULL;
BYTE Thumbprint[] = {0xa1, 0x06, 0x6e, 0x13, 0xf2, 0x34, 0x49, 0x0a, 0x22, 0xd7, 0x6f, 0xb2, 0x80, 0xab, 0x68, 0x7d, 0x16, 0x55, 0xb3, 0x14};
// Retrieve a pointer to the IBackgroundCopyJob4 interface.
hr = pJob->QueryInterface(__uuidof(IBackgroundCopyJobHttpOptions), (void**)&pHttpOptions);
pJob->Release();
if (FAILED(hr))
{
wprintf(L"QueryInterface for HttpOptions failed with 0x%x.\n", hr);
goto cleanup;
}
// Use the client certificate in the current user's personal (MY) store.
hr = pHttpOptions->SetClientCertificateByID(BG_CERT_STORE_LOCATION_CURRENT_USER,
L"MY", Thumbprint);
if (FAILED(hr))
{
wprintf(L"pHttpOptions->SetClientCertificateByID failed with 0x%x.\n", hr);
goto cleanup;
}
cleanup:
if (pHttpOptions)
{
hr = pHttpOptions->Release();
}
HTTPS (SSL) リクエストでのクライアント認証に使用するクライアント証明書のサブジェクト名を指定します。
| StoreLocation | BG_CERT_STORE_LOCATION | in | 証明書の検索に使用するシステムストアの場所を示します。指定可能な値については、BG_CERT_STORE_LOCATION 列挙型を参照してください。 | ||||||||||
| StoreName | LPWSTR | in | 証明書ストアの名前を含む、NULL 終端の文字列です。文字列は NULL 終端文字を含めて 256 文字までに制限されます。次のシステムストアのいずれか、またはアプリケーション定義のストアを指定できます。ストアはローカルでもリモートでもかまいません。
| ||||||||||
| SubjectName | LPWSTR | in | 証明書の単純サブジェクト名 (simple subject name) を含む、NULL 終端の文字列です。サブジェクト名に複数の相対識別名 (RDN) が含まれる場合は、隣接する 1 つ以上の RDN を指定できます。複数の RDN を指定する場合、リストはカンマ区切りにします。文字列は NULL 終端文字を含めて 256 文字までに制限されます。空のサブジェクト名は指定できません。 名前にオブジェクト識別子を含めないでください。RDN は証明書に表示される順序とは逆の順序で指定する必要があります。たとえば、証明書のサブジェクト名が "CN=name1, OU=name2, O=name3" の場合、サブジェクト名は "name3, name2, name1" と指定します。 |
戻り値
次の表に、返される可能性のある値の一部を示します。
| 戻り値 | 説明 |
|---|---|
| 成功しました。 | |
| ユーザーにストアの場所へアクセスする権限がありません。 | |
| StoreLocation の値が BG_CERT_STORE_LOCATION 列挙型に定義されていません。 | |
|
StoreName パラメーターの値に一致するストアが見つかりませんでした。 |
| サブジェクト名に一致する証明書が見つかりませんでした。 | |
| StoreName または SubjectName パラメーターに NULL は指定できません。 | |
| StoreName または SubjectName パラメーターが 256 文字を超えています。 | |
| ジョブの状態が BG_JOB_STATE_CANCELLED または BG_JOB_STATE_ACKNOWLEDGED であってはなりません。 |
解説(Remarks)
クライアント証明書を指定できるのはジョブの所有者だけです。ジョブの所有権が変わると、BITS はジョブから証明書を削除します。
クライアント証明書は、HTTP または HTTPS プロトコルを使用するリモートファイルに対してのみ適用されます。証明書はすべてのジョブの種類に指定できます。
Web サイトが SSL クライアント証明書を必須とはしないが受け入れる構成で、かつ BITS ジョブがクライアント証明書を指定していない場合、ジョブは ERROR_WINHTTP_CLIENT_AUTH_CERT_NEEDED (0x80072f0c) で失敗します。
このメソッドは、サブジェクト名の文字列を使って証明書を部分一致検索します。サブジェクト名は必ずしも一意ではないため、このメソッドはストア内で指定されたサブジェクト名を持ち、かつクライアント認証用である最初の証明書を検索します。単一の証明書に絞り込める可能性を高めるため、完全なサブジェクト名を指定してください。証明書が正しくない (信頼されていない) 場合、BITS がファイルを転送しようとした時点でジョブは BG_E_HTTP_ERROR_403 で失敗し、エラー状態に移行します。サブジェクト名の一意性を保証できない場合は、代わりに IBackgroundCopyJobHttpOptions::SetClientCertificateByID メソッドの使用を検討してください。
スマートカードの証明書識別子 (拇印) はサポートされていません。
例
次の例は、証明書のサブジェクト名を使用してジョブにクライアント証明書を指定する方法を示しています。この例では、pJob が有効なジョブを指していることを前提としています。
HRESULT hr = S_OK;
IBackgroundCopyJob* pJob = NULL;
IBackgroundCopyJobHttpOptions* pHttpOptions = NULL;
// Change list of names to actual list of names.
LPWSTR pSubjectName = L"name3, name2, name1";
hr = pJob->QueryInterface(__uuidof(IBackgroundCopyJobHttpOptions), (void**)&pHttpOptions);
pJob->Release();
if (FAILED(hr))
{
wprintf(L"pJob->QueryInterface failed with 0x%x.\n", hr);
goto cleanup;
}
// Use the client certificate in the current user's personal (MY) store.
hr = pHttpOptions->SetClientCertificateByName(BG_CERT_STORE_LOCATION_CURRENT_USER,
L"MY", pSubjectName));
if (FAILED(hr))
{
wprintf(L"pHttpOptions->SetClientCertificateByName failed with 0x%x.\n", hr);
goto cleanup;
}
cleanup:
if (pHttpOptions)
{
hr = pHttpOptions->Release();
}
ジョブからクライアント証明書を削除します。
戻り値
次の表に、返される可能性のある値の一部を示します。
| 戻り値 | 説明 |
|---|---|
| 証明書を正常に削除しました。 | |
| ジョブに証明書が指定されていません。 | |
| ジョブの状態が BG_JOB_STATE_CANCELLED または BG_JOB_STATE_ACKNOWLEDGED であってはなりません。 |
解説(Remarks)
証明書を指定するには、IBackgroundCopyJobHttpOptions::SetClientCertificateByID メソッドまたは IBackgroundCopyJobHttpOptions::SetClientCertificateByName メソッドを使用します。
ジョブからクライアント証明書を取得します。
| pStoreLocation | BG_CERT_STORE_LOCATION* | out | 証明書の検索に使用するシステムストアの場所を示します。指定可能な値については、BG_CERT_STORE_LOCATION 列挙型を参照してください。 |
| pStoreName | LPWSTR* | out | 証明書ストアの名前を含む、NULL 終端の文字列です。使用後に文字列を解放するには、 CoTaskMemFree 関数を呼び出します。 |
| ppCertHashBlob | BYTE** | out | 証明書を識別する SHA1 ハッシュです。使用後に BLOB を解放するには、 CoTaskMemFree 関数を呼び出します。 |
| pSubjectName | LPWSTR* | out | 証明書の単純サブジェクト名を含む、NULL 終端の文字列です。サブジェクト名内の RDN は、証明書に表示される順序とは逆の順序になります。証明書にサブジェクト名が含まれていない場合、サブジェクト名は空になることがあります。使用後に文字列を解放するには、 CoTaskMemFree 関数を呼び出します。 |
戻り値
次の表に、返される可能性のある値の一部を示します。
| 戻り値 | 説明 |
|---|---|
| 証明書を正常に取得しました。 | |
| ジョブに証明書が指定されていないか、ユーザーにその証明書へのアクセス権がありません。 | |
| いずれかのパラメーターが NULL です。 |
解説(Remarks)
証明書を指定するには、IBackgroundCopyJobHttpOptions::SetClientCertificateByID メソッドまたは IBackgroundCopyJobHttpOptions::SetClientCertificateByName メソッドを使用します。
例
次の例は、クライアント証明書に関する情報を取得する方法を示しています。この例では、pJob が有効なジョブを指していることを前提としています。
#define THUMBPRINT_SIZE 20
HRESULT hr = S_OK;
IBackgroundCopyJob* pJob = NULL;
IBackgroundCopyJobHttpOptions* pHttpOptions = NULL;
GUID JobId;
BG_CERT_STORE_LOCATION StoreLocation;
LPWSTR pStoreName = NULL;
BYTE* pThumbprint = NULL;
LPWSTR pSubjectName = NULL;
// Retrieve a pointer to the IBackgroundCopyJobHttpOptions interface.
hr = pJob->QueryInterface(__uuidof(IBackgroundCopyJobHttpOptions), (void**)&pHttpOptions);
pJob->Release();
if (FAILED(hr))
{
wprintf(L"pJob->QueryInterface failed with 0x%x.\n", hr);
goto cleanup;
}
// Retrieve information about the client certificate set on the job.
hr = pHttpOptions->GetClientCertificate(&StoreLocation, &pStoreName,
&pThumbprint, &pSubjectName);
if (S_OK == hr)
{
wprintf(L"\nLocation: %d\nStore name: %s\nSubject: %s\n",
StoreLocation, pStoreName, pSubjectName);
wprintf(L"Thumbprint: ");
for (DWORD i = 0; i < THUMBPRINT_SIZE; i++)
{
wprintf(L"%x ", pThumbprint[i]);
}
wprintf(L"\n");
CoTaskMemFree(pStoreName);
CoTaskMemFree(pThumbprint);
CoTaskMemFree(pSubjectName);
}
else if (RPC_X_BAD_STUB_DATA == hr)
{
wprintf(L"The job does not specify a client certificate or\n"
L"the user does not have permission to access the certificate.\n");
}
else
{
wprintf(L"pHttpOptions->GetClientCertificate failed with 0x%x.\n", hr);
goto cleanup;
}
cleanup:
if (pHttpOptions)
{
hr = pHttpOptions->Release();
}
HTTP リクエストに含める 1 つ以上のカスタム HTTP ヘッダーを指定します。
| RequestHeaders | LPWSTR | in | HTTP リクエストに追加するカスタムヘッダーを含む、NULL 終端の文字列です。各ヘッダーは復帰と改行 (CR/LF) 文字で終了する必要があります。文字列は NULL 終端文字を含めて 16,384 文字までに制限されます。 ジョブからカスタムヘッダーを削除するには、RequestHeaders パラメーターに NULL を設定します。 |
戻り値
次の表に、返される可能性のある値の一部を示します。
| 戻り値 | 説明 |
|---|---|
| 成功しました。 | |
| カスタムヘッダーの長さが 16 KB を超えています。 | |
| ジョブの状態が BG_JOB_STATE_CANCELLED または BG_JOB_STATE_ACKNOWLEDGED であってはなりません。 |
解説(Remarks)
カスタムヘッダーは、HTTP または HTTPS プロトコルを使用するリモートファイルに対してのみ適用されます。カスタムヘッダーはすべてのジョブの種類に指定できます。
カスタムヘッダーを指定できるのはジョブの所有者だけです。ジョブの所有権が変わると、BITS はジョブからヘッダーを削除します。
複数の HTTP リクエストが送信される場合、ヘッダーは各リクエストとともに送信される点に注意してください。
カスタムヘッダーを処理する ISAPI は、ヘッダーが無効な場合に HTTP エラーを返すことがあります。BITS がそのエラーをどのように処理するかの詳細については、Handling Server Application Errors を参照してください。
例
次の例は、ジョブにカスタムヘッダーを指定する方法を示しています。この例では、pJob が有効なジョブを指していることを前提としています。
// Custom headers to include in job.
#define HEADERS L"MyHeader_1: Header One Value\r\n" \
L"MyHeader_2: Header Two Value\r\n" \
L"MyHeader_3: Header Three Value\r\n"
HRESULT hr = S_OK;
IBackgroundCopyJob* pJob = NULL;
IBackgroundCopyJobHttpOptions* pHttpOptions = NULL;
hr = pJob->QueryInterface(__uuidof(IBackgroundCopyJobHttpOptions), (void**)&pHttpOptions);
pJob->Release();
if (FAILED(hr))
{
wprintf(L"pJob->QueryInterface failed with 0x%x.\n", hr);
goto cleanup;
}
hr = pHttpOptions->SetCustomHeaders(HEADERS);
if (FAILED(hr))
{
wprintf(L"pHttpOptions->SetCustomHeaders failed with 0x%x.\n", hr);
goto cleanup;
}
cleanup:
if (pHttpOptions)
{
hr = pHttpOptions->Release();
}
以前の IBackgroundCopyJobHttpOptions::SetCustomHeaders の呼び出しで設定されたカスタムヘッダー (つまり、BITS がリモートへ送信するヘッダーであり、BITS がリモートから受信するヘッダーではありません) を取得します。
| pRequestHeaders | LPWSTR* | out | カスタムヘッダーを含む、NULL 終端の文字列です。各ヘッダーは復帰と改行 (CR/LF) 文字で終了します。使用後に文字列を解放するには、 CoTaskMemFree 関数を呼び出します。 |
戻り値
次の表に、返される可能性のある値の一部を示します。
| 戻り値 | 説明 |
|---|---|
| ヘッダーを正常に取得しました。 | |
| ジョブにカスタムヘッダーが指定されていません。 | |
| カスタムヘッダーを取得する権限がないか、ジョブに対して [IBackgroundCopyJobHttpOptions3::MakeCustomHeadersWriteOnly](/windows/desktop/api/bits10_3/nf-bits10_3-ibackgroundcopyjobhttpoptions3-makecustomheaderswriteonly) が呼び出されています。 | |
| pRequestHeaders パラメーターが NULL です。 |
解説(Remarks)
カスタムヘッダーを取得できるのはジョブの所有者だけです。ヘッダーを指定するには、IBackgroundCopyJobHttpOptions::SetCustomHeaders メソッドを呼び出します。
証明書失効リストを確認するかどうか、特定の証明書エラーを無視するかどうか、およびサーバーが HTTP リクエストをリダイレクトした場合に使用するポリシーを決定する HTTP 用のフラグを設定します。
| Flags | DWORD | in | サーバーへの接続時に無視するエラーを示す HTTP セキュリティフラグです。次のフラグを 1 つ以上設定できます。
|
戻り値
解説(Remarks)
CRL チェックが要求された場合、BITS はジョブ内で HTTPS プロトコルを指定しているすべてのファイルに対してチェックを実行します。チェックは各ファイルの転送開始前に行われます。BITS がファイルを部分的にダウンロードした後にこの値を TRUE に設定した場合、BITS はジョブを再スケジュールし、そのファイルのダウンロードを最初からやり直します。すでにダウンロード済みのファイルは影響を受けません。
BITS はローカルコンピューターの CRL が最新であればそれを使用します。最新でない場合は、証明書に署名した証明機関 (CA) から CRL をダウンロードします。
次のエラーが発生した場合、ジョブは致命的エラー状態になります。
| エラーコード | 説明 |
|---|---|
| ERROR_WINHTTP_SECURE_CERT_REV_FAILED | 証明書サーバーがオフラインであるか CRL をダウンロードできないため、CRL チェックを要求できません。 |
| ERROR_WINHTTP_SECURE_CERT_REVOKED | 証明書が失効しています。 |
リダイレクトポリシーはダウンロードジョブ内のすべてのファイルに適用されます (アップロードジョブには適用されません)。
BITS 3.0 より前: リダイレクトポリシーはサポートされていません。
ポリシーが BG_HTTP_REDIRECT_POLICY_DISALLOW で、サーバーがリクエストをリダイレクトした場合、ジョブは次のいずれかのエラーコードで致命的エラー状態になります。エラーコードの説明については、HTTP Status Codes を参照してください。
- HRESULT_FROM_WIN32(HTTP_STATUS_AMBIGUOUS)
- HRESULT_FROM_WIN32(HTTP_STATUS_MOVED)
- HRESULT_FROM_WIN32(HTTP_STATUS_REDIRECT)
- HRESULT_FROM_WIN32(HTTP_STATUS_REDIRECT_METHOD)
- HRESULT_FROM_WIN32(HTTP_STATUS_REDIRECT_KEEP_VERB)
ピアキャッシュが有効で BG_HTTP_REDIRECT_POLICY_ALLOW_REPORT を指定した場合、ファイルは最終的なリダイレクト先の URL でキャッシュに格納されます。その後、ピアが元の URL でファイルをダウンロードしようとすると、ピアのキャッシュ内にファイルが見つからず、結果としてオリジンサーバーからファイルをダウンロードすることになります。
を指定し、ファイルが からダウンロードされた場合
BG_HTTP_REDIRECT_POLICY_ALLOW_REPORT を設定すると、IBackgroundCopyJob3::ReplaceRemotePrefix メソッドを呼び出したときの結果に影響する場合がある点に注意してください。サーバーがリクエストをリダイレクトした場合、BITS は元の URL をすでに最終的なリダイレクト先の URL に変更しているため、ReplaceRemotePrefix メソッドを呼び出しても元の URL を持つファイルは見つかりません。
証明書失効リストを確認するかどうか、特定の証明書エラーを無視するかどうか、およびサーバーが HTTP リクエストをリダイレクトした場合に使用するポリシーを決定する HTTP 用のフラグを取得します。
| pFlags | DWORD* | out | サーバーへの接続時に無視するエラーを示す HTTP セキュリティフラグです。次のフラグを 1 つ以上設定できます。
|
戻り値
成功した場合は S_OK を返します。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IBackgroundCopyJobHttpOptions "{F1BD1079-9F01-4BDC-8036-F09B70095066}" #usecom global IBackgroundCopyJobHttpOptions IID_IBackgroundCopyJobHttpOptions "{}" #comfunc global IBackgroundCopyJobHttpOptions_SetClientCertificateByID 3 int,wstr,var #comfunc global IBackgroundCopyJobHttpOptions_SetClientCertificateByName 4 int,wstr,wstr #comfunc global IBackgroundCopyJobHttpOptions_RemoveClientCertificate 5 #comfunc global IBackgroundCopyJobHttpOptions_GetClientCertificate 6 var,var,var,var #comfunc global IBackgroundCopyJobHttpOptions_SetCustomHeaders 7 wstr #comfunc global IBackgroundCopyJobHttpOptions_GetCustomHeaders 8 var #comfunc global IBackgroundCopyJobHttpOptions_SetSecurityFlags 9 int #comfunc global IBackgroundCopyJobHttpOptions_GetSecurityFlags 10 var ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。#define global IID_IBackgroundCopyJobHttpOptions "{F1BD1079-9F01-4BDC-8036-F09B70095066}" #usecom global IBackgroundCopyJobHttpOptions IID_IBackgroundCopyJobHttpOptions "{}" #comfunc global IBackgroundCopyJobHttpOptions_SetClientCertificateByID 3 int,wstr,sptr #comfunc global IBackgroundCopyJobHttpOptions_SetClientCertificateByName 4 int,wstr,wstr #comfunc global IBackgroundCopyJobHttpOptions_RemoveClientCertificate 5 #comfunc global IBackgroundCopyJobHttpOptions_GetClientCertificate 6 sptr,sptr,sptr,sptr #comfunc global IBackgroundCopyJobHttpOptions_SetCustomHeaders 7 wstr #comfunc global IBackgroundCopyJobHttpOptions_GetCustomHeaders 8 sptr #comfunc global IBackgroundCopyJobHttpOptions_SetSecurityFlags 9 int #comfunc global IBackgroundCopyJobHttpOptions_GetSecurityFlags 10 sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。