共用方式為


執行 Windows Vista 之系統上核心模組的數位簽章

 

Microsoft Corporation

更新日期:2007 年 6 月

適用於:
   Windows Vista
   Windows Server 2008

總結: 對於 Microsoft Windows Vista 和更新版本的 Windows 系列作業系統,核心模式軟體必須具有數位簽章,才能在 x64 型電腦系統上載入。 瞭解如何管理 Windows Vista 核心模式軟體的簽署程式。 (22 個列印的頁面。)

本文的目前版本會在 Web 上維護,網址為: https://www.microsoft.com/whdc/system/platform/64bit/kmsigning.mspx

目錄

簡介
   數位簽章作為最佳做法
   核心模式程式碼簽署選項
核心模式程式碼簽署程式
   如何取得軟體發行憑證 (SPC)
   建立已簽署的 .cat 檔案
   將內嵌簽章新增至驅動程式映射檔
如何在開發期間停用簽章強制執行
如何使用測試簽署
   啟用測試簽署疑難排解
   偵測驅動程式負載錯誤
   啟用程式碼完整性診斷系統記錄事件
   驅動程式驗證偵錯選項
資源

簡介

對於世界各地的 Windows 消費者和企業使用者而言,保護個人和公司資料仍然是最關注的問題。 Microsoft 致力於實作新的方法,以協助限制惡意軟體的散佈。 核心模式軟體的數位簽章是確保電腦系統上安全性的重要方式。

數位簽章可讓安裝 Windows 型軟體的系統管理員或終端使用者知道合法發行者是否已提供軟體套件。 當使用者選擇在發生錯誤或其他錯誤之後傳送Windows 錯誤報告資料給 Microsoft 時,Microsoft 可以分析資料,以瞭解在發生錯誤時,哪些發行者的軟體正在系統上執行。 然後,軟體發行者可以使用 Microsoft 提供的資訊來尋找並修正其軟體中的問題。

Windows Vista 依賴核心模式程式碼的數位簽章,以提高 Microsoft Windows 平臺的安全性與穩定性,並透過新一代進階內容啟用新的客戶體驗:

  • 驅動程式必須針對串流受保護內容的裝置進行簽署。 這包括使用受保護使用者模式音訊 (PUMA) 和 PROTECTED Audio Path (PAP) 的音訊驅動程式,以及處理受保護視訊路徑輸出保護管理 (PVP-OPM) 命令的視訊設備磁碟機。
  • 未簽署的核心模式軟體不會載入,也不會在 x64 型系統上執行。

注意: 即使是具有系統管理員許可權的使用者也無法在 x64 型系統上載入未簽署的核心模式程式碼。 這適用于任何以核心模式載入的軟體模組,包括設備磁碟機、篩選驅動程式和核心服務。

新核心模式程式碼簽署原則的範圍很遠。 對於發佈核心模式軟體的開發人員,此原則具有下列效果:

  • 對於尚未簽署的任何核心模式元件,發行者必須取得軟體發行憑證 (SPC) ,並使用 SPC 簽署將在執行 Windows Vista 的 x64 型電腦系統上執行的所有 64 位核心模式軟體。 這包括核心模式服務軟體。

  • 提供 64 位設備磁碟機或其他已透過 Windows 標誌計畫簽署核心模式軟體的發行者,其驅動程式目錄會使用 Windows 硬體品質實驗室 (WHQL) 簽章簽署。 若要在提交至 WHQL 之前完整測試驅動程式套件,請使用 SPC 簽署驅動程式類別目錄。

  • 在開機啟動驅動程式的特殊案例中,也需要使用 SPC 來內嵌簽署驅動程式二進位映射檔,以獲得最佳系統開機效能。

    注意 如果驅動程式是由 Windows Vista 作業系統載入器載入,則稱為開機啟動。 開機啟動驅動程式可識別如下:驅動程式 INF 會將啟動類型指定為 「Start=0」,或將 ServiceType 設定為 Kernel Driver 或 File System Driver 和 StartMode 作為「開機」的核心服務。

強制核心模式程式碼簽署原則適用于執行 Windows Vista 的 x64 型系統上的所有核心模式軟體。 不過,Microsoft 鼓勵發行者以數位方式簽署所有軟體,包括 32 位和 64 位平臺的設備磁碟機。 Windows Vista 會在 x86 系統上執行核心模式簽章驗證,以支援受保護的媒體內容。 不過,32 位系統不需要核心模式驅動程式簽章。

本文說明如何管理 Windows Vista 核心模式程式碼的簽署程式,包括如何取得軟體發佈憑證 (SPC) 、保護金鑰的指導方針,以及如何使用 Windows 驅動程式套件 (WDK) 中提供的工具簽署驅動程式套件。

數位簽章作為最佳做法

自 Windows 98 發行以來,Microsoft 已將指定裝置類別的驅動程式簽署升級為提升驅動程式可靠性的機制,以提供更佳的使用者體驗、降低軟體和硬體廠商的支援成本,以及降低客戶的擁有權總成本。

對於設備磁碟機和其他核心模式軟體,簽署為 Windows 標誌計畫的驅動程式會增加使用者對軟體品質的信賴度,並改善使用者體驗,因為屬於驅動程式的 Windows 標誌表示驅動程式已經過測試,而且 Windows 標誌確認隨附的數位簽章在測試後尚未改變。

對於大部分的核心模式驅動程式套件,數位簽章會在已簽署的目錄 (.cat) 檔案中提供。 Windows Hardware Quality Labs (WHQL) 提供 Microsoft 簽署的 .cat 檔案,以符合 Windows 標誌計畫需求的驅動程式套件散發。

建立已簽署核心模式軟體的套裝程式含兩個不同的相關活動。 這些作業可以平行完成,因為軟體通常不需要簽署,直到開發程式較晚為止。

  • 管理簽署程式。 這通常是由發行者的程式管理和軟體發行服務處理,包括:

    • 選取適當的簽署選項。
    • 取得必要的憑證。
    • 管理數位簽章或程式碼簽署金鑰。

    注意 若要以數位方式簽署映射二進位檔案或目錄,軟體發行者必須具有經過認證的程式碼簽署金鑰,這表示憑證授權單位單位已充分建立發行者的身分識別。

  • 實作要簽署的驅動程式。 這通常是由發行者的開發小組處理,包括:

    • 實作驅動程式本身。
    • 建立用於內部測試或發行的已簽署驅動程式套件。

這些程式記載于 WDK 和平臺 SDK 中的舊版 Windows。 本檔說明與 Windows Vista 核心模式程式碼簽署相關的其他選項。

核心模式程式碼簽署選項

Windows Vista 中有多個選項可用來使用核心模式程式碼簽署 (KMCS) 需求。 開發核心模式程式碼時,Windows Vista 不需要簽署驅動程式檔案來載入驅動程式。 相反地,開發人員可以使用其中一種機制,暫時停用開發和非自動化測試系統上核心的載入時間檢查。 不過,需要測試驅動程式套件的簽署,才能在測試系統上自動安裝驅動程式套件,而不需安裝驅動程式快顯。 驅動程式管理基礎結構 (DMI) 在安裝期間驗證驅動程式套件簽章,並警告使用者未簽署的驅動程式。

下表比較 Windows Vista 所支援數位簽署核心模組的選項。

簽署核心模組的選項

簽署選項 已驗證符合標誌需求的功能 已驗證身分識別 預定用途
Windows 標誌程式 版本
使用 SPC 簽署核心模式程式碼 版本
WHQL 測試簽章程式 測試
KMCS 測試簽署 測試

Windows 標誌計畫會驗證正確的驅動程式功能,並確保高品質和可靠性。 提交至 Windows 標誌計畫的驅動程式套件是由 Microsoft 以數位方式簽署。 Windows 標誌計畫接受透過 INF 檔案安裝的裝置套件,以取得符合 Windows 標誌需求的硬體。 驅動程式發行者完成 Windows 標誌計畫的驅動程式驗證測試之後,會提交驅動程式套件。 符合標誌資格的驅動程式會收到 Microsoft 簽署的 .cat 檔案。 如需 Windows 標誌計畫的相關資訊,請參閱本檔結尾的 一節。

開發人員可以使用 SPC 簽署驅動程式映射檔或驅動程式類別目錄,以在提交至 WHQL 之前進行測試,以確認驅動程式是否已正確載入並運作。

使用 SPC 進行核心模式程式碼簽署可提供核心模組載入 Windows Vista 中之發行者的識別性。 它不提供核心模組功能或可靠性的任何認證層級。 對於不符合 Windows 標誌資格的驅動程式,或 Windows 標誌不是其中一個產品需求,發行者可以建立驅動程式套件的 .cat 檔案,並使用發行者的 SPC 簽署。

重要 核心模式程式碼簽署不會取代 WHQL 程式。 Microsoft 鼓勵發行者使用 Windows 標誌計畫,以確保驅動程式品質。 核心模式程式碼簽署不需要軟體發行者通過與 WHQL 相關聯的 Windows 標誌計畫測試需求。

已簽署的 .cat 檔案是大部分驅動程式套件在 x64 系統上正確安裝和載入的必要專案,但包含 Windows Vista 開機載入器所載入之驅動程式的套件除外。 包含 Windows Vista 開機載入器所載入之裝置驅動程式的驅動程式套件必須以兩種方式登入:

  • 在開機時載入的核心模式驅動程式二進位檔案,必須在以 SPC 簽署的二進位檔中具有內嵌簽章。 為了簡單起見,內嵌簽署套件中的所有驅動程式映射檔案可能會比較容易。
  • 使用 INF 檔案安裝的驅動程式套件也必須有已簽署的類別目錄檔案,就像不包含開機啟動驅動程式的驅動程式套件一樣,以便在安裝期間進行簽章驗證。

製造商應確保硬體廠商取得 SPC,並簽署將在製造商安裝的系統上安裝的任何開機啟動驅動程式。

為了在開發週期期間進行測試,建議使用「測試」憑證進行程式碼簽署,而不是使用發行憑證進行簽署。 只有在啟用允許使用測試簽署憑證的開機設定選項時,Windows Vista 系統才會辨識測試簽署二進位檔。 預設不會啟用測試簽署,而且大部分的 Windows Vista 系統都不會信任測試簽章。

測試簽署也支援 WHQL 測試簽章程式。 程式中的參與者可以提交 WHQL 測試簽署的驅動程式套件。 測試簽署目錄上的簽章是由 Microsoft 測試根目錄授權單位所簽發的憑證所產生。 當 Windows Vista 開機設定啟用測試簽署時,會接受 Microsoft 測試根目錄授權單位。 如需有關 WHQL 測試簽章程式的資訊,請參閱本檔結尾的 一節。

針對「測試」和「發行」簽署,開發小組應遵循金鑰管理的最佳做法,如本文稍後保護程式碼簽署金鑰的指引中所述。

本文稍後如何使用測試簽署一節更詳細地討論測試簽署。

核心模式程式碼簽署程式

以數位方式簽署核心模式映射檔或目錄會建立已簽署檔案或檔案的完整性。 執行程式碼簽署作業之後,絕不應該修改軟體模組。 在程式碼簽署之後修改映射檔會導致安裝時間和載入時間簽章驗證失敗。

包含多個檔案的驅動程式套件可以使用目錄簽署。 驅動程式套件必須具有已簽署的類別目錄 (.cat) 檔案,以在安裝驅動程式套件時用來識別發行者,並在驅動程式映射載入核心時驗證驅動程式映射。 類別目錄檔案包含數位憑證,可識別發行者,以及套件內容的雜湊,以允許系統確認套件中的檔案尚未變更。

如先前所述,開機啟動驅動程式必須在驅動程式映射檔中具有內嵌簽章。 開機啟動驅動程式映射檔中的內嵌簽章可藉由排除在作業系統載入器驗證驅動程式簽章時找出 appropriate.cat 檔案,將作業系統開機效能優化。

驅動程式開發程式期間,每個組建不需要驅動程式簽署。 開發人員可以停用驅動程式簽署強制執行,如本文稍後如何在開發期間停用簽章強制執行中所述。

下列各節將討論如何取得和管理憑證。 本文稍後會討論簽署驅動程式套件的機制。

如何取得軟體發行憑證 (SPC)

使用下列步驟,取得 SPC 以簽署符合必要核心模式程式碼簽署原則的核心模式軟體:

  1. 從發行數位憑證以簽署核心模式程式碼的商業 CA 取得 SPC。 提供軟體發行憑證 (或程式碼簽署憑證的 CA 清單,) 可用於核心模式程式碼簽署的 MICROSOFT 跨憑證 Windows Vista 核心模式程式碼簽署 網頁。
  2. 從發行 SPC 之根憑證授權單位的 Microsoft Cross-certificates for Windows Vista 核心模式程式碼簽署 網頁下載對應的交叉憑證。 跨憑證用於核心模式程式碼的數位簽章中,讓簽章可以驗證到 Windows Vista 核心已知的受根信任授權單位。

當您向商業 CA 要求軟體發佈憑證時,請遵循 CA 網站上的指示,瞭解如何在您將使用私密金鑰簽署程式碼的電腦上取得並安裝程式碼簽署憑證。

保護程式碼簽署金鑰的指導方針

程式碼簽署程式的核心密碼編譯金鑰必須受到妥善保護,並受到與任何公司最重要資產相同的處理。 這些金鑰代表公司身分識別。 使用這些金鑰簽署的任何程式碼都會出現在 Windows 上,就像它包含可追蹤公司的有效數位簽章一樣。 如果金鑰被竊,可能被用來簽署惡意的程式碼,使得包含特洛伊木馬或病毒的程式碼,看起來有如來自合法的發行者。

如需安全防護私密金鑰的詳細資訊,請參閱 程式碼簽署最佳做法

搭配核心模式程式碼簽署使用跨憑證

核心模式程式碼簽署會使用跨憑證作為程式碼簽署程式的一部分。 交叉憑證是由一個憑證授權單位單位所發行的 X.509 憑證, (CA) 簽署另一個憑證授權單位單位根憑證的公開金鑰。 Windows Vista 作業系統載入器和核心會辨識驗證驅動程式簽章中的跨憑證。 跨憑證可讓核心擁有單一信任的 Microsoft 根授權單位,但也提供彈性,將信任鏈延伸至發出軟體發行者憑證的多個商業 CA。

跨憑證可讓開發人員和發行者使用軟體發行者憑證來簽署核心模式軟體。 使用核心模式程式碼簽署的開發人員會將正確的跨憑證 (.cer) 檔案下載到執行數位簽章作業的系統。 發行者不需要將其軟體或驅動程式套件散發跨憑證檔案。 交叉憑證將會包含在驅動程式映射檔或驅動程式套件目錄上的數位簽章中。 安裝驅動程式套件的使用者不需要執行 Windows Vista 的任何設定步驟,即可驗證封裝含跨憑證的數位簽章。

重要 Windows Vista Beta2 WDK 中的 SignTool 是唯一支援將跨憑證新增至數位簽章的 SignTool 版本。 Windows Server 2003 平臺 SDK 或 DDK 中的舊版 SignTool 不支援新增跨憑證。

多個 CA 用於核心模式程式碼簽署的跨憑證可從 Microsoft WHDC 網站下載。 如需詳細資訊,請參閱本檔結尾之資源中 適用于 Windows Vista 核心模式程式碼簽署的 Microsoft 交叉憑證

有關如何將交叉憑證新增至數位簽章的詳細資料,請參閱如何簽署 .cat 檔案和將內嵌簽章新增至驅動程式映射檔一節。

產生測試憑證

測試憑證會用於測試簽署核心模式軟體模組的 SPC,這些模組不適用於組織外部的散發或發行。 測試簽署會將數位簽章套用至用於內部測試目的的核心模式二進位檔或驅動程式套件目錄。 本文稍後如何使用測試簽署一節更詳細地討論測試簽署。 使用測試憑證進行核心模式程式碼簽署時,不需要跨憑證。

您可以使用企業 CA 或使用 Makecert 公用程式來產生測試憑證。 如需在組織中發行測試簽署憑證的企業 CA 的詳細資訊,請參閱 程式碼簽署最佳做法

在下列範例中,Makecert 會產生預設測試根目錄所簽發的測試憑證、將私密金鑰儲存在金鑰容器中,並將憑證輸出至憑證存放區和憑證檔案:

Makecert –r –pe –ss SubjectCertStoreName –n "CN= CertName" OutputFile.cer

範例中 Makecert 的引數會執行下列動作:

  • -r
    建立自我簽署憑證,也就是憑證是根憑證。
  • -體育
    讓與憑證匯出相關聯的私密金鑰變成可匯出的。
  • -ssSubjectCertStoreName
    指定包含根憑證的憑證存放區名稱。
  • **-n 「CN=**CertName
    指定憑證的名稱。 如果未提供憑證名稱,則憑證的預設名稱為 「Joe's Software Emporium」。
  • OutputFile.cer
    儲存根憑證的檔案名。

WDK 中提供使用 makecert 的範例命令腳本。 指令檔名是位於 「bin\selfsign」 目錄下的selfsign_example.txt。 您必須先將測試憑證新增至目標測試電腦上的憑證存放區,才能安裝驅動程式套件。

下列範例示範如何將測試憑證新增至目標測試電腦上的 [受信任的根存放區] 和 [受信任的發行者存放區]。

certmgr.exe -add OutputFile.cer -s -r localMachine root 
certmgr.exe -add OutputFile.cer -s -r localMachine trustedpublisher

範例中 Certmgr 的引數會執行下列動作:

  • -添加
    將憑證檔案中的憑證新增至憑證存放區。
  • -s
    表示憑證存放區是系統存放區。
  • -r
    指出系統存放區的登錄位置位於HKEY_LOCAL_MACHINE機碼下
  • Roottrustedpublisher
    指出系統憑證存放區的名稱

如需 Certmgr 和 Makecert 的詳細資訊,請參閱本檔結尾的資源。

建立已簽署的 .cat 檔案

用來產生和簽署目錄檔案 MakeCat 和 SignTool 的工具會在 Windows Vista WDK 中提供。

注意 Signtool.exe 和 MakeCat.exe 位於 WDK 的 「bin\selfsign」 目錄中。

如何建立 .cat 檔案

數位簽署的 .cat 檔案包含載入核心時驗證的所有核心模式模組雜湊。 類別目錄檔案也可以包含軟體套件中其他檔案的雜湊,例如使用者模式應用程式程式 (.exes) ,以及應用程式延伸模組 (.dlls) 。 Microsoft 建議 .cat 檔案包含軟體套件中所有檔案的雜湊。

.cat 檔案包含對應至指定檔案集的檔案雜湊清單。 檔案雜湊是目標檔案上 SHA1 雜湊的乘積。 一般檔案雜湊不會用於使用可攜式可執行檔的檔案,例如驅動程式, (PE) 檔案格式。 相反地,PE 標頭、可執行資料和已驗證屬性等相關區段會選擇性地雜湊。

當驅動程式載入記憶體時,Windows Vista 核心會在驅動程式二進位映射檔的相關區段上執行 SHA1 雜湊。 Windows 藉由比較產生的雜湊值與相關聯 .cat 檔案中的二進位雜湊清單,來驗證檔案尚未遭到竄改。

如果透過隨插即用安裝驅動程式與 INF 檔案,請使用 WDK 的可簽署性工具來建立目錄,如下所述。 否則,請依照本檔中稍後的 How to Create a Catalog Manually 所述手動建立目錄。

如何使用可簽署性建立目錄

可簽署性是一種工具,可用來驗證 INF 檔案,並根據 INF 檔案建立類別目錄檔案。 它包含在 WDK 中,而且可以從 WDK 建置環境執行。 可簽署性需要驅動程式套件的有效 INF 檔案。 如需有關建立 INF 檔案的資訊,請參閱 WDK 檔。 若要使用可簽署性工具來建立目錄,請繼續進行,如下所示:

使用可簽署性建立目錄

  1. 建立驅動程式套件目錄,其中包含驅動程式套件中的所有檔案。
  2. 在驅動程式套件目錄中建立 INF 檔案,並針對 Windows Vista 進行編輯。 具體而言,將組建日期變更為 2006/4/1 或更新版本,並將版本變更為 6。 例如:DriverVer=04/01/2006、6.0.1.0
  3. 執行可簽署性,根據 INF 檔案建立有效的 .cat 檔案:
    • 執行Signability.exe並使用 GUI 來建立類別目錄檔案。

    • 從命令列執行可簽署性。 注意 package_directory 必須是套件目錄的完整路徑。

      Signability.exe /auto /cat /driver:package_directory /os:512
      

此範例會使用 Signability 支援的數個引數,在 driver_package 目錄中建立 .cat 檔案:

  • /自動
    設定可簽署性工具執行,而不需要使用者互動。
  • /貓
    設定可簽署性工具,以產生驅動程式套件 INF 檔案所提供名稱的類別目錄檔案。
  • /driver:DriverPath
    提供包含驅動程式套件檔案之目錄的路徑。
  • /os:nnn
    設定可簽署性工具,以確認驅動程式套件 INF 檔案符合旗標值 nnn所指定的 Windows 版本需求。 512 是 Windows Vista 64 位版本的值。

如何手動建立目錄

若要手動建立 .cat 檔案,請先使用文字編輯器建立目錄定義檔, (.cdf) 。 .cdf 檔案包含要編錄的檔案清單及其屬性。

下列範例顯示名為 Good.cdf的一般 .cdf 檔案內容。 要編錄的封裝包含兩個檔案:File1 和 File2。 產生的 .cat 檔案名為 Good.cat

[CatalogHeader]
Name=Good.cat
PublicVersion=0x0000001
EncodingType=0x00010001
CATATTR1=0x10010001:OSAttr:2:6.0
[CatalogFiles]
<hash>File1=File1
<hash>File2=File2

.cat 檔案是使用命令列工具 MakeCat 所建立,隨附于平臺 SDK 和 WDK。 MakeCat 工具:

  • 驗證每個列出的檔案的屬性清單。
  • 將列出的屬性新增至 .cat 檔案。
  • 雜湊每個列出的檔案。
  • 將每個檔案的雜湊儲存到 .cat 檔案中。

若要建立 .cat 檔案

  1. 使用文字編輯器建立 .cdf 檔案,其中包含要編錄的檔案清單及其屬性。
  2. 對 .cdf 檔案執行 MakeCat。

注意 MakeCat 不會修改 .cdf 檔案。

下列範例示範如何從 Good.cdf 建立 .cat 檔案。 -v旗標會指定 MakeCat 的詳細資訊版本。 雜湊檔案和新產生的 Good.cat 檔案會放在與 File1 和 File2 相同的資料夾中。

MakeCat -v Good.cdf

.cat 檔案現在已準備好簽署。

如需 MakeCat 和 .cdf 檔案格式的詳細資訊,請參閱本檔結尾的 Resources 中列出的 MakeCat 檔。

如何簽署 .cat 檔案

MakeCat 所產生的 .cat 檔案包含在使用者系統上安裝核心模式模組所需的所有檔案雜湊。 不過,也必須以數位方式簽署檔案。

使用命令列工具 SignTool 簽署 .cat 檔案。 目錄中用來驗證核心模式映射檔的數位簽章必須包含交叉憑證。 交叉憑證會使用 SignTool 的新命令選項來新增。

重要 您必須使用 Windows Vista Beta2 WDK 中的 SignTool 版本,將交叉憑證新增至數位簽章。

下列範例示範如何使用 Signtool,以 SPC 和匯入 Windows 憑證存放區的對應私密金鑰簽署 .cat 檔案。 如需如何搭配 HSM 使用 Signtool 的詳細資訊,請參閱本檔結尾的 Resources 中列出的 SignTool 檔。

SignTool sign /v /ac CrossCertificateFile /s SPCCertificateStore /n SPCSubjectName /t http://timestamp.verisign.com/scripts/timestamp.dll Good.cat

此範例使用 SignTool 支援的數個引數:

  • 簽署
    設定工具簽署名為 CatFileName.cat的 .cat 檔案。
  • /v
    指定成功執行和警告訊息的詳細資訊選項*.*
  • /交流
    將跨憑證從 CrossCertificateFile 檔案新增至數位簽章
  • /s
    指定名為SPCCertificateStore的憑證存放區。
  • /n
    指定主體名稱為 SPCSubjectName的憑證。
  • /tURL
    指定時間戳記授權單位 (TSA) URL 所指示的時間戳記。

重要 目錄或驅動程式簽章錯誤包含時間戳記,以提供金鑰撤銷的必要資訊,以防簽署者的程式碼簽署私密金鑰遭到入侵。

在裝置安裝期間,如果用於簽署的 SPC 已過期且簽章未設定時間戳記,則不會安裝 .cat 檔案,且 Windows 不允許載入驅動程式。 不過,如果簽章是由受信任的時間戳記授權單位時間戳記,則會安裝 .cat 檔案,且 Windows 允許載入驅動程式。

簽署自我解壓縮下載檔案

在產品支援網站上發佈的軟體通常會封裝在自我解壓縮封存檔案中。 自我擷取可執行檔會使用網頁瀏覽器下載,並在使用者開始在其電腦上安裝之前擷取的內容。 使用簽署驅動程式套件 .cat 檔案的 SPC,以數位方式簽署自我解壓縮.exe檔案。

數位簽章自我擷取.exe檔案可識別封存檔的發行者,並確保透過網際網路下載之自我解壓縮.exe檔案的完整性。 下載自我解壓縮.exe檔案的使用者通常會在選擇下載並執行自我解壓縮檔案時收到信任對話方塊或安全性警告。

在 Windows Vista 中,如果使用者查看 [安全性警告] 對話方塊的詳細資料,並選取 [一律從 < 發行者名稱 > 安裝軟體],此選項將會簡化安裝驅動程式套件時的後續確認。 安裝驅動程式套件時,系統會詢問使用者是否信任已簽署驅動程式套件的發行者,再開始安裝驅動程式。 如果使用者在下載自我解壓縮.exe檔案時,已選取一律從驅動程式發行者安裝軟體的選項,則不會在驅動程式安裝期間出現信任對話方塊提示。

如何安裝已簽署的 .cat 檔案

對於透過隨插即用安裝的驅動程式,安裝程式中不會有任何變更。 安裝內嵌簽署驅動程式不需要除了標準 INF 和安裝機制之外的特殊處理。 請注意,只有屬於 Administrators 群組成員的使用者才能安裝驅動程式套件。

未透過隨插即用安裝的驅動程式必須在系統目錄根資料夾中安裝其 .cat 檔案。 您可以使用現有的 Win32 目錄 API 呼叫來管理目錄根資料夾中的目錄安裝,特別是 CryptCATAdminAddCatalog

將內嵌簽章新增至驅動程式映射檔

若要在開機時優化驅動程式驗證的效能,開機啟動驅動程式二進位檔除了套件的已簽署 .cat 檔案之外,還必須有使用 SPC 的內嵌簽章。 內嵌簽章會在作業系統開機期間節省大量時間,因為不需要作業系統載入器在驅動程式中找出 .cat 檔案。 一般的 Windows Vista 系統在目錄根存放區中可能有數百個不同的目錄檔案。 尋找正確的類別目錄檔案來驗證特定驅動程式的映射雜湊,可能會牽涉到大量系統額外負荷,搜尋多個目錄以尋找正確的檔案。

開機啟動驅動程式是根據 0 SERVICE_BOOT_START (0) 的服務 StartType 值來識別。

內嵌簽章不會干擾 .cat 檔案簽署或驗證。 請注意,目錄和內嵌簽章中包含的雜湊會選擇性地排除 PE 檔案格式的簽章部分

若要使用 Signtool.exe,使用 SPC 將簽章內嵌至開機啟動驅動程式二進位檔,以及匯入 Windows 憑證存放區的對應私密金鑰,請使用下列命令:

SignTool sign /v /ac CrossCertificateFile /s SPCCertificateStore /n SPCSubjectName /t http://timestamp.verisign.com/scripts/timestamp.dll winloaddriver.sys

此範例使用 SignTool 支援的數個引數:

  • 簽署
    sign命令會將工具設定為簽署名為winloaddriver.sys的驅動程式。
  • /v
    指定成功執行和警告訊息的詳細資訊選項*.*
  • /交流
    將跨憑證從 CrossCertificateFile 檔案新增至數位簽章
  • /s選項
    指定名為SPCCertificateStore的憑證存放區
  • /n
    指定主體名稱 為 SPCSubjectName的憑證。
  • /tURL
    指定數位簽章應以 URL 表示的 TSA 時間戳記

重要: 目錄或驅動程式必須有時間戳記,因為這樣會提供金鑰撤銷的必要資訊,以防簽署者金鑰遭到入侵。

如何驗證內嵌簽章

下列程式示範如何使用 Windows 檔案總管來驗證內嵌簽章。

驗證內嵌簽章

  1. 執行 Windows Vista 時,以滑鼠右鍵按一下驅動程式.sys檔案,然後按一下操作功能表中的 [ 屬性 ]。
  2. 如果存在,請按一下 [ 數位簽章] 索引標籤
    • 如果此索引標籤不存在,檔案沒有內嵌簽章。
  3. 選取簽署者,然後按一下 [ 詳細資料] 以開啟 [ 簽章詳細資料 ] 對話方塊。
  4. 按一下 [檢視憑證 ] 以開啟憑證的屬性頁。
    • 確認沒有警告對話方塊。
    • 確認憑證主體名稱為 發行者已向已辨識的憑證授權單位單位註冊
  5. 按一下 [ 認證路徑] 索引標籤。
    • 確認頂端憑證的主體名稱是 Microsoft 程式碼驗證根目錄。

若要使用核心模式程式碼簽署原則的signtool.exe來驗證內嵌簽章

  • Signtool.exe可用來使用下列命令來驗證 .cat 檔案上的簽章:
Signtool verify /kp /c tstamd64.cat toaster.sys

確認目錄檔案中找到檔案toaster.sys映射雜湊。 此工具會傳回字串 「Success」。

如何在開發期間停用簽章強制執行

在開發初期階段,開發人員可以在 Windows 中停用強制,因此不需要驅動程式簽署。 下列選項可供開發人員暫時停用核心模式程式碼簽署強制,讓 Windows Vista 載入未簽署的驅動程式。

  • 附加核心偵錯工具。 將作用中核心偵錯工具附加至目的電腦會停用在 Windows Vista 中強制執行核心模式簽章,並允許驅動程式載入。

  • 使用 F8 選項。 Windows Vista 引進的 F8 進階開機選項—「停用驅動程式簽章強制」—僅適用于目前的開機會話停用核心簽署強制。 此設定不會在開機會話之間保存。

  • 設定開機組態。 Windows Vista Beta2 版本中提供開機組態設定,可停用在開機會話之間保存核心模式簽章的強制。

    Windows Vista 包含命令列工具 BCDedit,可用來設定 Windows Vista Beta2 中的選項以停用簽章檢查。 若要使用 BCDedit,使用者必須是系統上 Administrators 群組的成員,並從提升許可權的命令提示字元執行命令。 您可以建立桌面快捷方式來啟動提升許可權的命令提示字元,以cmd.exe,然後使用滑鼠右鍵和 [以系統管理員身分執行]。

    以下顯示命令提示字元中執行 BDCedit 的範例:

    // Disable enforcement – no signing checks
    Bcdedit.exe –set nointegritychecks ON 
    
    // Enable enforcement – signing checks apply
    Bcdedit.exe –set nointegritychecks OFF 
    
    // Disabling integrity check on an alternate OS 
    // specified by a GUID for the system ID
    Bcdedit.exe –set {4518fd64-05f1-11da-b13e-00306e386aee} nointegritychecks ON 
    

注意 停用完整性檢查的 Bcdedit 選項僅適用于在 Windows Vista Beta2 版本上載入未簽署的驅動程式。 如需詳細資訊,請參閱 MSDN 網站上的 BCD 編輯器常見問題。

如何使用測試簽署

測試簽署可為開發組織提供其他選項,以納入尚未準備好發行前版本軟體的核心模式程式碼簽署。 測試簽署允許使用「測試」程式碼簽署憑證來簽署驅動程式,當 Windows Vista 開機組態設定允許測試簽章時,將會載入 Windows Vista 上的驅動程式。

測試簽署可能適用于下列案例:

  • 開發小組需要在測試系統上測試驅動程式的發行前版本,因為附加核心偵錯工具並不實用。
  • 核心模式軟體的自動化測試,使得使用 F8 進階開機選項,在每部機器開機週期暫時停用驅動程式簽章強制。

測試簽署可讓開發人員以 Windows Vista 驗證和載入已簽署驅動程式的方式簽署核心模式二進位檔的發行前版本。 測試簽署牽涉到下列與一般生產或發行簽署的差異:

  • 用於測試簽署的憑證可以使用Makecert.exe程式碼簽署工具或由企業 CA 發行,而不是使用商業 CA 所發行的 SPC 來產生。
  • 必須在將載入測試簽署驅動程式的 Windows Vista 系統上啟用啟用測試簽署的 Windows Vista 開機設定選項。

開發組織可以設定企業 PKI,併發出自己的測試程式碼簽署憑證,以用於測試簽署。 當 Windows Vista 啟用測試簽署時,驅動程式二進位檔上的數位簽章驗證將會接受 任何 CA 或發行授權單位所簽發的憑證。 測試簽署會驗證驅動程式映射是否已簽署,但核心模式中執行的憑證路徑驗證不需要將簽發者設定為受信任的根授權單位。 這可讓組織根據針對組織內程式碼簽署所發出的認證,在測試二進位檔上使用個別簽章。 Microsoft 建議此形式的部署,以在核心模式程式碼簽署內進行測試簽署。

您也可以接受使用makecert.exe工具所產生的憑證進行測試簽署。 不過,makecert 所產生的憑證通常不會提供有用的身分識別資訊,而且沒有任何方法可以追蹤哪些個別開發人員建立了發行前版本二進位檔的測試簽署版本。

注意 Windows Vista Beta2 版本只接受 makecert 工具所產生的測試憑證。 Windows Vista Beta2 中無法使用企業 CA 所發行的測試程式碼簽署憑證以進行測試簽署。

本檔中的 Signtool 指示的運作方式與您使用 SPC 或 makecert 公用程式所產生的憑證,或使用企業 CA 所簽發的憑證相同。 唯一的差異通常是憑證中的簽發者和主體名稱。

也支援 WHQL 測試簽章程式進行測試簽署。 程式中的參與者可以提交 WHQL 測試簽章的驅動程式套件。 測試簽署目錄上的簽章是由 Microsoft 測試根目錄授權單位所簽發的憑證所產生。 Windows Vista Beta2 預設會接受 Microsoft 測試根目錄授權單位,作為 Beta 計畫的一部分。 在 Windows Vista 的最終版本中,當 Windows Vista 開機組態設定啟用 [測試簽署] 時,會接受 Microsoft Test Root Authority。

根據預設,測試已簽署的核心模式二進位檔不會載入 Windows Vista 系統上。 根據預設,測試簽署二進位檔上的數位簽章在 Windows Vista 系統上無效,因為核心模式程式碼簽署原則不接受且不信任測試簽署憑證。

啟用測試簽署

使用 Bcdedit 命令列工具來啟用測試簽署。 若要使用 BCDedit,使用者必須是系統上 Administrators 群組的成員,並從提升許可權的命令提示字元執行命令。 您可以建立桌面快捷方式來啟動提升許可權的命令提示字元,以cmd.exe,然後使用滑鼠右鍵和 [以系統管理員身分執行]。

以下顯示命令提示字元中執行 BDCedit 的範例:

// Accept test signed kernel mode signatures
Bcdedit.exe –set TESTSIGNING ON 

// Do not accept test signed kernel mode signatures
Bcdedit.exe –set TESTSIGNING OFF 

TESTSIGNING開機組態選項會決定 Windows Vista 是否接受測試簽署的核心模式二進位檔。 預設不會定義選項,這表示測試已簽署核心模式驅動程式上的數位簽章將不會驗證且不會載入。 當 Windows Vista 接受測試簽署的核心模式二進位檔時,某些受保護的進階內容可能無法在系統上存取。

疑難排解

您可以採取特定步驟來識別和疑難排解與驗證核心模式程式碼簽章相關的潛在問題。 本節提供有關針對驅動程式簽署強制執行問題進行疑難排解的資訊。 針對驅動程式簽署問題進行疑難排解的主要工具如下:

  • 偵測驅動程式負載錯誤
  • 啟用程式碼完整性診斷系統記錄事件。

Windows Vista WDK 中包含的咖啡機應用程式會作為範例使用。 您可以在 「src\general\toaster」 目錄下的 WDK 中找到一個 toaster 應用程式。

偵測驅動程式負載錯誤

toaster 應用程式會安裝裝置驅動程式 (toaster.sys) ,在此範例中未簽署。 未簽署驅動程式發生問題的徵兆是,咖啡機裝置無法啟動。 使用裝置管理員,您可以檢查 Toaster 裝置的狀態,並檢視驅動程式狀態,如下列螢幕影像所示。

Bb530195.digitalsigskernmodules01 (en-us,MSDN.10) .gif

圖 1. 未簽署的驅動程式錯誤

裝置無法啟動,因為裝置驅動程式未簽署,且核心模式簽署強制會封鎖驅動程式載入核心。 為了明確識別問題的來源,我們會設定系統以啟用簽署強制診斷,如下所示。

啟用程式碼完整性診斷系統記錄事件

核心模式程式碼簽署強制執行是由稱為程式碼完整性的 Windows Vista 元件所實作。 當核心模組的簽章無法正確驗證時,程式碼完整性會產生診斷事件和系統稽核記錄事件。

  • 一律會啟用程式碼完整性作業事件。 當載入核心模式二進位檔時,映射驗證檢查失敗時,作業事件是警告事件。
  • 啟用系統稽核原則時,會產生程式碼完整性系統稽核事件。 系統稽核原則預設不會啟用。
  • 程式碼完整性詳細資訊事件是分析和偵錯資訊事件,顯示載入核心模式二進位檔時所有成功的影像驗證檢查。 預設不會啟用詳細資訊事件。

程式碼完整性事件可在事件檢視器下檢視,這是電腦管理 MMC 嵌入式管理單元的一部分。 (從 [ 開始 ] 按鈕,以滑鼠右鍵按一下 [電腦],然後選取 [ 管理) ]。

程式碼完整性事件資料流程位於下列階層之下:

事件檢視器 - >應用程式和服務記錄 - Microsoft - >> Windows - > CodeIntegrity

Bb530195.digitalsigskernmodules02 (en-us,MSDN.10) .gif

圖 2. 程式碼完整性事件

程式碼完整性作業記錄會顯示當核心模式驅動程式載入時映射驗證檢查失敗時,核心所產生的事件。 映射驗證失敗可能是因為許多原因所造成,包括下列各項:

  • 驅動程式未簽署,但由系統管理員安裝在系統上,且程式碼完整性不允許驅動程式載入。
  • 驅動程式已簽署,但驅動程式映射檔案已修改或竄改,且修改會使驅動程式簽章失效。
  • 從不正確的磁片磁區讀取裝置的映射檔時,系統磁片裝置可能會發生裝置錯誤。

未簽署或修改驅動程式映射驗證失敗的作業記錄專案看起來像下列範例:

Bb530195.digitalsigskernmodules03 (en-us,MSDN.10) .gif

圖 3. 操作記錄專案

此事件表示無法載入) ,因為未簽署 (或嘗試載入的toaster.sys映射與發行者) 以數位方式簽署的映射不同。
所有程式碼完整性事件記錄檔訊息都會列在下列程式碼完整性事件記錄檔訊息一節中。

系統稽核記錄事件

程式碼完整性會在核心模式驅動程式的影像驗證失敗時,產生對應至操作警告事件的系統稽核記錄事件。 系統記錄事件可在 Windows 記錄、系統記錄檢視下的 事件檢視器中檢視。

系統稽核事件可能無法在所有 Windows Vista 系統上啟用。 使用本機安全性設定 MMC 嵌入式管理單元,在 [本機原則]、[稽核原則] 設定下驗證或啟用[稽核系統事件]。

詳細資訊記錄檔中的資訊事件

所有核心模式影像驗證檢查的其他程式碼完整性資訊事件都可以使用詳細資訊事件檢視。 這些事件會顯示系統上所有載入之驅動程式的成功影像驗證。

啟用程式碼完整性詳細資訊事件檢視的步驟如下:

  1. 以滑鼠左鍵按一下 [作業 ] 檢視,即可在有任何) 時顯示目前的程式 代碼完整性 (事件
  2. 按一下 [ 程式碼完整性] 節點以設定焦點。
  3. 以滑鼠右鍵按一下 [ 程式碼完整性 ] 節點以取得操作功能表。
  4. 選取 [檢視]。
  5. 選取 [顯示分析和偵錯記錄]。
  6. 這會建立具有兩個額外節點的子樹狀結構: OperationalVerbose 節點。
  7. 以滑鼠右鍵按一下 [詳細資訊 ] 節點,然後選取 [ 屬性]。
  8. 選取 [ 一般] 工作表,然後選取 [ 啟用記錄 ] 選項。 這應該會啟用詳細資訊記錄模式。
  9. 重新開機系統以重載所有核心模式二進位檔。
  10. 重新開機之後,開啟 [電腦管理 ] 嵌入式管理單元,然後檢視程式 代碼完整性詳細資訊事件記錄檔

您可以檢查toaster.sys是否已正確簽署,如下所示:

在此特定案例中,toaster.sys是 PnP 驅動程式,並在 「\src\general\toaster\toastpkg\toastcd」 的目錄檔案 (tstamd64.cat 中命名為 「\src\general\toastpkg\toastcd」。 使用 SignTool 公用程式來驗證toaster.sys是否已使用下列命令正確簽署目錄:

Signtool verify /kp /c tstamd64.cat toaster.sys

驅動程式驗證偵錯選項

在某些情況下,即使附加偵錯工具,開發人員也可能想要強制執行強制的核心模式程式碼簽署原則。 其中一個範例是,當驅動程式堆疊具有未簽署的驅動程式 (,例如無法載入的篩選準則驅動程式) ,這可能會使整個堆疊失效。 由於附加偵錯工具可讓未簽署的驅動程式載入,因此只要附加偵錯工具,問題就會消失。 對這類問題進行偵錯可能很困難。 為了協助在此案例中偵錯,程式碼完整性支援登錄機碼,即使附加偵錯工具,也可以設定為強制執行核心模式簽署強制執行。

登錄中定義了兩個旗標,可控制偵錯工具底下的程式碼完整性行為。 根據預設,不會定義旗標。

建立登錄值,如下所示:

Key:   HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CI
Value:   DebugFlags      REG_DWORD   

可能的值:

  • 00000001
    導致偵錯中斷至偵錯工具,且允許使用 未簽署的驅動程式載入 g
  • 00000010
    CI 會忽略偵錯工具的存在,且未簽署的驅動程式會遭到封鎖而無法載入。

任何其他值都會導致未簽署的驅動程式載入,這是預設原則。

程式碼完整性事件記錄檔訊息

以下是記錄至程式碼完整性作業記錄的警告事件:

  • 「程式碼完整性無法驗證檔案名 <> 的映射完整性,因為找不到系統上的檔案雜湊。」
  • 「程式碼完整性偵測到未簽署的驅動程式」。
  • 「此事件與 SOFTWARE Quality Monitoring (SQM) 相關。」

以下是記錄至程式碼完整性詳細資訊記錄檔的資訊事件:

  • 「程式碼完整性找到目錄目錄名稱>> 中 <檔案名< 的一組每頁影像雜湊。」
  • 「程式碼完整性找到映射內嵌憑證中檔案名>< 的一組個別影像雜湊。」
  • 程式碼完整性在目錄 <目錄名稱>> 中找到檔案名的檔案 < 雜湊。」
  • 「程式碼完整性在映射內嵌憑證中找到檔案名>< 的檔案雜湊。」
  • 「程式碼完整性判斷未簽署的核心模組 <檔案名> 已載入系統中。 請洽詢發行者,以查看核心模組的已簽署版本是否可用。」
  • 「程式碼完整性無法驗證檔案名>< 的映射完整性,因為系統上找不到每頁影像雜湊集。」
  • 「程式碼完整性無法驗證檔案名>< 的映射完整性,因為系統上找不到每頁影像雜湊集。 允許載入映射,因為已附加核心模式偵錯工具。」
  • 「程式碼完整性無法驗證檔案名> 的 < 映射完整性,因為系統上找不到檔案雜湊。 允許載入映射,因為已附加核心模式偵錯工具。」
  • 「程式碼完整性無法載入 <檔案名> 目錄」。
  • 「程式碼完整性已成功載入 <檔案名> 目錄」。

資源