如何使用 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 等下層作系統上簽署應用程式套件。
您需要知道的事項
技術
先決條件
SignTool,這是 Windows SDK 的一部分
有效的程式代碼簽署憑證,例如,使用 MakeCert.exe 和 Pvk2Pfx.exe 工具建立的個人資訊交換 (.pfx) 檔案
如需建立有效程式代碼簽署憑證的詳細資訊,請參閱 如何建立應用程式套件簽署憑證。
例如,使用 應用程式封裝器 (MakeAppx.exe) 工具建立的已封裝 Windows 應用程式.appx檔案
其他考慮
您用來簽署應用程式套件的憑證必須符合下列準則:
憑證的主體名稱必須符合儲存在封裝內 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 演算法。 下表列出目前可用演算法的映射:
Hash 方法 值 | 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 密碼 參數。 您也可以使用 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)。 在此情況下,您可以在事件記錄檔中找到更具體的錯誤資訊:
搜尋事件記錄檔
- 執行 Eventvwr.msc。
- 開啟事件記錄檔:事件查看器(本機)> 應用程式和服務記錄 > Microsoft > Windows > AppxPackagingOM > Microsoft-Windows-AppxPackaging/Operational
- 尋找最新的錯誤事件。
內部錯誤通常對應至下列其中一項:
事件標識碼 | 範例事件字串 | 建議 |
---|---|---|
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 建立應用程式套件。 |
安全性考慮
簽署封裝之後,您用來簽署封裝的憑證仍必須由部署封裝的計算機所信任。 藉由將憑證新增至 本機計算機證書存儲,您就會影響計算機上的所有用戶的憑證信任。 建議您將想要用於測試應用程式套件的程式碼簽署憑證安裝到受信任的使用者證書存儲區,並在不再需要時立即移除這些憑證。 如果您建立自己的測試憑證來簽署應用程式套件,我們也建議您限制與測試憑證相關聯的許可權。 如需建立簽署應用程式套件測試憑證的詳細資訊,請參閱 如何建立應用程式套件簽署憑證。