MSIX 自簽署程式碼簽署憑證:實用指南
2026-06-02
Tags: Windows · Microsoft Store · MSIX · 商店踩坑
在上一篇文章中,我們走過了完整的提交前 MSIX 測試流程。其中一個反覆出現的步驟就是處理自簽署憑證——將它們安裝到受信任人(Trusted People)存放區、使用正確的憑證進行封裝等等。但那篇文章忽略了一個重要的問題:實際上要如何建立一個?
本指南涵蓋了 MSIX 封裝所需的自簽署程式碼簽署憑證的所有知識:建立、匯出、在 Visual Studio 中使用,以及在團隊中管理。
為什麼 MSIX 需要簽署
MSIX 套件必須經過數位簽署後才能安裝。這是強制性的——即使是 sideloading 和本機測試,作業系統也要求每個 .msix 檔案都必須有有效的簽章。
對於市集發行,Microsoft 會在認證後用自己的憑證為您的套件簽署。但對於本機測試和 sideloading,您需要自己的憑證。這時自簽署憑證就派上用場了:它們讓您無需購買商業程式碼簽署憑證,就能簽署用於開發和測試的套件。
簽署流程有兩個目的:
- 完整性:確保套件在簽署後未被竄改
- 身分識別:識別發行者(您)——憑證中的 CN (Common Name) 必須與
Package.appxmanifest中的<Publisher>值相符
使用 New-SelfSignedCertificate
Windows 內建了 New-SelfSignedCertificate PowerShell 指令程式,可用於產生測試用的憑證。以系統管理員身分開啟 PowerShell 並嘗試以下指令:
New-SelfSignedCertificate -Type Custom -Subject "CN=YourCompany" -KeyUsage DigitalSignature -TextExtension @("2.5.29.37={text}1.3.6.1.5.5.7.3.3", "2.5.29.19={text}") -CertStoreLocation "Cert:\CurrentUser\My"以下是每個參數的說明:
| 參數 | 功能 |
|---|---|
-Type Custom | 建立自訂憑證而非基本憑證 |
-Subject "CN=YourCompany" | 設定 Common Name — 這應與您應用程式在 Package.appxmanifest 中的 Publisher 相符 |
-KeyUsage DigitalSignature | 將憑證標記為數位簽章用途 |
-TextExtension @("2.5.29.37={text}1.3.6.1.5.5.7.3.3", "2.5.29.19={text}") | 擴展金鑰用法設定為 Code Signing (1.3.6.1.5.5.7.3.3),以及基本限制設定為 End Entity (2.5.29.19) — Windows 部署引擎對應用程式套件的必要要求 |
-CertStoreLocation "Cert:\CurrentUser\My" | 將憑證儲存於目前使用者的個人存放區 |
如果缺少這兩個 TextExtension 值,憑證可能無法被完整辨識——Basic Constraints OID 將其標記為 End Entity(而非 CA),Windows 部署引擎在驗證 MSIX 套件時會檢查此項。遺漏此項可能會導致某些 Windows 版本上出現部署錯誤或 WACK 警告。
注:在我自己的專案中,一直使用不帶基本約束的自簽署憑證,也沒有出現過問題。該約束是微軟推薦的最佳實踐,但並非開發和側載場景的硬性要求。
使用程式碼簽署 EKU 建立憑證
如果您已建立憑證但未包含 Code Signing EKU,仍然可以檢查它是否具有正確的屬性。開啟憑證(透過 certlm.msc)並檢查 Details → Enhanced Key Usage——您應該會看到 Code Signing 列在其中。
以下是一個實用的指令碼,用於建立憑證並將其準備好用於 MSIX:
# 建立自簽署程式碼簽署憑證(Code Signing EKU + Basic Constraints)
$cert = New-SelfSignedCertificate -Type Custom -Subject "CN=YourCompany" -KeyUsage DigitalSignature -TextExtension @("2.5.29.37={text}1.3.6.1.5.5.7.3.3", "2.5.29.19={text}") -CertStoreLocation "Cert:\CurrentUser\My"
# 顯示憑證詳細資料
$cert | Format-List Subject, Thumbprint, NotAfter
# 輸出指紋供快速參考
Write-Host "Certificate thumbprint: $($cert.Thumbprint)"將 "CN=YourCompany" 替換為您實際的發行者名稱。您可以在 Package.appxmanifest 的 Identity 元素中找到發行者名稱:
<Identity Name="YourApp" Publisher="CN=YourCompany" Version="1.0.0.0" />匯出 PFX 與 CER 的區別
建立憑證後,通常需要兩種檔案:
PFX (Personal Information Exchange)
包含私密金鑰 + 憑證。這是 Visual Studio 用來簽署套件的檔案。請像對待密碼一樣保護它——任何擁有 PFX 的人都可以假冒您簽署套件。
$password = ConvertTo-SecureString -String "YourPassword" -Force -AsPlainText
Export-PfxCertificate -Cert $cert -FilePath "codesign.pfx" -Password $passwordCER (Certificate file)
僅包含公開憑證(不含私密金鑰)。這是您分發給測試機器,讓它們能夠信任已簽署套件的檔案。
Export-Certificate -Cert $cert -FilePath "codesign.cer"快速參考
| 格式 | 是否包含私密金鑰? | 用途 |
|---|---|---|
.pfx | 是 | 簽署套件(Visual Studio、signtool) |
.cer | 否 | 安裝在測試機器上以建立信任 |
匯入憑證並檢查指紋
要在測試機器上安裝以自簽署憑證簽署的 MSIX 套件,必須讓系統信任該憑證。
安裝憑證
- 雙擊
.cer檔案 → 安裝憑證 - 選擇 本機電腦 → 下一步
- 選擇 將所有的憑證放入下列存放區 → 瀏覽 → 選擇 受信任人
- 完成精靈
或者透過 PowerShell:
Import-Certificate -FilePath "codesign.cer" -CertStoreLocation "Cert:\LocalMachine\TrustedPeople"尋找指紋
使用命令列簽署工具時,您需要指紋:
# 列出個人存放區中的所有程式碼簽署憑證
Get-ChildItem -Path "Cert:\CurrentUser\My" -CodeSigningCert | Format-Table Subject, Thumbprint, NotAfter指紋是一串 40 個字元的十六進位字串。請精確複製——您會需要在簽署命令中使用它。
在 Visual Studio 中使用憑證
取得 PFX 檔案後,您可以在 Visual Studio 的封裝精靈中使用它:
- 在專案上按右鍵 → 封裝與發行 → 建立應用程式套件
- 選擇 側載 → 在簽署方法中選擇 從檔案選取...
- 瀏覽到您的
.pfx檔案並輸入密碼 - 完成封裝精靈
憑證會儲存在封裝設定檔中,因此您不需要每次都重新選取。不過,如果憑證過期或您更換了新的憑證,就需要更新設定檔。
從憑證存放區使用憑證
如果您已將 PFX 匯入個人憑證存放區,也可以直接從中選取:
- 在簽署步驟中,展開下拉式選單(而非按一下 "從檔案選取...")
- 在清單中尋找您的憑證(由您指定的 CN 識別)
- 選取它並繼續
這種方式很方便,但請注意——Visual Studio 可能會快取特定的指紋,如果憑證更新(新的金鑰對),儲存的參考可能會失效。
憑證到期、更新與重新簽署
使用 New-SelfSignedCertificate 建立的自簽署憑證預設有效期為 1 年(某些版本預設為 3 年——請檢查 NotAfter 屬性)。
檢查清單
- [ ] 記錄憑證的到期日
- [ ] 到期前,建立新的憑證並重新簽署所有套件
- [ ] 將新的
.cer分發給測試機器 - [ ] 更新 Visual Studio 中的封裝設定檔
- [ ] 對於市集提交,使用新憑證產生一個新的測試套件
檢查到期日:
Get-ChildItem -Path "Cert:\CurrentUser\My" -CodeSigningCert | Format-Table Subject, NotAfter更新時,請使用相同的 CN 建立新的憑證,匯出新的 PFX/CER,然後重新簽署您的套件。指紋會改變,因此請確保所有參考都已更新。
團隊開發技巧
當多位開發人員需要使用相同的憑證簽署套件時:
- 將 PFX 儲存在安全、共享的位置——例如團隊儲存空間中受密碼保護的壓縮檔,或支援檔案附件功能的密碼管理工具
- 絕不要將 PFX 提交到版本控制——在
.gitignore中加入*.pfx - 將密碼記錄在團隊的密碼管理工具中,而非程式碼或文件中
- 每位開發人員將 PFX 匯入自己的個人憑證存放區,然後從 Visual Studio 中選取
- 如果需要為每位開發人員建立個別憑證(用於非發行版建置),請在所有憑證中使用相同的 CN
對於 CI/CD 管線,大多數建置代理程式支援透過安全環境變數或機密來匯入 PFX——請查閱您 CI 平台的說明文件以了解建議的做法。
本文是商店踩坑系列的補充閱讀文章。