共用方式為


驗證憑證鏈結

[與此頁面相關的功能 DirectShow是舊版功能。 它已被 MediaPlayerIMFMediaEngineMedia Foundation 中的音訊/視訊擷取取代。 這些功能已針對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 檔的根項目。 它包含憑證元素,針對鏈結中的每個憑證各有一個。
  • 憑證。 包含一個憑證。 這個專案包含 Data 和 Signature 元素。
  • 資料。 包含憑證的相關資訊。 特別是,它包含憑證的公開金鑰和類型。 Data 元素包含下列子項目:
    • PublicKey。 包含憑證的 RSA 公開金鑰。 PublicKey 元素包含 KeyValue 元素,其中包含 RSAKeyValue 元素。 RSAKeyValue 元素有兩個子項目 Modulus 和 Exponent,這些元素會定義公開金鑰。 模數和指數元素會以 base64 編碼並儲存在大端順序中。
    • KeyUsage。 如果憑證是驅動程式的 COPP 憑證,此元素應該包含名為 EncryptKey 的子項目。 如果憑證是 IHV 的簽署憑證或 Microsoft 的簽署憑證,它應該包含名為 SignCertificate 的子項目。 這兩個子項目都包含布林值。
    • SecurityLevel。 應該忽略這個專案。
    • ManufacturerData。 指定圖形裝置的製造商和型號。 此元素僅供參考。
    • Features。 包含指定憑證使用方式的子專案。 與 COPP 相關的唯一是 COPPCertificate 元素。 其他子項目可能存在;如果是,則應該忽略它們。 如果 COPPCertificate 元素存在,則憑證是 COPP 憑證。 此元素必須存在於有效 COPP 憑證的分葉節點中。 這個專案包含布林值。
  • 簽章。 包含此憑證的簽章。 它包含下列子項目:
    • SignedInfo。 包含簽章的相關資訊。 這個專案的重要子項目是 DigestValue 元素,其中包含 Data 元素上 SHA-1 雜湊的 base64 編碼值。 針對憑證撤銷清單檢查憑證時,會使用摘要值, (CRL) 。
    • SignatureValue。 此值會透過 Data 元素計算,並根據 Public-Key密碼編譯標準 (PKCS) #1 (2.1 版) 中所定義的 RSAUTH-PSS 數位簽章配置來計算。 如需 PKCS #1 的相關資訊,請流覽 https://www.rsa.com/
    • KeyInfo。 包含鏈結中下一個憑證的 RSA 公開金鑰。 此元素是用來驗證 Data 元素中的資料尚未遭到竄改。 這個專案的格式與 PublicKey 元素相同。

憑證驗證

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

驗證憑證收集程式

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

  1. 確認 CertificateCollection 是格式正確的 XML。
  2. 確認 CertificateCollection 是以 UTF-8 格式編碼。
  3. 檢查 CertificateCollection 元素中的 Version 屬性是否為 2.0 或更新版本。
  4. 確認憑證鏈結只包含三個憑證元素。
  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 > 標籤中最後一個字元 < 的每個位元組都應該進行雜湊處理。 雜湊值可用來根據憑證撤銷清單檢查憑證, (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 版中定義的 RSAUTH-PSS 數位簽章配置,計算資料元素的值, (稱為 PKCS) 。 若要驗證此簽章,請執行下列步驟:

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

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

  • (ne) 是步驟 1 的公開金鑰。
  • M 是 Data 元素中的所有位元組,包括 < 括住元素的 Data > 和 < /Data > 標籤。
  • S 是步驟 2 中解碼的簽章值。

RSCODE-PSS-Verify 作業會使用 9.1.1 節中定義的 EMSA-PSS-ENCODE 作業。 PKCS 的 。 針對此作業,COPP 會使用下列選項:

  • 雜湊 = SHA-1
  • hLen = 20
  • MGF (遮罩產生函式) = MGF1
  • sLen = 0

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

  • 雜湊 = SHA-1
  • hLen = 20

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

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