Метод 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код ошибки, чтобы указать, что сертификат неприемлем.
Замечания
Проверка сертификата выполняется на двух этапах. Первым этапом является этап операционной системы ( ОС), где ОС выполняет стандартный набор проверок проверки сертификата. После этого, если этап ОС проходит сертификат, обратный вызов будет вызван для выполнения дополнительной проверки.
Реализуйте этот метод проверки, если требуется выполнить собственные проверки на сертификат сервера. Ваши собственные проверки в дополнение к обычным проверкам сертификата ОС.
Если метод проверки отклоняет сертификат, задание перейдет в 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 не поддерживает запись интерфейса проверки. В результате процесс инициализации приложения должен вызывать SetServerCertificateValidationInterface для существующих заданий, для которых требуется получать запросы на проверку сертификатов.
Если несколько вызовов приложений SetServerCertificateValidationInterface, чтобы задать интерфейс уведомлений для задания, последнее приложение для вызова — это тот, который получит уведомления. Другие приложения не будут получать уведомления.
Ниже приведены общие действия по проверке сертификата. Помните, что эти шаги являются лишь примером. Фактическая проверка находится под вашим контролем. Кроме того, шаги 5-7 в значительной степени совпадают с тем, что операционная система выполняет на этапе проверки ОС.
Вызов CertCreateCertificateContext с
certEncodingType
,certData
иcertLength
для получения CERT_CONTEXT.Объявите и инициализируйте структуру CRYPT_DATA_BLOB (определенную в
wincrypt.h
) с сериализованным большим двоичным объектом памяти, передаваемым черезcertStoreLength
иcertStoreData
.
DATA_BLOB storeData{};
storeData.cbData = certStoreLength;
storeData.pbData = const_cast<PBYTE>(certStoreData);
- Получите дескриптор в цепочке сертификатов, вызвав CertOpenStore с CERT_STORE_PROV_SERIALIZED, 0, nullptr, флагами и указателем на CRYPT_DATA_BLOB из шага 2.
- Получите указатель на контекст цепочки сертификатов, вызвав CertGetCertificateChain с nullptr,
certContext
, nullptr, дескриптор из шага 3, параметры цепочки, флаги и nullptr. - Создайте политику проверки сертификата.
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;
- Вызов CertVerifyCertificateChainPolicy с типом политики, контекстом цепочки, параметрами политики и состоянием политики.
- Преобразуйте ошибку Win32 (
policyStatus.dwError
) в HRESULT и верните это.
Ниже описано поведение кэширования проверки BITS. BITS поддерживает кэш сертификатов для каждого задания, прошедших настраиваемую проверку. Это позволяет избежать избыточной и потенциально дорогой повторной проверки за время существования задания. Кэш состоит из конечной точки сервера
Конечно, сертификат должен пройти через логику проверки ОС при каждой попытке подключения (можно настроить логику проверки ОС с вызовом IBackgroundCopyJobHttpOptions::SetSecurityFlags), в котором рассматриваются случаи с учетом времени, например, когда сертификат был действителен в последнее время (с точки зрения секунд), но срок действия истек.
BITS не кэширует сертификаты, которые считаются недопустимыми обратным вызовом проверки, предоставленным приложением. Важно знать обо всех неудачных попытках подключения, чтобы обнаружить вредоносные развертывания на уровне приложения. Например, одноуровневый недопустимый сертификат гораздо меньше, чем тысячи плохих сертификатов с одного сервера.
Кэш сертификатов задания очищается при каждом вызове SetServerCertificateValidationInterface, так как он указывает на то, что логика проверки сертификата сервера приложения изменилась.
Требования
Требование | Ценность |
---|---|
минимальные поддерживаемые клиентские | Windows 10 версии 1809 [только классические приложения] |
минимальный поддерживаемый сервер | Windows Server 2016 [только классические приложения] |
заголовка | bits10_3.h (include Bits.h) |
библиотеки |
Bits.lib |
DLL | Bits.dll |
См. также
IBackgroundCopyJobHttpOptions3::SetServerCertificateValidationInterface