如何使用 SignTool 簽署應用程式套件

注意

如需簽署 Windows 應用程式套件,請參閱 使用 SignTool 簽署應用程式套件。

瞭解如何使用 SignTool 簽署 Windows 應用程式套件,以便部署這些套件。 SignTool 是 Windows 軟體開發工具套件 (SDK) 的一部分。

所有 Windows 應用程式套件都必須經過數字簽署,才能進行部署。 雖然 Microsoft Visual Studio 2012 和更新版本可以在建立期間簽署應用程式套件,但您從 Windows SDK 使用 應用程式封裝工具 MakeAppx.exe 建立的套件不會簽署。

注意

您只能使用 SignTool 在 Windows 8 和更新版本或 Windows Server 2012 和更新版本上簽署 Windows 應用程式套件。 您無法使用 SignTool 在下層作業系統上簽署應用程式套件,例如 Windows 7 或 Windows Server 2008 R2。

您需要知道的事項

技術

必要條件

其他考慮

您用來簽署應用程式套件的憑證必須符合下列準則:

  • 憑證的主體名稱必須符合儲存在封裝內之AppxManifest.xml檔案的 Identity 元素中包含的 Publisher 屬性。 發行者名稱是已封裝 Windows 應用程式的身分識別的一部分,因此您必須讓憑證的主體名稱符合應用程式的發行者名稱。 這可讓已簽署套件的身分識別針對數位簽名進行檢查。 如需使用 SignTool 簽署應用程式套件時可能發生之簽署錯誤的相關信息,請參閱如何建立應用程式套件簽署憑證一節。

  • 憑證必須有效,才能進行程式代碼簽署。 這表示這兩個專案都必須成立:

    • 憑證的 [擴充密鑰使用方式](EKU) 字段必須未設定,或包含程式代碼簽署的 EKU 值(1.3.6.1.5.5.7.3.3)。
    • 憑證的 [金鑰使用方式](KU) 欄位必須未設定,或包含數位簽名的使用位(0x80)。
  • 憑證包含私鑰。

  • 憑證有效。 它是使用中、尚未過期且尚未撤銷。

指示

步驟 1:判斷要使用的哈希演算法

當您簽署應用程式套件時,必須使用您在建立應用程式套件時所使用的相同哈希演算法。 如果您使用預設設定來建立應用程式套件,使用的哈希演算法是SHA256。

如果您使用應用程式封裝器搭配特定哈希演算法來建立應用程式套件,請使用相同的演算法簽署套件。 若要判斷用來簽署套件的哈希演算法,您可以擷取套件內容並檢查AppxBlockMap.xml檔案。 BlockMap 元素的 HashMethod 屬性表示建立應用程式套件時所使用的哈希演算法。 例如:

<BlockMap xmlns="http://schemas.microsoft.com/appx/2010/blockmap" 
HashMethod="https://www.w3.org/2001/04/xmlenc#sha256">

上述 BlockMap 元素表示已使用 SHA256 演算法。 下表列出目前可用演演算法的對應:

HashMethod hashAlgorithm 要使用的
https://www.w3.org/2001/04/xmlenc#sha256 SHA256 (.appx預設值)
https://www.w3.org/2001/04/xmldsig-more#sha384 SHA384
https://www.w3.org/2001/04/xmlenc#sha512 SHA512

步驟 2:執行 SignTool.exe 以簽署套件

使用 .pfx 檔案的簽署憑證簽署套件

  • SignTool sign /fd hashAlgorithm /a /f signingCert.pfx /p password filepath.appx
    

如果未指定 ,SignTool 會將 /fd hashAlgorithm 參數預設為 SHA1,而 SHA1 不適用於簽署應用程式套件。 因此,您必須在簽署應用程式套件時指定此參數。 若要簽署以預設 SHA256 哈希建立的應用程式套件,請將 /fd hashAlgorithm 參數指定為 SHA256:

SignTool sign /fd SHA256 /a /f signingCert.pfx /p password filepath.appx

如果您使用未受密碼保護的 .pfx 檔案,則可以省略 /p password 參數。 您也可以使用 SignTool 支援的其他憑證選取選項來簽署應用程式套件。 如需這些選項的詳細資訊,請參閱 SignTool

注意

您無法在 已簽署的應用程式套件上使用 SignTool 時間戳作業;不支援此作業。

如果您想要為應用程式套件加上時間戳,則必須在簽署作業期間執行。 例如:

SignTool sign /fd hashAlgorithm /a /f signingCert.pfx /p password /tr timestampServerUrl 
filepath.appx

讓 /tr timestampServerUrl 參數等於 RFC 3161 時間戳伺服器的 URL。

備註

本節討論針對應用程式套件的簽署錯誤進行疑難解答。

針對應用程式套件簽署錯誤進行疑難解答

除了 SignTool 可以傳回的簽署錯誤之外,SignTool 也可以傳回應用程式套件簽署特有的錯誤。 這些錯誤通常會顯示為內部錯誤:

SignTool Error: An unexpected internal error has occurred.
Error information: "Error: SignerSign() failed." (-2147024885 / 0x8007000B) 

如果錯誤碼以 0x8008 開頭,例如 0x80080206 APPX_E_CORRUPT_CONTENT),表示簽署的封裝無效。 在此情況下,您必須先重建套件,才能簽署套件。 如需0x8008* 錯誤的完整清單,請參閱 COM 錯誤碼 (安全性和設定)

更常見的是,錯誤是0x8007000b(ERROR_BAD_FORMAT)。 在此情況下,您可以在事件記錄檔中找到更具體的錯誤資訊:

搜尋事件記錄檔

  1. 執行 Eventvwr.msc。
  2. 開啟事件記錄檔:事件檢視器 (本機) > 應用程式和服務記錄 > Microsoft Windows > AppxPackagingOM > Microsoft-Windows-AppxPackaging>/Operational
  3. 尋找最新的錯誤事件。

內部錯誤通常對應至下列其中一項:

事件識別碼 範例事件字串 建議
150 錯誤0x8007000B:應用程式指令清單發行者名稱 (CN=Contoso) 必須符合簽署憑證的主體名稱(CN=Contoso,C=US)。 應用程式指令清單發行者名稱必須完全符合簽署的主體名稱。 注意: 這些名稱會以引號指定,而且區分大小寫和空格符。
您可以更新AppxManifest.xml 檔案中 Identity 元素定義的 Publisher 屬性字串,以符合預定簽署憑證的主體名稱。 或者,選取具有符合應用程式指令清單發行者名稱之主體名稱的不同簽署憑證。 指令清單發行者名稱和憑證主體名稱都會列在事件訊息中。
151 錯誤0x8007000B:指定的簽章哈希方法 (SHA512) 必須符合應用程式套件區塊對應中使用的哈希方法 (SHA256)。 /fd 參數中指定的 hashAlgorithm 不正確(請參閱步驟 1:判斷要使用的哈希演算法)。 使用符合應用程式套件區塊對應的hashAlgorithm重新執行 SignTool
152 錯誤0x8007000B:應用程式套件內容必須根據其區塊對應進行驗證。 應用程式套件已損毀,且必須重建以產生新的區塊對應。 如需建立應用程式套件的詳細資訊,請參閱使用 應用程式封裝器 建立應用程式套件或使用 Visual Studio 2012 建立應用程式套件。

安全性考量

簽署封裝之後,您用來簽署封裝的憑證仍必須由部署封裝的計算機所信任。 將憑證新增至 本機計算機證書存儲,即可影響計算機上的所有用戶的憑證信任。 建議您安裝任何程式代碼簽署憑證,以將應用程式套件測試至受信任的 人員 證書存儲,並在不再需要時立即移除這些憑證。 如果您建立自己的測試憑證來簽署應用程式套件,我們也建議您限制與測試憑證相關聯的許可權。 如需建立簽署應用程式套件之測試憑證的詳細資訊,請參閱 如何建立應用程式套件簽署憑證

範例

建立應用程式套件範例

概念

程式代碼簽署最佳做法

在 Visual Studio 2012 中簽署套件

SignTool

應用程式封裝器 (MakeAppx.exe)

如何建立應用程式套件簽署憑證