如何使用 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工具建立的個人資訊Exchange (.pfx) 檔案
如需建立有效程式碼簽署憑證的詳細資訊,請參閱 如何建立應用程式套件簽署憑證。
已封裝Windows應用程式,例如,使用應用程式封裝器 (MakeAppx.exe) 工具建立的 .appx 檔案
其他考量
您用來簽署應用程式套件的憑證必須符合下列準則:
憑證的主體名稱必須符合儲存在封裝內AppxManifest.xml檔案之Identity元素中的Publisher屬性。 發行者名稱是已封裝Windows應用程式的身分識別的一部分,因此您必須讓憑證的主體名稱符合應用程式的發行者名稱。 這可讓已簽署套件的身分識別根據數位簽章進行檢查。 如需使用 SignTool簽署應用程式套件時可能發生的簽署錯誤相關資訊,請參閱 如何建立應用程式套件簽署憑證的一節。
憑證必須有效才能簽署程式碼。 這表示這兩個專案都必須成立:
- 憑證的 [擴充金鑰使用方式 (EKU) ] 欄位必須未設定,或包含程式碼簽署的 EKU 值, (1.3.6.1.5.5.7.3.3) 。
- 憑證的 [金鑰使用方式 (KU) ] 欄位必須未設定或包含數位簽章 (0x80) 的使用位。
憑證包含私密金鑰。
憑證有效。 它處於作用中狀態、尚未過期,且尚未撤銷。
Instructions
步驟 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) 錯誤。 在此情況下,您可以在事件記錄檔中找到更明確的錯誤資訊:
搜尋事件記錄檔
- 執行 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 建立應用程式套件。 |
安全性考量
簽署封裝之後,您用來簽署封裝的憑證仍必須由要部署封裝的電腦信任。 藉由將認證新增至本機電腦憑證存放區 (英文),您會對電腦上所有使用者的憑證信任造成影響。 建議您安裝任何您想要測試應用程式套件的程式碼簽署憑證到受信任的人證書存儲,並在不再需要時立即移除這些憑證。 如果您建立自己的測試憑證來簽署應用程式套件,我們也建議您限制與測試憑證相關聯的許可權。 如需建立簽署應用程式套件測試憑證的詳細資訊,請參閱 如何建立應用程式套件簽署憑證。