Bagikan melalui


Daftar Pencabutan Sertifikat

[Fitur yang terkait dengan halaman ini, DirectShow, adalah fitur warisan. Ini telah digantikan oleh MediaPlayer, IMFMediaEngine, dan Pengambilan Audio/Video di Media Foundation. Fitur-fitur tersebut telah dioptimalkan untuk Windows 10 dan Windows 11. Microsoft sangat menyarankan agar kode baru menggunakan MediaPlayer, IMFMediaEngine , dan Pengambilan Audio/Video di Media Foundation alih-alih DirectShow, jika memungkinkan. Microsoft menyarankan agar kode yang ada yang menggunakan API warisan ditulis ulang untuk menggunakan API baru jika memungkinkan.]

Topik ini menjelaskan cara memeriksa daftar pencabutan sertifikat (CRL) untuk driver yang dicabut saat menggunakan Certified Output Protection Protocol (COPP).

CRL berisi hash sertifikat yang dicabut dan hanya dapat disediakan dan ditandatangani oleh Microsoft. CRL didistribusikan melalui lisensi manajemen hak digital (DRM). CRL dapat mencabut sertifikat apa pun dalam rantai sertifikat driver. Jika ada sertifikat dalam rantai yang dicabut, maka sertifikat tersebut dan semua sertifikat di bawahnya dalam rantai juga dicabut.

Untuk mendapatkan CRL, aplikasi harus menggunakan Windows Media Format SDK, versi 9 atau yang lebih baru, dan melakukan langkah-langkah berikut:

  1. Panggil WMCreateReader untuk membuat objek pembaca Windows Media Format SDK.
  2. Kueri objek pembaca untuk antarmuka IWMDRMReader .
  3. Panggil IWMDRMReader::GetDRMProperty dengan nilai g_wszWMDRMNet_Revocation untuk mendapatkan CRL. Anda harus memanggil metode ini dua kali: Sekali untuk mendapatkan ukuran buffer untuk dialokasikan, dan sekali untuk mengisi buffer. Panggilan kedua mengembalikan string yang berisi CRL. Seluruh string dikodekan base-64.
  4. Dekode string yang dikodekan base-64. Anda dapat menggunakan fungsi CryptStringToBinary untuk melakukan ini. Fungsi ini adalah bagian dari CryptoAPI.

Catatan

Untuk menggunakan antarmuka IWMDRMReader , Anda harus mendapatkan pustaka DRM statis dari Microsoft dan menautkan aplikasi Anda ke file pustaka ini. Untuk informasi selengkapnya, lihat topik "Mendapatkan Pustaka DRM yang Diperlukan" dalam dokumentasi Windows Media Format SDK.

 

Jika CRL tidak ada di komputer pengguna, metode GetDRMProperty mengembalikan NS_E_DRM_UNSUPPORTED_PROPERTY. Saat ini, satu-satunya cara untuk mendapatkan CRL adalah dengan memperoleh lisensi DRM.

Kode berikut menunjukkan fungsi yang mengembalikan 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;
}

Selanjutnya, aplikasi harus memverifikasi bahwa CRL valid. Untuk melakukannya, verifikasi bahwa sertifikat CRL, yang merupakan bagian dari CRL, langsung ditandatangani oleh Sertifikat Akar Microsoft dan memiliki nilai elemen SignCRL yang diatur ke 1. Selain itu, verifikasi tanda tangan CRL.

Setelah CRL diverifikasi, aplikasi dapat menyimpannya. Nomor versi CRL juga harus diperiksa sebelum disimpan sehingga aplikasi selalu menyimpan versi terbaru.

CRL memiliki format berikut.

Bagian Konten
Header Jumlah entri CRL versi 32-bit 32-bit
Entri Pencabutan Beberapa entri pencabutan 160-bit
Sertifikat Sertifikat 32-bit lengthVariable-length
Tanda Tangan Tanda tangan 8-bit type16-bit signature lengthVariable-length signature

 

Catatan

Semua nilai bilangan bulat tidak ditandatangani dan diwakili dalam notasi big-endian (urutan byte jaringan).

 

Deskripsi Bagian CRL

Header

Header berisi nomor versi CRL dan jumlah entri pencabutan dalam CRL. CRL dapat berisi nol atau beberapa entri.

Entri pencabutan

Setiap entri pencabutan adalah hash 160-bit dari sertifikat yang dicabut. Bandingkan hash ini dengan elemen DigestValue dalam sertifikat.

Sertifikat

Bagian sertifikat berisi nilai 32-bit yang menunjukkan panjang (dalam byte) sertifikat XML dan rantai sertifikatnya, bersama dengan array byte yang berisi sertifikat XML Otoritas Sertifikat (CA) dan rantai sertifikat yang memiliki Microsoft sebagai Root. Sertifikat harus ditandatangani oleh CA yang memiliki otoritas untuk menerbitkan CRL.

Catatan

Sertifikat tidak boleh dihentikan null.

 

Tanda tangan

Bagian tanda tangan berisi jenis dan panjang tanda tangan, dan tanda tangan digital itu sendiri. Jenis 8-bit diatur ke 2 untuk menunjukkan bahwa ia menggunakan SHA-1 dengan enkripsi RSA 1024-bit. Panjangnya adalah nilai 16-bit yang berisi panjang tanda tangan digital dalam byte. Tanda tangan digital dihitung di semua bagian sebelumnya dari CRL.

Tanda tangan dihitung menggunakan skema tanda tangan digital RSASSA-PSS yang ditentukan dalam PKCS #1 (versi 2.1). Fungsi hash adalah SHA-1, yang didefinisikan dalam Federal Information Processing Standard (FIPS) 180-2, dan fungsi pembuatan masker adalah MGF1, yang didefinisikan dalam bagian B.2.1 di PKCS #1 (versi 2.1). Operasi RSASP1 dan RSAVP1 menggunakan RSA dengan modulus 1024-bit dengan eksponen verifikasi 65537.

Menggunakan Protokol Perlindungan Output Bersertifikat (COPP)