Compartir a través de


Método IBackgroundCopyServerCertificateValidationCallback::ValidateServerCertificate (bits10_3.h)

Método de devolución de llamada que se implementará para que pueda validar los certificados de servidor enviados cuando se abra una conexión HTTPS.

Sintaxis

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

Parámetros

job

Tipo: IBackgroundCopyJob

El trabajo.

file

Tipo: IBackgroundCopyFile

Archivo que se va a transferir.

certLength

Tipo: DWORD de

Longitud en bytes de los datos del certificado.

certData

Tipo: const BYTE []

Matriz de bytes que contiene los datos del certificado. El número de bytes debe coincidir con certLength.

certEncodingType

Tipo: DWORD de

Tipo de codificación de certificado.

certStoreLength

Tipo: DWORD de

Longitud en bytes de los datos del almacén de certificados.

certStoreData

Tipo: const BYTE []

Matriz de bytes que contiene los datos del almacén de certificados. El número de bytes debe coincidir con certStoreLength.

Valor devuelto

Devuelve S_OK para indicar que el certificado es aceptable. De lo contrario, devuelva cualquier código de error hrESULT para indicar que el certificado no es aceptable.

Observaciones

La validación del certificado se realiza en dos fases. La primera fase es la fase del sistema operativo (SO) donde el sistema operativo realiza un conjunto estándar de comprobaciones de validación en el certificado. Después, si la fase del sistema operativo pasa el certificado, se llamará a la devolución de llamada para realizar una validación adicional.

Implemente este método de validación cuando desee realizar sus propias comprobaciones en el certificado de servidor. Sus propias comprobaciones se agregan a las comprobaciones normales de validación de certificados del sistema operativo.

Si el método de validación rechaza el certificado, el trabajo pasará a BG_JOB_STATE_TRANSIENT_ERROR con un contexto de error de trabajo de BG_ERROR_CONTEXT_SERVER_CERTIFICATE_CALLBACK y el error HRESULT desde la devolución de llamada. Si no se pudo llamar a la devolución de llamada (por ejemplo, porque BITS necesitaba validar un certificado de servidor después de salir del programa), el código de error del trabajo será BG_E_SERVER_CERT_VALIDATION_INTERFACE_REQUIRED. Cuando la aplicación se ejecute a continuación, puede corregir este error estableciendo de nuevo la devolución de llamada de validación y reanudando el trabajo.

BITS llama a este método de devolución de llamada solo si implementa la interfaz IBackgroundCopyServerCertificateValidationCallback y la pasa a IBackgroundCopyJobHttpOptions3::SetServerCertificateValidationInterface.

La interfaz de validación deja de ser válida cuando finaliza la aplicación; BITS no mantiene un registro de la interfaz de validación. Como resultado, el proceso de inicialización de la aplicación debe llamar a SetServerCertificateValidationInterface en esos trabajos existentes para los que desea recibir solicitudes de validación de certificados.

Si más de una aplicación llama a SetServerCertificateValidationInterface para establecer la interfaz de notificación para el trabajo, la última aplicación que se llamará es la que recibirá notificaciones. Las demás aplicaciones no recibirán notificaciones.

Estos son los pasos generales para validar un certificado. Tenga en cuenta que estos pasos son solo un ejemplo. La validación real está bajo su control. Además, los pasos 5-7 son en gran medida los mismos que lo que hace el sistema operativo durante el paso de validación del sistema operativo.

  1. Llame a certCreateCertificateContext con certEncodingType, certDatay certLength para recuperar un CERT_CONTEXT.

  2. Declare e inicialice una estructura de CRYPT_DATA_BLOB (definida en wincrypt.h) con el blob de memoria serializado pasado a través de certStoreLength y certStoreData.

DATA_BLOB storeData{};
storeData.cbData = certStoreLength;
storeData.pbData = const_cast<PBYTE>(certStoreData);
  1. Obtenga un identificador de la cadena de certificados llamando a CertOpenStore con CERT_STORE_PROV_SERIALIZED, 0, nullptr, flags y un puntero al CRYPT_DATA_BLOB del paso 2.
  2. Obtenga un puntero a un contexto de cadena de certificados llamando a CertGetCertificateChain con nullptr, certContext, nullptr, el identificador del paso 3, los parámetros de cadena, las marcas y nullptr.
  3. Cree la directiva de validación de certificados.
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. Llame a CertVerifyCertificateChainPolicy con el tipo de directiva, el contexto de cadena, los parámetros de directiva y el estado de la directiva.
  2. Convierta el error Win32 (policyStatus.dwError) en un HRESULT y devuelva eso.

A continuación se muestra una descripción de los comportamientos de almacenamiento en caché de validación de BITS. BITS mantiene una caché por trabajo de certificados que han superado la validación personalizada. Esto es para evitar una nueva validación redundante y potencialmente costosa durante la vigencia del trabajo. La memoria caché consta de <punto de conexión del servidor,> tuplas de hash de certificado, donde punto de conexión se define como nombre del servidor:puerto. Si un trabajo ya ha permitido un certificado específico de un punto de conexión específico, no se volverá a llamar a la devolución de llamada.

Por supuesto, el certificado tendrá que pasar por la lógica de validación del sistema operativo en cada intento de conexión (puede personalizar la lógica de validación del sistema operativo con una llamada a IBackgroundCopyJobHttpOptions::SetSecurityFlags), que aborda casos de esquina sensibles al tiempo, como cuando el certificado era válido recientemente (en términos de segundos), pero ha expirado ahora.

BITS no almacena en caché los certificados que la devolución de llamada de validación proporcionada por la aplicación considera no válida. Es importante que tenga en cuenta todos los intentos de conexión incorrectos, de modo que pueda detectar implementaciones malintencionadas en el nivel de aplicación. Por ejemplo, un certificado incorrecto de un solo uso es mucho menor que miles de certificados incorrectos del mismo servidor.

La caché de certificados de un trabajo se borra en cada llamada a SetServerCertificateValidationInterface, ya que indica que la lógica de validación de certificados de servidor de la aplicación ha cambiado.

Requisitos

Requisito Valor
cliente mínimo admitido Windows 10, versión 1809 [solo aplicaciones de escritorio]
servidor mínimo admitido Windows Server 2016 [solo aplicaciones de escritorio]
encabezado de bits10_3.h (include Bits.h)
biblioteca de Bits.lib
DLL de Bits.dll

Consulte también

IBackgroundCopyJobHttpOptions3::SetServerCertificateValidationInterface