Compartir a través de


Listas de revocación de certificados

[La característica asociada a esta página, DirectShow, es una característica heredada. Se ha reemplazado por MediaPlayer, IMFMediaEngine y Captura de audio/vídeo en Media Foundation. Esas características se han optimizado para Windows 10 y Windows 11. Microsoft recomienda encarecidamente que el nuevo código use MediaPlayer, IMFMediaEngine y Audio/Video Capture en Media Foundation en lugar de DirectShow, siempre que sea posible. Microsoft sugiere que el código existente que usa las API heredadas se reescriba para usar las nuevas API si es posible.

En este tema se describe cómo examinar la lista de revocación de certificados (CRL) para los controladores revocados al usar el Protocolo de protección de salida certificada (COPP).

La CRL contiene resúmenes de certificados revocados y solo microsoft los puede proporcionar y firmar. La CRL se distribuye a través de licencias de administración de derechos digitales (DRM). La CRL puede revocar cualquier certificado de la cadena de certificados del controlador. Si se revoca algún certificado de la cadena, ese certificado y todos los certificados debajo de él en la cadena también se revocan.

Para obtener la CRL, la aplicación debe usar el SDK de Windows Media Format, versión 9 o posterior, y realizar los pasos siguientes:

  1. Llame a WMCreateReader para crear el objeto lector del SDK de Windows Media Format.
  2. Consulte el objeto lector para la interfaz IWMDRMReader .
  3. Llame a IWMDRMReader::GetDRMProperty con un valor de g_wszWMDRMNet_Revocation para obtener la CRL. Debe llamar a este método dos veces: una vez para obtener el tamaño del búfer que se va a asignar y una vez para rellenar el búfer. La segunda llamada devuelve una cadena que contiene la CRL. Toda la cadena está codificada en base 64.
  4. Descodifique la cadena codificada en base 64. Puede usar la función CryptStringToBinary para hacerlo. Esta función forma parte de CryptoAPI.

Nota:

Para usar la interfaz IWMDRMReader , debe obtener una biblioteca DRM estática de Microsoft y vincular la aplicación a este archivo de biblioteca. Para obtener más información, vea el tema "Obtención de la biblioteca DRM necesaria" en la documentación del SDK de Windows Media Format.

 

Si la CRL no está presente en el equipo del usuario, el método GetDRMProperty devuelve NS_E_DRM_UNSUPPORTED_PROPERTY. Actualmente, la única manera de obtener la CRL es adquirir una licencia DRM.

El código siguiente muestra una función que devuelve la CRL:

////////////////////////////////////////////////////////////////////////
//  Name: GetCRL
//  Description: Gets the certificate revocation list (CRL).
//
//  ppBuffer: Receives a pointer to the buffer that contains the CRL.
//  pcbBuffer: Receives the size of the buffer returned in ppBuffer.
//
//  The caller must free the returned buffer by calling CoTaskMemFree.
////////////////////////////////////////////////////////////////////////
HRESULT GetCRL(BYTE **ppBuffer, DWORD *pcbBuffer)
{
    IWMReader *pReader = NULL;
    IWMDRMReader *pDrmReader = NULL;
    HRESULT hr = S_OK;

    // DRM attribute data.
    WORD cbAttributeLength = 0;
    BYTE *pDataBase64 = NULL;
    WMT_ATTR_DATATYPE type;

    // Buffer for base-64 decoded CRL.
    BYTE *pCRL = NULL;
    DWORD cbCRL = 0;

    // Create the WMReader object.
    hr = WMCreateReader(NULL, 0, &pReader);

    // Query for the IWMDRMReader interface.
    if (SUCCEEDED(hr))
    {
        hr = pReader->QueryInterface(
            IID_IWMDRMReader, (void**)&pDrmReader);
    }

    // Call GetDRMProperty once to find the size of the buffer.
    if (SUCCEEDED(hr))
    {
        hr = pDrmReader->GetDRMProperty(
            g_wszWMDRMNET_Revocation,
            &type,
            NULL,
            &cbAttributeLength
            );
    }

    // Allocate a buffer.
    if (SUCCEEDED(hr))
    {
        pDataBase64 = (BYTE*)CoTaskMemAlloc(cbAttributeLength);
        if (pDataBase64 == NULL)
        {
            hr = E_OUTOFMEMORY;
        }
    }

    // Call GetDRMProperty again to get the property.
    if (SUCCEEDED(hr))
    {
        hr = pDrmReader->GetDRMProperty(
            g_wszWMDRMNET_Revocation,
            &type,
            pDataBase64,
            &cbAttributeLength
            );
    }

    // Find the size of the buffer for the base-64 decoding.
    if (SUCCEEDED(hr))
    {
        BOOL bResult = CryptStringToBinary(
            (WCHAR*)pDataBase64,    // Base-64 encoded string.
            0,                      // Null-terminated.
            CRYPT_STRING_BASE64,    
            NULL,                   // Buffer (NULL).
            &cbCRL,                 // Receives the size of the buffer. 
            NULL, NULL              // Optional.
            );
        if (!bResult)
        {
            hr = __HRESULT_FROM_WIN32(GetLastError());
        }
    }

    // Allocate a buffer for the CRL.
    if (SUCCEEDED(hr))
    {
        pCRL = (BYTE*)CoTaskMemAlloc(cbCRL);
        if (pCRL == NULL)
        {
            hr = E_OUTOFMEMORY;
        }
    }

    // Base-64 decode to get the CRL.
    if (SUCCEEDED(hr))
    {
        BOOL bResult = CryptStringToBinary(
            (WCHAR*)pDataBase64,    // Base-64 encoded string.
            0,                      // Null-terminated.
            CRYPT_STRING_BASE64,    
            pCRL,                   // Buffer.
            &cbCRL,                 // Receives the size of the buffer. 
            NULL, NULL              // Optional.
            );
        if (!bResult)
        {
            hr = __HRESULT_FROM_WIN32(GetLastError());
        }
    }

    // Return the buffer to the caller. Caller must free the buffer.
    if (SUCCEEDED(hr))
    {
        *ppBuffer = pCRL;
        *pcbBuffer = cbCRL;
    }
    else
    {
        CoTaskMemFree(pCRL);
    }

    CoTaskMemFree(pDataBase64);
    SAFE_RELEASE(pReader);
    SAFE_RELEASE(pDrmReader);
    return hr;
}

A continuación, la aplicación debe comprobar que la CRL es válida. Para ello, compruebe que el certificado CRL, que forma parte de la CRL, está firmado directamente por el certificado raíz de Microsoft y tiene el valor del elemento SignCRL establecido en 1. Además, compruebe la firma de la CRL.

Una vez comprobada la CRL, la aplicación puede almacenarla. El número de versión crL también debe comprobarse antes de almacenarlo para que la aplicación almacene siempre la versión más reciente.

La CRL tiene el formato siguiente.

Sección Contenido
Encabezado Número de entradas crL de 32 bits de la versión de 32 bits
Entradas de revocación Varias entradas de revocación de 160 bits
Certificado Longitud de certificado de 32 bits Certificado de longitudvariable
Firma Tipo de firma de 8 bits Longitud de firma de 16 bitsFirma de longitud variable

 

Nota:

Todos los valores enteros no están firmados y se representan en notación big-endian (orden de bytes de red).

 

Descripciones de la sección CRL

Header

El encabezado contiene el número de versión de la CRL y el número de entradas de revocación en la CRL. Una CRL puede contener cero o más entradas.

Entradas de revocación

Cada entrada de revocación es la síntesis de 160 bits de un certificado revocado. Compare este resumen con el elemento DigestValue dentro del certificado.

Certificado

La sección certificate contiene un valor de 32 bits que indica la longitud (en bytes) del certificado XML y su cadena de certificados, junto con una matriz de bytes que contiene el certificado XML de la entidad de certificación (CA) y la cadena de certificados que tiene Microsoft como raíz. El certificado debe estar firmado por una entidad de certificación que tenga la autoridad para emitir CRL.

Nota:

El certificado no debe terminar en null.

 

Signature

La sección de firma contiene el tipo y la longitud de la firma, y la propia firma digital. El tipo de 8 bits se establece en 2 para indicar que usa SHA-1 con cifrado RSA de 1024 bits. La longitud es un valor de 16 bits que contiene la longitud de la firma digital en bytes. La firma digital se calcula en todas las secciones anteriores de la CRL.

La firma se calcula mediante el esquema de firma digital RSASSA-PSS que se define en PKCS #1 (versión 2.1). La función hash es SHA-1, que se define en el Estándar federal de procesamiento de información (FIPS) 180-2, y la función de generación de máscaras es MGF1, que se define en la sección B.2.1 en PKCS #1 (versión 2.1). Las operaciones RSASP1 y RSAVP1 usan RSA con un módulo de 1024 bits con un exponente de comprobación de 65537.

Uso del Protocolo de protección de salida certificada (COPP)