執行 Windows Vista 之系統上核心模組的數位簽名
Microsoft公司
更新日期: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) 和受保護音訊路徑 (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 以簽署符合必要核心模式程式代碼簽署原則的核心模式軟體:
- 從發行數位證書以進行簽署核心模式程式代碼的商業 CA 取得 SPC。 提供軟體發佈憑證(或程式代碼簽署憑證)的 CA 清單,可用於核心模式程式代碼簽署的 Microsoft Windows Vista 核心模式程式代碼簽署的跨憑證 網頁。
- 從發行 SPC 之跟證書授權單位的 Windows Vista 核心模式程式代碼簽署 網頁,從
Microsoft跨憑證下載對應的跨憑證。 跨憑證用於核心模式程式代碼的數字簽名中,以便將簽章驗證為 Windows Vista 核心已知的受信任根授權單位。
當您向商業 CA 要求軟體發佈憑證時,請遵循 CA 網站上的指示,瞭解如何在您將使用私鑰來簽署程式碼的電腦上取得並安裝程式碼簽署憑證。
保護程式代碼簽署金鑰的指引
程式代碼簽署程式的核心密碼編譯密鑰必須受到很好的保護,並受到與任何公司最有價值的資產相同的處理。 這些金鑰代表公司身分識別。 使用這些密鑰簽署的任何程式碼,都會出現在 Windows 上,就好像它包含可追蹤到公司的有效數位簽名一樣。 如果密鑰遭竊,他們可以用來詐騙惡意代碼,並可能導致程式碼的傳遞,其中包含看似來自合法發行者的特洛伊木馬或病毒。
如需安全防護私鑰的詳細資訊,請參閱 程式代碼簽署最佳做法。
搭配核心模式程式代碼簽署使用跨憑證
核心模式程式代碼簽署會使用跨憑證作為程式代碼簽署程式的一部分。 跨憑證是由一個證書頒發機構單位 (CA) 簽發的 X.509 憑證,會簽署另一個證書頒發機構單位跟證書的公鑰。 Windows Vista 操作系統載入器和核心會辨識驗證驅動程式簽章中的跨憑證。 跨憑證可讓核心擁有單一受信任的Microsoft根授權單位,但也提供彈性,將信任鏈延伸到發行軟體發行者憑證的多個商業 CA。
跨憑證可讓開發人員和發行者使用軟體發行者憑證來簽署核心模式軟體。 使用核心模式程式代碼簽署的開發人員,會將正確的跨憑證 (.cer) 檔案下載到執行數位簽名作業的系統。 發行者不需要使用其軟體或驅動程式套件來散發跨憑證檔案。 跨憑證會隨附於驅動程式映像檔或驅動程式套件目錄上的數字簽名。 安裝驅動程式套件的使用者不需要執行 Windows Vista 的任何設定步驟,即可驗證包含跨憑證的數字簽名。
重要 Windows Vista Beta2 WDK 中的 SignTool 是唯一支援將跨憑證新增至數位簽名的 SignTool 版本。 Windows Server 2003 平臺 SDK 或 DDK 中的舊版 SignTool 不支援新增跨憑證。
多個 CA 用於核心模式程式代碼簽署的跨憑證可從 Microsoft WHDC 網站下載。 如需詳細資訊,請參閱本文結尾的中 Microsoft Windows Vista 核心模式程式代碼簽署 的跨憑證。
有關如何將跨憑證新增至數位簽名的詳細數據,請參閱如何簽署 .cat 檔案和將內嵌簽章新增至驅動程式映射檔一節。
產生測試憑證
測試憑證會用來取代 SPC,以測試簽署核心模式軟體模組,這些軟體模組不適用於組織外部的發佈或發行。 測試簽署將數位簽名套用至核心模式二進位檔或用於內部測試目的的驅動程式套件目錄。 本檔稍後如何使用測試簽署一節將更詳細地討論測試簽署。 使用測試憑證進行核心模式程式代碼簽署時,不需要跨憑證。
測試憑證可以使用企業 CA 或使用 Makecert 公用程式產生。 如需在組織中使用企業 CA 來發行測試簽署憑證的詳細資訊,請參閱 程式代碼簽署最佳做法。
在下列範例中,Makecert 會產生預設測試根所簽發的測試憑證、將私鑰儲存在密鑰容器中,並將憑證輸出至證書存儲和憑證檔案:
Makecert –r –pe –ss SubjectCertStoreName –n "CN= CertName" OutputFile.cer
範例中Makecert的自變數會執行下列動作:
-
-r
建立自我簽署憑證,也就是憑證是跟證書。 -
-pe
使與憑證可匯出關聯的私鑰。 -
-ssSubjectCertStoreName
指定包含跟證書的憑證儲存名稱。 - **-n “CN=**CertName”
指定憑證的名稱。 如果未提供憑證名稱,則憑證的預設名稱為 「Joe 的軟體 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 的自變數會執行下列動作:
-
-add
將憑證檔案中的憑證新增至證書存儲。 -
-s
指出證書存儲是系統存放區。 -
-r
指出系統存放區的登錄位置位於HKEY_LOCAL_MACHINE機碼下 -
root 或 trustedpublisher
指出系統證書存儲的名稱
如需 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 檔。 若要使用可簽署性工具建立目錄,請繼續進行,如下所示:
使用可簽署性建立目錄
- 建立驅動程式套件目錄,其中包含驅動程式套件中的所有檔案。
- 在驅動程式套件目錄中建立 INF 檔案,並針對 Windows Vista 加以編輯。 具體來說,將組建日期變更為 2006 年 4 月 1 日或更新版本,並將版本變更為 6。 例如:DriverVer=04/01/2006、6.0.1.0
- 執行 [可簽署性] 以根據 INF 檔案建立有效的 .cat 檔案:
執行 Signability.exe 並使用 GUI 來建立目錄檔案。
從命令行執行可簽署性。 注意 package_directory 必須是套件目錄的完整路徑。
Signability.exe /auto /cat /driver:package_directory /os:512
此範例會使用 Signability 支持的數個自變數,在 driver_package 目錄中建立 .cat 檔案:
-
/auto
設定可簽署性工具以執行,而不需要用戶互動。 -
/cat
設定可簽署性工具,以產生驅動程式套件 INF 檔案提供其名稱的目錄檔案。 -
/driver:DriverPath
提供包含驅動程式套件檔案之目錄的路徑。 -
/os:nnn
設定可簽署性工具,確認驅動程式套件 INF 檔案符合旗標值所指定之 Windows 版本的需求,nnn。 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 檔案
- 使用文本編輯器建立 .cdf 檔案,其中包含要編錄的檔案清單及其屬性。
- 對 .cdf 檔案執行MakeCat。
Note MakeCat 不會修改 .cdf 檔案。
下列範例示範如何從 Good.cdf 建立 .cat 檔案。 -v 旗標會指定MakeCat的詳細資訊版本。 哈希檔案和新產生的 Good.cat 檔案會放在與 File1 和 File2 相同的資料夾中。
MakeCat -v Good.cdf
.cat 檔案現在已準備好簽署。
如需MakeCat和 .cdf檔案格式的詳細資訊,請參閱本文結尾的Resources中列出的MakeCat檔。
如何簽署 .cat 檔案
MakeCat 所產生的 .cat 檔案包含在用戶系統上安裝內核模式模組所需的所有檔案哈希。 不過,檔案也必須經過數字簽署。
.cat 檔案會使用命令行工具 SignTool 進行簽署。 目錄上的數位簽名,用來驗證核心模式映射檔,必須包含跨憑證。 交叉憑證會使用新的命令選項新增至 SignTool。
重要 您必須使用 Windows Vista Beta2 WDK 中的 SignTool 版本,將跨憑證新增至數字簽名。
下列範例示範如何使用 Signtool,使用 SPC 和匯入至 Windows 證書存儲的對應私鑰來簽署 .cat 檔案。 如需如何使用 Signtool 搭配 HSM 的詳細資訊,請參閱本文結尾的 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
指定成功執行和警告訊息的詳細資訊選項*.* -
/ac
將跨憑證從檔案 CrossCertificateFile 新增至數字簽名 -
/s
指定名為 SPCCertificateStore 的證書存儲。 -
/n
指定主體名稱 SPCSubjectName 的憑證。 -
/tURL
指定數位簽名會由 URL 所指示的時間戳授權單位 (TSA) 加上時間戳。
重要 目錄或驅動程式簽章霧包含時間戳,以提供密鑰撤銷的必要資訊,以防簽署者的程式代碼簽署私鑰遭到入侵。
在裝置安裝期間,如果用於簽署的 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 系統在目錄根存放區中可能有一百多個不同的目錄檔案。 尋找正確的類別目錄檔案來驗證特定驅動程式的映像哈希,可能會牽涉到大量系統額外負荷搜尋多個目錄以尋找正確的檔案。
開機啟動驅動程式是根據服務 StartType 值來識別SERVICE_BOOT_START (0)。
內嵌簽章不會干擾 .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
指定成功執行和警告訊息的詳細資訊選項*.* -
/ac
將跨憑證從檔案 CrossCertificateFile 新增至數字簽名 -
/s選項
指定名為 SPCCertificateStore 的證書存儲 -
/n
指定主體名稱 SPCSubjectName的憑證。 -
/tURL
指定數位簽名應以 URL 表示的 TSA 加上時間戳。
重要事項: 目錄或驅動程序必須加時間戳,因為這會提供密鑰撤銷的必要資訊,以防簽署者密鑰遭到入侵。
如何驗證內嵌簽章
下列程式示範如何使用 Windows 檔案總管驗證內嵌簽章。
確認內嵌簽章
- 執行 Windows Vista 時,以滑鼠右鍵按兩下驅動程式 .sys 檔案,然後按兩下操作選單中的 [屬性]
。 - 如果,請按兩下 [
數字簽名] 索引標籤。 - 如果這個索引標籤不存在,檔案就不會有內嵌的簽章。
- 選取簽署者,然後按兩下 [詳細數據],開啟 [簽章詳細數據] 對話方塊。
- 按兩下 [檢視憑證]
開啟憑證的屬性頁。 - 確認沒有警告對話框。
- 確認憑證主體名稱 發行者已向已辨識的證書頒發機構單位註冊,。
- 按兩下 [認證路徑] 索引標籤。
- 確認最上層憑證的主體名稱 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測試根授權單位。
根據預設,測試簽署的核心模式二進位檔將不會載入 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.sys),在此範例中未簽署。 未簽署驅動程式問題的徵兆是,烤箱裝置無法啟動。 使用設備管理員,您可以檢查烤箱裝置的狀態並檢視驅動程序狀態,如下列螢幕影像所示。
圖 1. 未簽署的驅動程序錯誤
裝置無法啟動,因為裝置驅動程式未簽署,而核心模式簽署強制會封鎖驅動程式載入核心。 為了明確識別問題的來源,我們設定系統以啟用簽署強制診斷,如下所述。
啟用程式代碼完整性診斷系統記錄事件
核心模式程式代碼簽署強制執行是由稱為程式代碼完整性的 Windows Vista 元件實作。 當核心模組的簽章無法正確驗證時,程式代碼完整性會產生診斷事件和系統稽核記錄事件。
- 程式代碼完整性作業事件一律會啟用。 作業事件是載入核心模式二進位檔時映像驗證檢查失敗時的警告事件。
- 啟用系統審核策略時,會產生程式代碼完整性系統稽核事件。 系統審核策略預設不會啟用。
- 程式代碼完整性詳細資訊事件是分析和偵錯載入核心模式二進位檔時顯示所有成功影像驗證檢查的資訊事件。 預設不會啟用詳細資訊事件。
程序代碼完整性事件可在事件查看器下檢視,這是計算機管理 MMC 嵌入式管理單元的一部分。 (從 [開始] 按鈕,以滑鼠右鍵按兩下 [計算機],然後 選取 [管理]。
程序代碼完整性事件數據流位於下列階層之下:
事件查看器 -> 應用程式和服務記錄 -> Microsoft -> Windows -> CodeIntegrity
圖 2. 程序代碼完整性事件
程式代碼完整性作業記錄會顯示當核心模式驅動程式載入驅動程式時映射驗證檢查失敗時,核心所產生的事件。 映射驗證失敗可能是因為許多原因所造成,包括下列各項:
- 驅動程式未簽署,但由系統管理員和程式代碼完整性安裝在系統上,不允許驅動程式載入。
- 驅動程式已簽署,但驅動程式映像檔案已修改或遭到竄改,且修改會使驅動程式簽章失效。
- 從不正確的磁碟扇區讀取裝置的映像檔時,系統磁碟裝置可能會發生裝置錯誤。
未簽署或修改驅動程式映像驗證失敗的作業記錄項目看起來像下列範例:
圖 3. 作業記錄專案
事件表示無法載入烤箱驅動程式(toaster.sys),因為它未簽署(或嘗試載入的 toaster.sys 映射與發行者以數位方式簽署的映像不同)。
下列程式代碼完整性事件記錄檔訊息列在程式代碼完整性事件記錄檔訊息一節中。
系統稽核記錄事件
程式代碼完整性會在核心模式驅動程式的映像驗證失敗時,產生對應至操作警告事件的系統稽核記錄事件。 系統記錄事件可在 Windows 記錄、系統記錄檢視下的 [事件查看器] 中檢視。
系統稽核事件可能無法在所有 Windows Vista 系統上啟用。 使用本機安全性設定 MMC 嵌入式管理單元,在 [本機原則]、[審核策略] 設定下驗證或啟用「稽核系統事件」。
詳細資訊記錄檔中的資訊事件
您可以使用詳細資訊事件檢視來取得所有核心模式映像驗證檢查的其他程式代碼完整性資訊事件。 這些事件顯示系統上所有載入之驅動程式的成功影像驗證。
啟用程式代碼完整性詳細資訊事件檢視的步驟如下:
- 按兩下 [操作] 檢視,以顯示目前 程式代碼完整性事件(如果有的話)。
- 按兩下 程式代碼完整性 節點以設定焦點。
- 以滑鼠右鍵按兩下 程式代碼完整性 節點,以取得操作功能表。
- 選取 [檢視]
。 - 選取 [顯示分析和偵錯記錄。
- 這會建立具有兩個額外節點的子樹狀結構:Operational 和 Verbose 節點。
- 以滑鼠右鍵按下
[詳細資訊] 節點,然後選取 [屬性]。 - 選取 [一般] 工作表,然後選取 [啟用記錄] 選項。 這應該會啟用詳細信息記錄模式。
- 重新啟動系統以重載所有核心模式二進位檔。
- 重新啟動之後,開啟 ComputerManagement 嵌入式管理單元,然後檢視 CodeIntegrityVerbose事件記錄。
您可以檢查 toaster.sys 是否正確簽署,如下所示:
在此特定案例中,toaster.sys 是 PnP 驅動程式,且在目錄檔案中命名 (tstamd64.cat “\src\general\toast\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 會忽略調試程式是否存在,且未簽署的驅動程式會遭到封鎖而無法載入。
任何其他值都會導致未簽署的驅動程式載入,這是默認原則。
程式代碼完整性事件記錄檔訊息
以下是記錄至程式代碼完整性作業記錄檔的警告事件:
- 「程式代碼完整性無法驗證檔案的映射完整性 <檔名>,因為系統上找不到檔案哈希。
- 「程式代碼完整性偵測到未簽署的驅動程式。」
- “此事件與軟體質量監控(SQM)有關。
以下是記錄至程式代碼完整性詳細資訊記錄檔的資訊事件:
- 「程式代碼完整性在目錄 <目錄名稱>中找到檔案 <檔名> 的一組個別頁面影像哈希。
- 「程式代碼完整性在映射內嵌憑證中,找到一組檔案 <檔名> 的個別頁面影像哈希。
- 「程式代碼完整性在目錄 <目錄名稱>中找到檔案 <檔名的檔案哈希>。」
- 「程式代碼完整性在映像內嵌憑證中
找到檔案 檔名的檔案哈希。 - 「程式代碼完整性決定未簽署的核心模組 <檔名> 載入系統中。 請洽詢發行者,以查看核心模組的已簽署版本是否可用。
- 「程式代碼完整性無法驗證檔案的映射完整性 <檔名>,因為系統上找不到每頁影像哈希集。
- 「程式代碼完整性無法驗證檔案的映射完整性 <檔名>,因為系統上找不到每頁影像哈希集。 因為連結核心模式調試程式,因此允許載入映像。」
- 「程式代碼完整性無法驗證檔案的映射完整性 <檔名>,因為系統上找不到檔案哈希。 因為連結核心模式調試程式,因此允許載入映像。」
- 「程式代碼完整性無法載入 <檔名> 目錄。」
- 「程式代碼完整性已成功載入目錄 <檔名>。」
資源
- 如需核心模式驅動程式數位簽章的相關問題,請傳送電子郵件至 signsup@microsoft.com。
- 適用於 Windows Vista 核心模式程式代碼簽署 Microsoft交叉憑證
- 開機設定數據編輯器常見問題
- MSDN SDK 檔中的 CryptCATAdminAddCatalog
- 使用密碼編譯硬體部署 Authenticode 以進行安全軟體發佈
- 適用於 Windows 的
偵錯工具 - Certmgr
- MakeCat
- Makecert
- SignTool
- Windows 驅動程式套件 (WDK)
- Windows 標誌計劃
- WHQL 測試簽章程式
- Windows Platform SDK 下載網站
- Windows Quality Online Services (Winqual)
- 程式代碼簽署最佳做法
- 在 Windows Vista 的隨插即用裝置安裝期間,驅動程式套件完整性
- Windows Vista 中受保護媒體元件的程式代碼簽署