共用方式為


遊戲開發人員的 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 檔案,您的公開和私鑰無法用於公開認證。

在此範例中,時間戳也會新增至簽章。 時間戳可防止簽章在憑證到期時變成無效。 簽署但缺少時間戳的程式代碼在憑證到期後將不會驗證。 因此,所有公開發行的程式代碼都應該有時間戳。

建立憑證並簽署程式

  1. 使用憑證建立工具建立測試憑證和私鑰(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
    
  2. 使用 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
    
  3. 使用 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 提供,而且是選擇性的測試。 生產簽署必須包含有效的時間戳授權單位,或簽章在憑證到期時無法驗證。

     

  4. 使用 SignTool 確認程式已簽署。

    下列命令行範例會指定 SignTool 應該嘗試使用所有可用方法來驗證BasicHLSL.exe上的簽章,同時提供詳細資訊輸出:

    signtool.exe verify /a /v BasicHLSL.exe
    

    在此範例中,SignTool 應該指出憑證已附加,同時指出憑證不受信任,因為它不是由 CA 發行。

  5. 信任測試憑證。

    針對測試憑證,您需要信任憑證。 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 中啟用重要的功能,例如家長監護,並讓客戶知道您的產品直接來自其合法擁有者。

其他相關資訊

如需與簽署程式代碼相關的工具和程式的詳細資訊,請參閱下列連結: