共用方式為


驗證憑證鏈

[與此頁面相關聯的功能,DirectShow是舊版功能。 它已被 MediaPlayerIMFMediaEngine,以及媒體基金會中的音訊/視訊擷取取代。 這些功能已針對 Windows 10 和 Windows 11 進行優化。 Microsoft強烈建議新程式代碼盡可能在媒體 基礎中使用 MediaPlayerIMFMediaEngine 音訊/視訊擷取,而不是 DirectShow。 Microsoft建議使用舊版 API 的現有程式代碼,盡可能改寫成使用新的 API。]

本主題描述如何使用認證輸出保護通訊協定 (COPP) 來驗證驅動程式的憑證鏈結。

圖形驅動程序的憑證鏈結是 XML 檔。 憑證鏈結包含三個憑證。 第一個憑證稱為 子憑證,而是驅動程式的 COPP 憑證。 下一個憑證是獨立硬體廠商 (IHV) 的簽署憑證。 最後一個憑證是Microsoft的簽署憑證。 為了確保圖形驅動程式是合法的COPP裝置,應用程式必須驗證這三個憑證。 如果應用程式未正確驗證鏈結中的憑證,惡意程式可能會防止 COPP 運作。

COPP 憑證鏈結會使用UTF-8字元集。 憑證中的二進位數據,例如 RSA 公鑰,會以base64編碼並依大端順序儲存。 (Big-endian 表示最重要的位元組會儲存在記憶體位置中,位址最低。

憑證內的某些元素包含布爾值,表示憑證的功能存在。 如果功能存在,對應的子專案值會設定為 1。 如果功能不存在,該子專案就不會出現在憑證中。

XML 元素定義

以下是憑證架構中元素的定義:

  • CertificateCollection。 XML 檔的根元素。 它包含多個 Certificate 元素,每個元素對應於鏈中的一個憑證。
  • 憑證。 包含一個憑證。 此元素包含 Data 和 Signature 元素。
  • 資料。 包含憑證的相關信息。 特別是,它包含憑證的公鑰和類型。 Data 元素包含下列子元素:
    • PublicKey。 包含憑證的 RSA 公鑰。 PublicKey 元素包含 KeyValue 元素,其中包含 RSAKeyValue 元素。 RSAKeyValue 元素有兩個子元素 Modulus 和 Exponent,而這些元素會定義公鑰。 模數和指數元素會以base64編碼,並以大到小的順序儲存。
    • KeyUsage。 如果憑證是驅動程式的COPP憑證,則此元素應該包含名為 EncryptKey 的子元素。 如果憑證是 IHV 的簽署憑證或Microsoft的簽署憑證,它應該包含名為 SignCertificate 的子元素。 這兩個子元素都包含布爾值。
    • SecurityLevel。 這個元素應該被忽略。
    • ManufacturerData。 指定圖形裝置的製造商和型號。 此元素僅供參考。
    • 功能。 包含指定憑證使用方式的子專案。 與 COPP 相關的唯一一個是 COPPCertificate 元素。 其他子元素可能存在;如果有的話,則應該忽略它們。 如果 COPPCertificate 元素存在,憑證就是 COPP 憑證。 這個元素必須存在於有效 COPP 憑證的分葉節點中。 這個元素包含布爾值。
  • 簽章。 包含此憑證的簽章。 包含下列子專案:
    • SignedInfo。 包含簽章的相關信息。 這個專案的重要子元素是 DigestValue 元素,其中包含 Data 元素上 SHA-1 哈希的 base64 編碼值。 針對證書吊銷清單 (CRL) 檢查憑證時,會使用摘要值。
    • SignatureValue。 此值是在數據元素上計算的,並根據在 Public-Key 密碼編譯標準 PKCS 第1號(版本2.1)中定義的 RSASSA-PSS 數位簽名方案來計算。 如需 PKCS #1 的相關信息,請瀏覽 https://www.rsa.com/
    • KeyInfo。 包含鏈結中下一個憑證的 RSA 公鑰。 此元素可用來確認 Data 元素中的數據尚未遭到竄改。 此元素的格式與 PublicKey 元素相同。

憑證驗證

應用程式必須執行下列步驟,才能正確驗證憑證鏈結。 如果任何步驟失敗,或這些程序中參考的任何專案不存在,驗證就會失敗。

驗證憑證收集程序

若要驗證憑證鏈結,請執行下列步驟:

  1. 確認 CertificateCollection 是格式良好的 XML。
  2. 確認 CertificateCollection 是以 UTF-8 格式編碼。
  3. 檢查 CertificateCollection 元素中的 Version 屬性是否為 2.0 或更新版本。
  4. 確認憑證鏈結只包含三個 Certificate 元素。
  5. 依次檢查憑證鏈結中的每個 Certificate 元素,並對每個元素執行下述的驗證憑證的程序。

驗證憑證程式

若要驗證鏈結中的憑證,請執行下列步驟:

  1. 確認 Data 元素中沒有任何子項目重複。 例如,應該只有一個 PublicKey 元素。
  2. 確定 Data/PublicKey/KeyValue/RSAKeyValue/Modulus 元素存在。 除了根目錄以外的所有憑證,base64 譯碼的值必須長度為 256 個字節。 在根憑證中,此元素的長度必須是128字節。
  3. 確定 Data/PublicKey/KeyValue/RSAKeyValue/Exponent 元素存在。 base64 譯碼的值不得大於 4 個字節。
  4. 如果此憑證是葉證書,請確認下列各項:
    • KeyUsage 元素包含值為 1 的 EncryptKey 元素。
    • Features 元素包含值為 1 的 COPPCertificate 元素。
  5. 如果此憑證不是末端憑證,請確認下列各項:
    • Data/PublicKey 元素的模數和指數完全符合上一個憑證之 Signature/KeyInfo 元素的模數和指數。
    • KeyUsage 元素包含 SignCertificate 元素,值為 1。
  6. 使用 SHA-1 哈希演算法來哈希憑證 Data 元素中的每個位元組。 從 <Data> 標籤的第一個字元到結尾 </Data> 標記的最後一個字元,每個位元組都應該進行哈希處理。 哈希值用於檢查憑證是否在證書吊銷清單(CRL)中,如 證書吊銷清單中所述
  7. 比較步驟 6 中的哈希值與 Signature/SignedInfo/Reference/DigestValue 元素的 base64 譯碼值。 這些值必須相符。
  8. 執行驗證簽章程式,如下所述。
  9. 如果此憑證不是鏈結中的最終憑證,請為迴圈的下一個反覆專案儲存 Signature/KeyInfo/KeyValue/RSAKeyValue 值。
  10. 如果此憑證是鏈結中的最終憑證,請確定 Signature/KeyInfo/KeyValue/RSAKeyValue 的值符合Microsoft的公鑰。 Microsoft公鑰具有下列 base64 編碼值:
    • 模數:

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

    • 指數:AQAB

驗證簽章程序

SignatureValue 元素的值是按照 PKCS #1 版本 2.1 中定義的 RSASSA-PSS 數位簽名方案,針對 Data 元素計算得出(以下簡稱為 PKCS)。 若要確認此簽章,請執行下列步驟:

  1. 解碼 Signature/KeyInfo/KeyValue/RSAKeyValue 元素中的模數和指數值。 這些值會定義簽署憑證的 RSA 公鑰。
  2. 將 Signature/SignatureValue 元素譯碼。
  3. 計算 PKCS 第 8.1.2 節中定義的 RSASSA-PSS-Verify 作業。

針對 RSASSA-PSS-Verify 作業,請使用下列輸入:

  • ne) 是步驟 1 的公鑰。
  • M 是 Data 元素中的所有位元組,包括封入元素的 <Data> 和 </Data> 標記。
  • S 是步驟 2 的已譯碼簽章值。

RSASSA-PSS-Verify 作業會使用 EMSA-PSS-ENCODE 作業,定義於 9.1.1 節中。 屬於 PKCS 的部分。 針對這項作業,COPP 會使用下列選項:

  • 哈希 = SHA-1
  • hLen = 20
  • MGF (遮罩產生函數) = MGF1
  • sLen = 0

遮罩產生函式 MGF1 定義於 PKCS 附錄 B.2 中。 針對此函式,COPP 會使用下列選項:

  • 哈希 = SHA-1
  • hLen = 20

RSASSA-PSS-Verify 作業的輸出會指出簽章是否有效或無效。

使用認證輸出保護通訊協定 (COPP)