Skip to content

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 並嘗試以下指令:

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)並檢查 DetailsEnhanced Key Usage——您應該會看到 Code Signing 列在其中。

以下是一個實用的指令碼,用於建立憑證並將其準備好用於 MSIX:

powershell
# 建立自簽署程式碼簽署憑證(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.appxmanifestIdentity 元素中找到發行者名稱:

xml
<Identity Name="YourApp" Publisher="CN=YourCompany" Version="1.0.0.0" />

匯出 PFX 與 CER 的區別

建立憑證後,通常需要兩種檔案:

PFX (Personal Information Exchange)

包含私密金鑰 + 憑證。這是 Visual Studio 用來簽署套件的檔案。請像對待密碼一樣保護它——任何擁有 PFX 的人都可以假冒您簽署套件。

powershell
$password = ConvertTo-SecureString -String "YourPassword" -Force -AsPlainText
Export-PfxCertificate -Cert $cert -FilePath "codesign.pfx" -Password $password

CER (Certificate file)

僅包含公開憑證(不含私密金鑰)。這是您分發給測試機器,讓它們能夠信任已簽署套件的檔案。

powershell
Export-Certificate -Cert $cert -FilePath "codesign.cer"

快速參考

格式是否包含私密金鑰?用途
.pfx簽署套件(Visual Studio、signtool)
.cer安裝在測試機器上以建立信任

匯入憑證並檢查指紋

要在測試機器上安裝以自簽署憑證簽署的 MSIX 套件,必須讓系統信任該憑證。

安裝憑證

  1. 雙擊 .cer 檔案 → 安裝憑證
  2. 選擇 本機電腦下一步
  3. 選擇 將所有的憑證放入下列存放區瀏覽 → 選擇 受信任人
  4. 完成精靈

或者透過 PowerShell:

powershell
Import-Certificate -FilePath "codesign.cer" -CertStoreLocation "Cert:\LocalMachine\TrustedPeople"

尋找指紋

使用命令列簽署工具時,您需要指紋:

powershell
# 列出個人存放區中的所有程式碼簽署憑證
Get-ChildItem -Path "Cert:\CurrentUser\My" -CodeSigningCert | Format-Table Subject, Thumbprint, NotAfter

指紋是一串 40 個字元的十六進位字串。請精確複製——您會需要在簽署命令中使用它。

在 Visual Studio 中使用憑證

取得 PFX 檔案後,您可以在 Visual Studio 的封裝精靈中使用它:

  1. 在專案上按右鍵 → 封裝與發行建立應用程式套件
  2. 選擇 側載 → 在簽署方法中選擇 從檔案選取...
  3. 瀏覽到您的 .pfx 檔案並輸入密碼
  4. 完成封裝精靈

憑證會儲存在封裝設定檔中,因此您不需要每次都重新選取。不過,如果憑證過期或您更換了新的憑證,就需要更新設定檔。

從憑證存放區使用憑證

如果您已將 PFX 匯入個人憑證存放區,也可以直接從中選取:

  1. 在簽署步驟中,展開下拉式選單(而非按一下 "從檔案選取...")
  2. 在清單中尋找您的憑證(由您指定的 CN 識別)
  3. 選取它並繼續

這種方式很方便,但請注意——Visual Studio 可能會快取特定的指紋,如果憑證更新(新的金鑰對),儲存的參考可能會失效。

憑證到期、更新與重新簽署

使用 New-SelfSignedCertificate 建立的自簽署憑證預設有效期為 1 年(某些版本預設為 3 年——請檢查 NotAfter 屬性)。

檢查清單

  • [ ] 記錄憑證的到期日
  • [ ] 到期前,建立新的憑證並重新簽署所有套件
  • [ ] 將新的 .cer 分發給測試機器
  • [ ] 更新 Visual Studio 中的封裝設定檔
  • [ ] 對於市集提交,使用新憑證產生一個新的測試套件

檢查到期日:

powershell
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 平台的說明文件以了解建議的做法。


本文是商店踩坑系列的補充閱讀文章。