遊戲開發人員的 Authenticode 簽署
數據驗證對遊戲開發人員而言越來越重要。 Windows Vista 和 Windows 7 有一些功能,例如家長監護,需要正確簽署遊戲,以確保沒有人竄改數據。 Microsoft Authenticode 可讓使用者和操作系統驗證程式代碼是否來自正確的擁有者,而且程式代碼並未遭到惡意修改或意外損毀。 本文討論如何開始驗證您的遊戲,以及如何將驗證整合到每日建置程式中。
注意
自 2016 年 1 月 1 日起,Windows 7 及更新版本不再信任任何 SHA-1 程式代碼簽署憑證,到期日為 2016 年 1 月 1 日或更新版本。 如需詳細資訊,請參閱 Windows 強制執行 Authenticode 程式代碼簽署和時間戳 。
背景
數位證書可用來建立作者的身分識別。 數字證書是由受信任的第三方所簽發,稱為證書頒發機構單位(CA),例如 VeriSign 或 Thawte。 CA 負責確認擁有者未宣告誤判。 在申請憑證的 CA 之後,商業開發人員可以在不到兩周內回應其應用程式。
CA 決定符合其原則準則之後,它會產生符合 X.509 的程式代碼簽署憑證,這是國際電信聯盟所建立的業界標準憑證格式,具有第 3 版延伸模組。 此憑證會識別您,並包含您的公鑰。 它是由 CA 儲存以供參考,並以電子方式提供一份複本給您。 同時,您也會建立私鑰,您必須保持安全,而且不得與任何人共用,甚至是 CA。
取得公開和私鑰之後,您就可以開始散發已簽署的軟體。 Microsoft提供在 Windows SDK 中執行這項操作的工具。 這些工具會利用單向哈希、產生固定長度的摘要,以及使用私鑰產生加密的簽章。 然後,它們會將加密的簽章與您的憑證和認證合併成稱為簽章區塊的結構,並將其內嵌至可執行檔的檔格式。 任何類型的可執行檔都可以簽署,包括 DLL、可執行檔和封包檔案。
簽章可以透過多種方式進行驗證。 程式可以呼叫 CertVerifyCertificateChainPolicy 函式,而 SignTool (signtool.exe) 可用來驗證命令行提示字元中的簽章。 Windows 檔案總管也有 [檔案屬性] 中的 [數字簽名] 索引標籤,其中會顯示已簽署二進位檔的每個憑證。 ([數字簽名] 索引標籤只會出現在已簽署檔案的 [檔案內容] 中。此外,應用程式可以使用 CertVerifyCertificateChainPolicy 進行自我驗證。
Authenticode 簽署不僅適用於使用者的數據驗證,而且需要修補有限的用戶帳戶,以及 Windows Vista 和 Windows 7 中的家長控制。 此外,Windows 操作系統的未來技術可能也需要簽署程式碼,因此強烈建議所有專業和業餘開發人員從 CA 取得程式碼簽署憑證。 如需有關如何完成這項作業的詳細資訊,請參閱使用受信任的證書頒發機構單位一文。
遊戲程式代碼、修補程式和安裝程式可以藉由驗證檔案在程式代碼中驗證,進一步運用 Authenticode 簽署。 這可用於反作弊和一般網路安全性。 您可以在這裡找到檢查檔案的範例程式代碼: 範例 C 程式:驗證 PE 檔案的簽章,以及檢查已簽署檔案上簽署憑證擁有權的範例程式代碼,請參閱這裡: 如何從 Authenticode 簽署可執行檔取得資訊。
快速入門
若要開始使用,Microsoft提供 Visual Studio 2005 和 Visual Studio 2008 以及 Windows SDK 中的工具,以協助執行和驗證程式代碼簽署程式。 安裝 Visual Studio 或 Windows SDK 之後,本技術文章所述的工具位於安裝子目錄中,其中可能包含下列一或多個專案:
- %SystemDrive%\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin
- %SystemDrive%\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\Bin
- %SystemDrive%\Program Files\Microsoft Visual Studio 9.0\SmartDevices\SDK\SDKTools\
- %SystemDrive%\Program Files\Microsoft SDKs\Windows\v6.0A\bin\
下列工具最適用於簽署程式碼:
-
憑證建立工具 (MakeCert.exe)
-
以.cer檔案的形式產生測試 X.509 憑證,其中包含公鑰和私鑰,以 .pvk 檔案的形式。 此憑證僅供內部測試之用,且無法公開使用。
-
pvk2pfx.exe
-
從一對.cer和 .pvk 檔案建立個人資訊交換 (.pfx) 檔案。 .pfx 檔案同時包含您的公開和私鑰。
-
SignTool (SignTool.exe)
-
使用 .pfx 檔案簽署檔案。 SignTool 支援簽署 DLL 檔案、可執行檔、Windows Installer (.msi) 檔案,以及封包 (.cab) 檔案。
注意
閱讀其他檔時,您可能會發現 SignCode 的參考 (SignCode.exe),但此工具已被取代且不再受到支援,請改用 SignTool。
使用受信任的證書頒發機構單位
若要取得受信任的憑證,您必須套用至證書頒發機構單位 (CA),例如 VeriSign 或 Thawte。 Microsoft不建議對另一個 CA 使用任何 CA,但如果您想要整合至 Windows 錯誤報告 (WER) 服務,您應該考慮使用 VeriSign 來發行憑證,因為存取 WER 資料庫需要需要 VeriSign 識別符的 WinQual 帳戶。 如需受信任第三方證書頒發機構單位的完整清單,請參閱 Microsoft跟證書計劃成員。 如需向WER 註冊的詳細資訊,請參閱ISV區域中的「Windows 錯誤報告 簡介」。
從 CA 收到憑證之後,您可以使用 SignTool 簽署程式,並將程式發行至公用。 不過,您必須小心保護私鑰,其包含在 .pfx 和 .pvk 檔案中。 請務必將這些檔案保留在安全的位置。
使用測試憑證的範例
下列步驟示範如何建立程式代碼簽署憑證以供測試之用,然後是使用此測試憑證簽署 Direct3D 範例程式(稱為 BasicHLSL.exe)。 此程式會分別建立.cer和 .pvk 檔案,您的公開和私鑰無法用於公開認證。
在此範例中,時間戳也會新增至簽章。 時間戳可防止簽章在憑證到期時變成無效。 簽署但缺少時間戳的程式代碼在憑證到期後將不會驗證。 因此,所有公開發行的程式代碼都應該有時間戳。
建立憑證並簽署程式
使用憑證建立工具建立測試憑證和私鑰(MakeCert.exe)。
下列命令行範例會將 MyPrivateKey 指定為私鑰 (.pvk) 檔案的檔名、MyPublicKey 做為憑證的檔名 (.cer) 檔案,並將 MySoftwareCompany 指定為憑證的名稱。 它也會讓憑證自我簽署,使其沒有不受信任的根授權單位。
MakeCert /n CN=MySoftwareCompany /r /h 0 /eku "1.3.6.1.5.5.7.3.3,1.3.6.1.4.1.311.10.3.13" /e 12-31-2020 /sv MyPrivateKey.pvk MyPublicKey.cer
使用 pvk2pfx.exe,從私鑰 (.pvk) 檔案和憑證 (.cer) 檔案建立個人資訊交換 (.pfx) 檔案。
.pfx 檔案會將您的公開和私鑰合併成單一檔案。 下列命令行範例會使用上一個步驟中的 .pvk 和 .cer 檔案,以密碼your_password建立名為 MyPFX 的 .pfx 檔案:
pvk2pfx.exe -pvk MyPrivateKey.pvk -spc MyPublicKey.cer -pfx MyPFX.pfx -po your_password
使用 SignTool 簽署您的程式與個人資訊交換 (.pfx) 檔案。
您可以在命令列上指定數個選項。 下列命令行範例使用上一個步驟中的 .pfx 檔案、提供your_password做為密碼、將 BasicHLSL 指定為要簽署的檔案,以及從指定的伺服器擷取時間戳:
signtool.exe sign /fd SHA256 /f MyPFX.pfx /p your_password /v /t URL_to_time_stamp_service BasicHLSL.exe
注意
時間戳服務的 URL 是由 CA 提供,而且是選擇性的測試。 生產簽署必須包含有效的時間戳授權單位,或簽章在憑證到期時無法驗證。
使用 SignTool 確認程式已簽署。
下列命令行範例會指定 SignTool 應該嘗試使用所有可用方法來驗證BasicHLSL.exe上的簽章,同時提供詳細資訊輸出:
signtool.exe verify /a /v BasicHLSL.exe
在此範例中,SignTool 應該指出憑證已附加,同時指出憑證不受信任,因為它不是由 CA 發行。
信任測試憑證。
針對測試憑證,您需要信任憑證。 CA 所提供的憑證應該略過此步驟,因為這些憑證預設會受到信任。
在只想要信任測試憑證的計算機上,執行下列命令:
certmgr.msc
然後以滑鼠右鍵按兩下 [受信任的跟證書授權單位],然後選擇 [所有工作] |進口。 然後流覽至您所建立的 .pfx 檔案,並遵循精靈步驟,將憑證放在受信任的跟證書授權單位中。
當精靈完成時,您可以使用該電腦上的受信任憑證開始測試。
將程式代碼登入整合到每日建置系統
若要整合程式代碼登入專案,您可以建立批次處理檔或腳本來執行命令行工具。 建置項目之後,請使用適當的設定執行 SignTool(如範例的步驟 3 所示)。
在建置程式中特別小心,以確保對 .pfx 和 .pvk 檔案的存取僅限於盡可能少的計算機和使用者。 最佳做法是,開發人員應該只使用測試憑證簽署程序代碼,直到他們準備好出貨為止。 同樣地,私鑰 (.pvk) 應該保留在安全的位置,例如安全或鎖定的房間,在密碼編譯裝置上最好是智慧卡。
另一層保護是使用 Microsoft Authenticode 簽署 Windows Installer (MSI) 套件本身來提供。 這有助於保護 MSI 套件免於竄改和意外損毀。 如需如何使用 Authenticode 簽署套件的詳細資訊,請參閱 MSI 建立工具的檔。
撤銷
如果私鑰的安全性遭到入侵,或某些安全性相關事件使程式代碼簽署憑證無效,開發人員必須撤銷憑證。 這樣做會削弱開發人員的完整性和簽署程序代碼的有效性。 CA 也可以發出具有特定時間的撤銷;在撤銷時間之前以時間戳簽署的程式代碼仍會被視為有效,但具有後續時間戳的程式代碼將會無效。 證書吊銷會影響使用撤銷憑證簽署的任何應用程式中的程序代碼。
程式代碼簽署驅動程式
驅動程式可以且應該是 Authenticode 簽署。 內核模式驅動程式有其他需求:64 位版本的 Windows Vista 和 Windows 7 會防止安裝所有未簽署的核心模式驅動程式,而且當使用者嘗試安裝未簽署的驅動程式時,所有版本的 Windows 都會顯示警告提示。 此外,系統管理員可以設定組策略,以防止未簽署的驅動程式安裝在 Microsoft windows Server 2003、Windows XP Professional x64 Edition 和 32 位版本的 Windows Vista 和 Windows 7 上。
許多類型的驅動程式都可以使用Microsoft信任的簽章進行簽署,做為 Windows 硬體質量實驗室的 Windows 認證計劃(WHQL)或未分類的簽章計劃(先前稱為驅動程式可靠性簽章)的一部分,這可讓系統完全信任這些驅動程式,即使沒有系統管理認證也安裝它們。
驅動程式至少應該以 Authenticode 簽署,因為未簽署或自我簽署的驅動程式(也就是使用測試憑證簽署)無法在許多 Windows 平臺上安裝。 如需簽署驅動程式和程式代碼和相關功能的詳細資訊,請參閱 Windows 硬體開發人員中心上的 Windows 驅動程式簽署需求。
摘要
使用 Microsoft Authenticode 是一個直接的程式。 取得 CER 並建立私鑰之後,使用Microsoft所提供的工具就很簡單了。 然後,您可以在 Windows Vista 和 Windows 7 中啟用重要的功能,例如家長監護,並讓客戶知道您的產品直接來自其合法擁有者。
其他相關資訊
如需與簽署程式代碼相關的工具和程式的詳細資訊,請參閱下列連結: