共用方式為


IBackgroundCopyServerCertificateValidationCallback::ValidateServerCertificate 方法 (bits10_3.h)

您實作的回呼方法,將呼叫 ,以便驗證 HTTPS 連線開啟時所傳送的伺服器憑證。

語法

HRESULT ValidateServerCertificate(
  IBackgroundCopyJob  *job,
  IBackgroundCopyFile *file,
  DWORD               certLength,
  const BYTE []       certData,
  DWORD               certEncodingType,
  DWORD               certStoreLength,
  const BYTE []       certStoreData
);

參數

job

類型:IBackgroundCopyJob*

作業。

file

類型:IBackgroundCopyFile*

正在傳輸的檔案。

certLength

類型:DWORD

憑證數據的位元組長度。

certData

類型:const BYTE []

包含憑證數據的位元組陣列。 位元組數目必須符合 certLength

certEncodingType

類型:DWORD

憑證編碼類型。

certStoreLength

類型:DWORD

證書存儲數據的位元組長度。

certStoreData

類型:const BYTE []

包含證書存儲數據的位元組陣列。 位元組數目必須符合 certStoreLength

傳回值

傳回 S_OK,表示憑證是可接受的。 否則,傳回任何 HRESULT錯誤碼,表示憑證無法接受。

言論

憑證驗證會在兩個階段中執行。 第一個階段是操作系統 (OS) 階段,操作系統會在憑證上執行一組標準驗證檢查。 之後,如果OS階段通過憑證,系統會呼叫您的回呼來執行額外的驗證。

當您想要在伺服器證書上執行自己的檢查時,請實作此驗證方法。 除了一般 OS 憑證驗證檢查之外,您自己的檢查也一併進行。

如果您的驗證方法拒絕憑證,作業將會轉換至 BG_JOB_STATE_TRANSIENT_ERROR,且作業內容為 BG_ERROR_CONTEXT_SERVER_CERTIFICATE_CALLBACK,並從回呼 HRESULT 錯誤。 如果無法呼叫您的回呼(例如,因為程式結束之後需要 BITS 來驗證伺服器證書),則作業錯誤碼會 BG_E_SERVER_CERT_VALIDATION_INTERFACE_REQUIRED。 當您的應用程式下次執行時,可以再次設定驗證回呼並繼續作業,以修正此錯誤。

BITS 只有在實作 IBackgroundCopyServerCertificateValidationCallback 介面 ,並將其傳遞至 IBackgroundCopyJobHttpOptions3::SetServerCertificateValidationInterface時,BITS 才會呼叫這個回呼方法。

當您的應用程式終止時,驗證介面會變成無效;BITS 不會維護驗證介面的記錄。 因此,應用程式的初始化程式應該在您想要接收憑證驗證要求的現有作業上呼叫 SetServerCertificateValidationInterface

如果一個以上的應用程式呼叫 SetServerCertificateValidationInterface 來設定作業的通知介面,則最後一個呼叫它的應用程式就是接收通知的應用程式。 其他應用程式將不會收到通知。

以下是驗證憑證的一般步驟。 請注意,這些步驟只是範例。 實際的驗證位於您的控制之下。 此外,步驟 5-7 基本上與 OS 在 OS 驗證步驟期間所做的相同。

  1. 使用 certEncodingTypecertDatacertLength 呼叫 CertCreateCertificateContext,以擷取 CERT_CONTEXT

  2. 使用透過 certStoreLengthcertStoreData傳遞的串行化記憶體 Blob 宣告和初始化 CRYPT_DATA_BLOB 結構(定義於 wincrypt.h中)。

DATA_BLOB storeData{};
storeData.cbData = certStoreLength;
storeData.pbData = const_cast<PBYTE>(certStoreData);
  1. 使用步驟 2 中的 CERT_STORE_PROV_SERIALIZED、0、nullptr、旗標和指向 CRYPT_DATA_BLOB 的指標,呼叫 CertOpenStore,以取得憑證鏈結的句柄。
  2. 使用 nullptr、、nullptr、步驟 3、鏈結參數、旗標和 nullptr 呼叫 CertGetCertificateChain,以取得憑證鏈結內容的指標。
  3. 建立憑證驗證原則。
CERT_CHAIN_POLICY_PARA policyParams{};
policyParams.cbSize = sizeof(policyParams);
policyParams.dwFlags =
    CERT_CHAIN_POLICY_IGNORE_NOT_TIME_VALID_FLAG |
    CERT_CHAIN_POLICY_IGNORE_WRONG_USAGE_FLAG |
    CERT_CHAIN_POLICY_IGNORE_INVALID_NAME_FLAG |
    CERT_CHAIN_POLICY_ALLOW_UNKNOWN_CA_FLAG;
  1. 使用原則類型、鏈結內容、原則參數和原則狀態,呼叫 CertVerifyCertificateChainPolicy
  2. 將 Win32 錯誤 (policyStatus.dwError) 轉換為 HRESULT,並傳回該錯誤。

接下來的 BITS 驗證快取行為描述。 BITS 會維護已通過自定義驗證的憑證個別作業快取。 這是為了避免在作業存留期內重複且可能耗費資源的重新驗證。 快取包含 伺服器端點、憑證哈希 元組,其中 端點 定義為伺服器名稱:port。 如果作業已經允許來自特定端點的特定憑證,則不會再次呼叫回呼。

當然,憑證必須在每個連線嘗試上通過OS驗證邏輯(您可以使用呼叫 IBackgroundCopyJobHttpOptions::SetSecurityFlags來自定義 OS 驗證邏輯),這可解決時間敏感的邊角案例,例如憑證最近有效時間(以秒為單位),但現在已過期。

BITS 不會快取應用程式提供的驗證回呼視為無效的憑證。 請務必注意所有未成功的連線嘗試,以便偵測應用程式層級的惡意部署。 例如,一次性錯誤的憑證比來自同一部伺服器的數千個不良憑證要少得多。

作業的憑證快取會在每次呼叫 SetServerCertificateValidationInterface 時清除,因為它表示應用程式的伺服器證書驗證邏輯已變更。

要求

要求 價值
最低支援的用戶端 Windows 10 版本 1809 [僅限傳統型應用程式]
支援的最低伺服器 Windows Server 2016 [僅限傳統型應用程式]
標頭 bits10_3.h (包括 Bits.h)
連結庫 Bits.lib
DLL Bits.dll

另請參閱

IBackgroundCopyJobHttpOptions3::SetServerCertificateValidationInterface