Bagikan melalui


Memvalidasi Rantai 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 memvalidasi rantai sertifikat driver saat menggunakan Certified Output Protection Protocol (COPP).

Rantai sertifikat driver grafis adalah dokumen XML. Rantai sertifikat berisi tiga sertifikat. Sertifikat pertama disebut sertifikat daun, dan merupakan sertifikat COPP driver. Sertifikat berikutnya adalah sertifikat penandatanganan Vendor Perangkat Keras Independen (IHV). Sertifikat terakhir adalah sertifikat penandatanganan Microsoft. Untuk memastikan bahwa driver grafis adalah perangkat COPP yang sah, aplikasi harus memvalidasi ketiga sertifikat ini. Program berbahaya dapat mencegah COPP berfungsi jika aplikasi tidak memvalidasi sertifikat dalam rantai dengan benar.

Rantai sertifikat COPP menggunakan set karakter UTF-8. Data biner dalam sertifikat, seperti kunci umum RSA, dikodekan base64 dan disimpan dalam urutan big-endian. (Big-endian berarti bahwa byte yang paling signifikan disimpan di lokasi memori dengan alamat terendah.)

Beberapa elemen dalam sertifikat berisi nilai Boolean untuk menunjukkan bahwa ada fitur sertifikat. Jika fitur ada, nilai elemen turunan yang sesuai diatur ke 1. Jika fitur tidak ada, elemen turunan tersebut tidak ada dalam sertifikat.

Definisi Elemen XML

Berikut ini adalah definisi untuk elemen dalam skema sertifikat:

  • CertificateCollection. Elemen akar dokumen XML. Ini berisi elemen Sertifikat, satu untuk setiap sertifikat dalam rantai.
  • Sertifikat. Berisi satu sertifikat. Elemen ini berisi elemen Data dan Tanda Tangan.
  • Data. Berisi informasi tentang sertifikat. Secara khusus, ini berisi kunci dan jenis publik sertifikat. Elemen Data berisi elemen anak berikut:
    • Kunci Umum. Berisi kunci umum RSA sertifikat. Elemen PublicKey berisi elemen KeyValue, yang berisi elemen RSAKeyValue. Elemen RSAKeyValue memiliki dua elemen anak, Modulus dan Eksponen, dan ini menentukan kunci publik. Elemen Modulus dan Exponent dikodekan base64 dan disimpan dalam urutan big-endian.
    • KeyUsage. Jika sertifikat adalah sertifikat COPP driver, elemen ini harus berisi elemen turunan yang disebut EncryptKey. Jika sertifikat adalah sertifikat penandatanganan IHV atau sertifikat penandatanganan Microsoft, sertifikat tersebut harus berisi elemen turunan yang disebut SignCertificate. Kedua elemen anak ini berisi nilai Boolean.
    • SecurityLevel. Elemen ini harus diabaikan.
    • ManufacturerData. Menentukan produsen dan model perangkat grafis. Elemen ini hanya informasi.
    • Fitur. Berisi elemen anak yang menentukan penggunaan sertifikat. Satu-satunya yang relevan dengan COPP adalah elemen COPPCertificate. Elemen anak lainnya mungkin ada; jika demikian, mereka harus diabaikan. Jika elemen COPPCertificate ada, sertifikatnya adalah sertifikat COPP. Elemen ini harus ada dalam simpul daun dari sertifikat COPP yang valid. Elemen ini berisi nilai Boolean.
  • Tanda tangan. Berisi tanda tangan untuk sertifikat ini. Ini berisi elemen turunan berikut:
    • SignedInfo. Berisi informasi tentang tanda tangan. Elemen turunan penting dari elemen ini adalah elemen DigestValue, yang berisi nilai yang dikodekan base64 dari hash SHA-1 di atas elemen Data. Nilai hash digunakan saat memeriksa sertifikat terhadap daftar pencabutan sertifikat (CRL).
    • SignatureValue. Nilai ini dihitung melalui elemen Data dan dihitung sesuai dengan skema tanda tangan digital RSASSA-PSS yang ditentukan dalam Public-Key Standar Kriptografi (PKCS) #1 (versi 2.1). Untuk informasi tentang PKCS #1, kunjungi https://www.rsa.com/.
    • KeyInfo. Berisi kunci publik RSA dari sertifikat berikutnya dalam rantai. Elemen ini digunakan untuk memverifikasi bahwa data dalam elemen Data belum dirusak. Elemen ini memiliki format yang sama dengan elemen PublicKey.

Validasi Sertifikat

Aplikasi harus melakukan langkah-langkah berikut untuk memvalidasi rantai sertifikat dengan benar. Jika ada langkah yang gagal, atau jika ada elemen yang dimaksud dalam prosedur ini tidak ada, validasi gagal.

Memvalidasi Prosedur Pengumpulan Sertifikat

Untuk memvalidasi rantai sertifikat, lakukan langkah-langkah berikut:

  1. Verifikasi bahwa CertificateCollection adalah XML yang terbentuk dengan baik.
  2. Verifikasi bahwa CertificateCollection dikodekan dalam format UTF-8.
  3. Periksa apakah atribut Versi dalam elemen CertificateCollection adalah 2.0 atau yang lebih baru.
  4. Verifikasi bahwa rantai sertifikat berisi tepat tiga elemen Sertifikat.
  5. Perulangan melalui setiap elemen Sertifikat dalam rantai sertifikat dan lakukan prosedur Validasi Sertifikat, yang dijelaskan di bawah ini, pada masing-masing.

Memvalidasi Prosedur Sertifikat

Untuk memvalidasi sertifikat dalam rantai, lakukan langkah-langkah berikut:

  1. Verifikasi bahwa tidak ada elemen anak dalam elemen Data yang diduplikasi. Misalnya, seharusnya hanya ada satu elemen PublicKey.
  2. Pastikan elemen Data/PublicKey/KeyValue/RSAKeyValue/Modulus ada. Nilai yang didekode base64 harus panjang 256 byte untuk semua sertifikat kecuali akar. Dalam sertifikat akar, elemen ini harus panjangnya 128 byte.
  3. Pastikan elemen Data/PublicKey/KeyValue/RSAKeyValue/Exponent ada. Nilai base64-decoded tidak boleh lebih besar dari 4 byte.
  4. Jika sertifikat ini adalah sertifikat daun, verifikasi hal berikut:
    • Elemen KeyUsage berisi elemen EncryptKey dengan nilai 1.
    • Elemen Features berisi elemen COPPCertificate dengan nilai 1.
  5. Jika sertifikat ini bukan sertifikat daun, verifikasi hal berikut:
    • Modulus dan eksponen dari elemen Data/PublicKey sama persis dengan modulus dan eksponen dari elemen Signature/KeyInfo dari sertifikat sebelumnya.
    • Elemen KeyUsage berisi elemen SignCertificate, dengan nilai 1.
  6. Gunakan algoritma hash SHA-1 untuk hash setiap byte dalam elemen Data sertifikat. Setiap byte dari karakter pertama dalam <tag Data> ke karakter terakhir dalam tag penutup </Data> harus di-hash. Nilai hash digunakan untuk memeriksa sertifikat terhadap daftar pencabutan sertifikat (CRL), seperti yang dijelaskan dalam Daftar Pencabutan Sertifikat
  7. Bandingkan nilai hash dari langkah 6 dengan nilai yang didekodekan base64 dari elemen Signature/SignedInfo/Reference/DigestValue. Nilai ini harus cocok.
  8. Lakukan prosedur Verifikasi Tanda Tangan, dijelaskan di bawah ini.
  9. Jika sertifikat ini bukan sertifikat akhir dalam rantai, simpan nilai Signature/KeyInfo/KeyValue/RSAKeyValue untuk perulangan berikutnya.
  10. Jika sertifikat ini adalah sertifikat akhir dalam rantai, pastikan bahwa nilai Signature/KeyInfo/KeyValue/RSAKeyValue cocok dengan kunci umum Microsoft. Kunci publik Microsoft memiliki nilai yang dikodekan base64 berikut:
    • Modulus:

      pjoeWLSTLDonQG8She6QhkYbYott9fPZ8tHdB128ZETcghn5KHoyin7HkJEcPJ0Eg4UdSv a0KDIYDjA3EXd69R3CN2Wp/QyOo0ZPYWYp3NXpJ700tKPgIplzo5wVd/69g7j+j8M66W7V NmDwaNs9mDc1p2+VVMsDhOsV/Au6E+E=

    • Eksponen: AQAB

Verifikasi Prosedur Tanda Tangan

Nilai elemen SignatureValue dihitung melalui elemen Data sesuai dengan skema tanda tangan digital RSASSA-PSS yang ditentukan dalam PKCS #1 versi 2.1 (selanjutnya disebut sebagai PKCS). Untuk memverifikasi tanda tangan ini, lakukan langkah-langkah berikut:

  1. Dekode nilai Modulus dan Eksponen dalam elemen Signature/KeyInfo/KeyValue/RSAKeyValue. Nilai-nilai ini menentukan kunci umum RSA dari sertifikat penandatanganan.
  2. Dekode elemen Signature/SignatureValue.
  3. Komputasi operasi RSASSA-PSS-Verify, yang ditentukan dalam bagian 8.1.2 PKCS.

Untuk operasi RSASSA-PSS-Verify, gunakan input berikut:

  • (n,e) adalah kunci umum dari langkah 1.
  • M adalah semua byte dalam elemen Data, termasuk <tag Data> dan </Data> yang mengapit elemen .
  • S adalah nilai tanda tangan yang didekodekan dari langkah 2.

Operasi RSASSA-PSS-Verify menggunakan operasi EMSA-PSS-ENCODE, yang ditentukan dalam bagian 9.1.1. PKCS. Untuk operasi ini, COPP menggunakan opsi berikut:

  • Hash = SHA-1
  • hLen = 20
  • MGF (fungsi pembuatan masker) = MGF1
  • sLen = 0

Fungsi pembuatan masker MGF1 didefinisikan dalam Lampiran B.2 PKCS. Untuk fungsi ini, COPP menggunakan opsi berikut:

  • Hash = SHA-1
  • hLen = 20

Output operasi RSASSA-PSS-Verify menunjukkan apakah tanda tangan valid atau tidak valid.

Menggunakan Protokol Perlindungan Output Bersertifikat (COPP)