<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Deployment on kenji.blog</title><link>http://kenji.blog/zh-tw/tags/deployment/</link><description>Recent content in Deployment on kenji.blog</description><generator>Hugo -- gohugo.io</generator><language>zh-tw</language><copyright>kenjinote</copyright><lastBuildDate>Sat, 12 Sep 2026 22:00:00 +0900</lastBuildDate><atom:link href="http://kenji.blog/zh-tw/tags/deployment/index.xml" rel="self" type="application/rss+xml"/><item><title>Windows 11 專用 MSIX 套件製作方法與自簽章憑證的陷阱</title><link>http://kenji.blog/zh-tw/p/windows-11-msix-packaging-guide/</link><pubDate>Sat, 12 Sep 2026 22:00:00 +0900</pubDate><guid>http://kenji.blog/zh-tw/p/windows-11-msix-packaging-guide/</guid><description>&lt;img src="http://kenji.blog/p/windows-11-msix-packaging-guide/img/eyecatch.jpg" alt="Featured image of post Windows 11 專用 MSIX 套件製作方法與自簽章憑證的陷阱" />&lt;p>在 Windows 11 的時代，做為應用程式的散佈格式，「MSIX」正逐漸成為標準的選擇。傳統的 MSI 或 EXE 等安裝程式存在許多問題，而 MSIX 則被寄予厚望，成為解決這些問題的次世代套件技術。然而，當開發者實際製作 MSIX 套件，並試圖在組織內部或測試環境中進行側載（Sideloading）時，經常會陷入「自簽章憑證的陷阱」。&lt;/p>
&lt;p>本文將從 MSIX 的技術細節、使用 Visual Studio 或命令列工具製作套件的方法，到許多開發者所面臨的自簽章憑證錯誤原因與解決方案，進行非常詳細的解說。我們希望能成為 Windows 應用程式開發者、基礎架構管理員以及套件負責人的必讀指南。&lt;/p>
&lt;h2 id="1-什麼是-msix與傳統-msiexe-的比較">1. 什麼是 MSIX？與傳統 MSI/EXE 的比較
&lt;/h2>&lt;p>MSIX 是由 Microsoft 所提供、專為 Windows 設計的最新應用程式套件格式。它整合了以往存在的 MSI (Microsoft Installer)、以 .exe 為基礎的自訂安裝程式、App-V (Application Virtualization)，以及自 Windows 8 起導入的 AppX (通用 Windows 平台應用程式的套件) 中所有優良的功能與概念，並針對現代的安全性和部署需求進一步進化。&lt;/p>
&lt;h3 id="傳統安裝程式-msiexe-的問題">傳統安裝程式 (MSI/EXE) 的問題
&lt;/h3>&lt;p>長年做為 Windows 標準安裝格式的 MSI 與 EXE，存在以下根本性的問題：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Win Rot (Windows 劣化) 現象&lt;/strong>：隨著應用程式的重複安裝與解除安裝，登錄檔中會殘留不必要的機碼，且系統資料夾 (如 &lt;code>C:\Windows\System32&lt;/code>) 中也會遺留 DLL 檔案。這將導致作業系統本身的運作逐漸變慢並產生不穩定的現象。&lt;/li>
&lt;li>&lt;strong>DLL 地獄 (DLL Hell)&lt;/strong>：當多個應用程式試圖將同名 (但版本不同) 的 DLL 安裝到共用系統目錄時，後安裝的應用程式會覆寫現有的 DLL，導致先安裝的應用程式無法正常運作。&lt;/li>
&lt;li>&lt;strong>自訂動作帶來的不穩定性&lt;/strong>：在 MSI 套件中，被稱為「自訂動作」的任意指令碼或程式碼可以在安裝與解除安裝期間以系統權限執行。這會帶來安裝程式中途當機或導致系統發生預期外設定變更的風險。&lt;/li>
&lt;/ol>
&lt;h3 id="msix-的容器化架構解決方案">MSIX 的容器化架構解決方案
&lt;/h3>&lt;p>MSIX 透過將應用程式放入輕量級的「容器」內執行，來解決這些問題。此容器化方法具有以下巨大的優勢：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>乾淨的解除安裝&lt;/strong>：透過 MSIX 安裝的應用程式，其對檔案系統與登錄檔的寫入都會被虛擬化 (VFS: 虛擬檔案系統, VReg: 虛擬登錄檔)。因此，解除安裝時會將此虛擬化的容器整個刪除，不會在系統上留下任何垃圾 (殘骸)。完全防止 Win Rot 現象。&lt;/li>
&lt;li>&lt;strong>隔離與安全性 (Isolation)&lt;/strong>：各個應用程式都在自己的環境內執行，不會直接破壞其他應用程式的 DLL 或資源。從此擺脫 DLL 地獄。&lt;/li>
&lt;li>&lt;strong>網路頻寬的最佳化&lt;/strong>：MSIX 的更新機制非常優秀，支援區塊層級的差異更新 (Differential Update)。由於僅下載二進位資料中被變更的少數區塊，即使是大型應用程式的更新，也能將對網路的負擔降至最低。&lt;/li>
&lt;li>&lt;strong>確實的安裝狀態&lt;/strong>：套件內含資訊清單檔案 (&lt;code>AppxManifest.xml&lt;/code>)，安裝的交易會由作業系統層級嚴密管理。若發生失敗，將完全復原至原始狀態。&lt;/li>
&lt;/ul>
&lt;h2 id="2-msix-套件製作的全貌與工具鏈">2. MSIX 套件製作的全貌與工具鏈
&lt;/h2>&lt;p>製作 MSIX 套件大致可分為兩種方法。一種是使用 Visual Studio 的整合開發環境 (IDE)，另一種則是善用 Windows SDK 隨附的命令列工具 (&lt;code>MakeAppx.exe&lt;/code> 與 &lt;code>SignTool.exe&lt;/code>)。&lt;/p>
&lt;p>以下的 Mermaid 區塊圖展示了從原始程式碼檔案到最終產生已簽章 MSIX 套件的程序。&lt;/p>
&lt;pre class="mermaid">
flowchart TD
A[&amp;#34;原始程式碼檔案 (EXE, DLL, 資產等)&amp;#34;] --&amp;gt; B[&amp;#34;AppxManifest.xml (資訊清單定義)&amp;#34;]
B --&amp;gt; C[&amp;#34;MakeAppx.exe (MSIX 套件建立工具)&amp;#34;]
C --&amp;gt; D[&amp;#34;未簽章的 MSIX 套件 (.msix)&amp;#34;]
E[&amp;#34;數位憑證 (.pfx)&amp;#34;] --&amp;gt; F[&amp;#34;SignTool.exe (數位簽章工具)&amp;#34;]
D --&amp;gt; F
F --&amp;gt; G[&amp;#34;已簽章的 MSIX 套件 (準備好部署)&amp;#34;]
style A fill:#f9f9f9,stroke:#333
style B fill:#e6f7ff,stroke:#333
style D fill:#ffcccb,stroke:#333
style G fill:#d4edda,stroke:#333
&lt;/pre>
&lt;p>從這個程序可以看出，單純收集檔案並封裝（封裝化）是不夠的，必須要有「數位簽章」的步驟。基於安全考量，Windows 11 完全不允許安裝未簽章的 MSIX 套件。&lt;/p>
&lt;h2 id="3-方法-a使用-visual-studio-製作-msix">3. 方法 A：使用 Visual Studio 製作 MSIX
&lt;/h2>&lt;p>最簡單且最常見的方法是使用 Visual Studio 的「Windows 應用程式封裝專案 (Windows Application Packaging Project - WAP)」。只要使用此專案範本，不論是 WPF、Windows Forms、WinUI 3，甚至是 C++ 的舊版 Win32 應用程式，都能輕鬆轉換成 MSIX。&lt;/p>
&lt;h3 id="逐步指南">逐步指南
&lt;/h3>&lt;ol>
&lt;li>&lt;strong>新增 WAP 專案&lt;/strong>：在現有的 Visual Studio 方案按右鍵，從「加入新的專案」中選擇「Windows 應用程式封裝專案」。&lt;/li>
&lt;li>&lt;strong>選擇目標平台&lt;/strong>：指定應用程式支援的 Windows 10/11 的最低版本與目標版本。&lt;/li>
&lt;li>&lt;strong>參考應用程式&lt;/strong>：以滑鼠右鍵按一下封裝專案的「應用程式」節點，從「加入參考」中選擇想要封裝的主要專案 (例如 WPF 專案)。&lt;/li>
&lt;li>&lt;strong>設定資訊清單&lt;/strong>：連按兩下 &lt;code>Package.appxmanifest&lt;/code> 檔案，開啟視覺化設計工具。在這裡設定應用程式的顯示名稱、說明、標誌圖片，以及最重要的「套件名稱 (Identity Name)」與「發行者 (Publisher)」。&lt;/li>
&lt;li>&lt;strong>建立套件&lt;/strong>：在專案上按一下滑鼠右鍵，選擇「發佈」-&amp;gt;「建立應用程式套件」。選擇「側載」，並選擇架構 (x64, ARM64 等)，Visual Studio 就會自動包辦編譯、透過 &lt;code>MakeAppx&lt;/code> 進行封裝，以及自簽章憑證的產生與簽章。&lt;/li>
&lt;/ol>
&lt;p>雖然過程非常順暢，但如果在此處使用了 Visual Studio 自動產生的自簽章憑證 (Test Certificate)，將會陷入後述的「陷阱」中。&lt;/p>
&lt;h2 id="4-方法-b使用命令列-makeappxexe-製作">4. 方法 B：使用命令列 (MakeAppx.exe) 製作
&lt;/h2>&lt;p>在 CI/CD 管線的自動化，或是手動將現有安裝程式的檔案群重新封裝時，就需要命令列工具。只要安裝了 Windows SDK 的環境，就能從開發人員命令提示字元存取以下工具。&lt;/p>
&lt;h3 id="1-準備資訊清單檔案">1. 準備資訊清單檔案
&lt;/h3>&lt;p>在套件的根目錄中，建立一個寫有最低限度資訊的 &lt;code>AppxManifest.xml&lt;/code>。&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;span class="lnt">28
&lt;/span>&lt;span class="lnt">29
&lt;/span>&lt;span class="lnt">30
&lt;/span>&lt;span class="lnt">31
&lt;/span>&lt;span class="lnt">32
&lt;/span>&lt;span class="lnt">33
&lt;/span>&lt;span class="lnt">34
&lt;/span>&lt;span class="lnt">35
&lt;/span>&lt;span class="lnt">36
&lt;/span>&lt;span class="lnt">37
&lt;/span>&lt;span class="lnt">38
&lt;/span>&lt;span class="lnt">39
&lt;/span>&lt;span class="lnt">40
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-xml" data-lang="xml">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;utf-8&amp;#34;?&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;Package&lt;/span> &lt;span class="na">xmlns=&lt;/span>&lt;span class="s">&amp;#34;http://schemas.microsoft.com/appx/manifest/foundation/windows10&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">xmlns:uap=&lt;/span>&lt;span class="s">&amp;#34;http://schemas.microsoft.com/appx/manifest/uap/windows10&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">xmlns:rescap=&lt;/span>&lt;span class="s">&amp;#34;http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities&amp;#34;&lt;/span>&lt;span class="nt">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;Identity&lt;/span> &lt;span class="na">Name=&lt;/span>&lt;span class="s">&amp;#34;MyCompany.AwesomeApp&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">Publisher=&lt;/span>&lt;span class="s">&amp;#34;CN=MyCompany Self-Signed, O=MyCompany&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">Version=&lt;/span>&lt;span class="s">&amp;#34;1.0.0.0&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">ProcessorArchitecture=&lt;/span>&lt;span class="s">&amp;#34;x64&amp;#34;&lt;/span> &lt;span class="nt">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;Properties&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;DisplayName&amp;gt;&lt;/span>Awesome App&lt;span class="nt">&amp;lt;/DisplayName&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;PublisherDisplayName&amp;gt;&lt;/span>My Company&lt;span class="nt">&amp;lt;/PublisherDisplayName&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;Logo&amp;gt;&lt;/span>Assets\StoreLogo.png&lt;span class="nt">&amp;lt;/Logo&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/Properties&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;Resources&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;Resource&lt;/span> &lt;span class="na">Language=&lt;/span>&lt;span class="s">&amp;#34;en-us&amp;#34;&lt;/span> &lt;span class="nt">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;Resource&lt;/span> &lt;span class="na">Language=&lt;/span>&lt;span class="s">&amp;#34;ja-jp&amp;#34;&lt;/span> &lt;span class="nt">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/Resources&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;Dependencies&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;TargetDeviceFamily&lt;/span> &lt;span class="na">Name=&lt;/span>&lt;span class="s">&amp;#34;Windows.Desktop&amp;#34;&lt;/span> &lt;span class="na">MinVersion=&lt;/span>&lt;span class="s">&amp;#34;10.0.17763.0&amp;#34;&lt;/span> &lt;span class="na">MaxVersionTested=&lt;/span>&lt;span class="s">&amp;#34;10.0.22000.0&amp;#34;&lt;/span> &lt;span class="nt">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/Dependencies&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;Capabilities&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;rescap:Capability&lt;/span> &lt;span class="na">Name=&lt;/span>&lt;span class="s">&amp;#34;runFullTrust&amp;#34;&lt;/span> &lt;span class="nt">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/Capabilities&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;Applications&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;Application&lt;/span> &lt;span class="na">Id=&lt;/span>&lt;span class="s">&amp;#34;AwesomeApp&amp;#34;&lt;/span> &lt;span class="na">Executable=&lt;/span>&lt;span class="s">&amp;#34;AwesomeApp.exe&amp;#34;&lt;/span> &lt;span class="na">EntryPoint=&lt;/span>&lt;span class="s">&amp;#34;Windows.FullTrustApplication&amp;#34;&lt;/span>&lt;span class="nt">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;uap:VisualElements&lt;/span> &lt;span class="na">DisplayName=&lt;/span>&lt;span class="s">&amp;#34;Awesome App&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">Description=&lt;/span>&lt;span class="s">&amp;#34;The best app ever.&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">BackgroundColor=&lt;/span>&lt;span class="s">&amp;#34;transparent&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">Square150x150Logo=&lt;/span>&lt;span class="s">&amp;#34;Assets\Square150x150Logo.png&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">Square44x44Logo=&lt;/span>&lt;span class="s">&amp;#34;Assets\Square44x44Logo.png&amp;#34;&lt;/span>&lt;span class="nt">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/uap:VisualElements&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/Application&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/Applications&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;/Package&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>這裡最重要的一點是，&lt;code>&amp;lt;Identity Publisher=&amp;quot;...&amp;quot; /&amp;gt;&lt;/code> 的值必須與稍後用於簽章的憑證的 Subject 完全一致。&lt;/p>
&lt;h3 id="2-透過-makeappx-進行封裝">2. 透過 MakeAppx 進行封裝
&lt;/h3>&lt;p>在命令提示字元中執行以下命令，將目錄封裝成 MSIX 檔案。&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cmd" data-lang="cmd">&lt;span class="line">&lt;span class="cl">MakeAppx.exe pack /d &lt;span class="s2">&amp;#34;C:\Path\To\AppFolder&amp;#34;&lt;/span> /p &lt;span class="s2">&amp;#34;C:\Path\To\Output\AwesomeApp_1.0.0.0_x64.msix&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>這樣未簽章的 MSIX 檔案就完成了，但在此狀態下無法安裝到 Windows 上。&lt;/p>
&lt;h2 id="5-數位簽章與密碼學的數學背景">5. 數位簽章與密碼學的數學背景
&lt;/h2>&lt;p>為了深入理解為何 MSIX 套件需要簽章，我們必須了解數位簽章背後的密碼學機制。數位簽章保證了套件「確實是由指定的發行者所建立 (認證)」以及「建立後到目前為止未被第三方竄改 (完整性)」。&lt;/p>
&lt;p>MSIX 的簽章通常結合了 RSA 加密與 SHA-256 (Secure Hash Algorithm 256-bit)。&lt;/p>
&lt;h3 id="套用雜湊函數">套用雜湊函數
&lt;/h3>&lt;p>首先，將整個 MSIX 套件的二進位檔 (內容物) 視為訊息 $M$。簽章工具 (SignTool.exe) 會對此訊息 $M$ 套用密碼編譯雜湊函數 SHA-256，計算出固定長度 (256 位元) 的雜湊值 $H(M)$。&lt;/p>
&lt;h3 id="產生簽章-發行者">產生簽章 (發行者)
&lt;/h3>&lt;p>接著，發行者會使用自身的「私鑰 (Private Key)」$d$ 將雜湊值加密，產生數位簽章 $\sigma$。在 RSA 演算法的脈絡下，這可表示為如下的模組指數運算：&lt;/p>
$$ \sigma \equiv (H(M))^d \pmod n $$&lt;p>這裡的 $n$ 是 RSA 模數 (兩個巨大質數的乘積)。包含此簽章 $\sigma$ 與發行者「公鑰 (Public Key)」$e$ 的憑證 (X.509 格式)，將做為 MSIX 套件的一部分 (&lt;code>AppxSignature.p7x&lt;/code>) 被嵌入其中。&lt;/p>
&lt;h3 id="驗證簽章-windows-os">驗證簽章 (Windows OS)
&lt;/h3>&lt;p>當使用者嘗試安裝 MSIX 時，Windows OS 會從套件內的憑證中取出公鑰 $e$，並執行以下計算以還原雜湊值 $H'(M)$：&lt;/p>
$$ H'(M) \equiv \sigma^e \pmod n $$&lt;p>同時，OS 會自行對下載的整個 MSIX 套件 $M$ 重新計算雜湊值 $H(M)$。
最後，驗證還原的雜湊值與重新計算的雜湊值是否相等 ($H(M) = H'(M)$)。若此等式成立，就等於在數學上證明了「檔案在簽章後連 1 位元都沒有被竄改」。&lt;/p>
&lt;h2 id="6-最大的障礙自簽章憑證的陷阱">6. 最大的障礙：「自簽章憑證的陷阱」
&lt;/h2>&lt;p>即使上述的數學證明完美無缺，Windows 11 也無法僅憑藉這一點就允許安裝。因為它必須驗證『信任的鏈結 (Chain of Trust)』，也就是「該公鑰 (憑證) 的擁有者，是否真的是其所宣稱的安全組織或人員？」。&lt;/p>
&lt;p>如果憑證是由 VeriSign 或 DigiCert 等已被 OS 預先信任的公開根憑證授權單位 (Root CA) 所發行，就能順利安裝 (透過 Microsoft Store 發佈的應用程式也同樣受到 Microsoft 根憑證的信任)。&lt;/p>
&lt;p>然而，在開發中或做為公司內部專用工具等情況下，若無法負擔購買公開憑證的成本，開發者就會自行核發憑證。這就是「自簽章憑證 (Self-Signed Certificate)」。&lt;/p>
&lt;p>以下的循序圖展示了嘗試安裝以自簽章憑證簽署的 MSIX 套件時，OS 的行為模式。&lt;/p>
&lt;pre class="mermaid">
sequenceDiagram
autonumber
participant U as &amp;#34;使用者 (Windows 11)&amp;#34;
participant P as &amp;#34;MSIX 應用程式安裝程式&amp;#34;
participant C as &amp;#34;Windows 憑證存放區&amp;#34;
U-&amp;gt;&amp;gt;P: &amp;#34;連按兩下 .msix 檔案&amp;#34;
P-&amp;gt;&amp;gt;P: &amp;#34;讀取 AppxSignature.p7x&amp;#34;
P-&amp;gt;&amp;gt;P: &amp;#34;萃取簽章與憑證&amp;#34;
P-&amp;gt;&amp;gt;P: &amp;#34;驗證數學運算 (雜湊值相符？)&amp;#34;
P-&amp;gt;&amp;gt;C: &amp;#34;檢查發行者憑證的信任&amp;#34;
alt &amp;#34;憑證位於受信任的根憑證授權單位存放區&amp;#34;
C--&amp;gt;&amp;gt;P: &amp;#34;信任驗證成功&amp;#34;
P-&amp;gt;&amp;gt;U: &amp;#34;提示安裝 (安裝按鈕為可用狀態)&amp;#34;
U-&amp;gt;&amp;gt;P: &amp;#34;按下安裝&amp;#34;
P-&amp;gt;&amp;gt;U: &amp;#34;安裝成功&amp;#34;
else &amp;#34;憑證不被信任 (陷阱)&amp;#34;
C--&amp;gt;&amp;gt;P: &amp;#34;信任驗證失敗 (0x800B0109)&amp;#34;
P-&amp;gt;&amp;gt;U: &amp;#34;顯示錯誤：已處理憑證鏈結，但終止於不受信任的根憑證&amp;#34;
P-&amp;gt;&amp;gt;U: &amp;#34;安裝按鈕為停用狀態&amp;#34;
end
&lt;/pre>
&lt;p>這正是所謂的「陷阱」。儘管開發者自行建立並正確簽署了套件，但在 Windows 11 的預設狀態下，因為它不認識（不信任）該自簽章憑證，所以會伴隨錯誤代碼 &lt;code>0x800B0109&lt;/code> 而阻擋安裝。安裝程式的「安裝」按鈕會呈現灰色而無法點擊。&lt;/p>
&lt;p>許多開發者在面臨這個錯誤時，會陷入「MSIX 滿是錯誤」、「一定是設定錯了」而反覆修改資訊清單檔案的迷宮中，但問題並不在於套件的結構，而是在於是否已將憑證登錄到 OS 的憑證存放區 (Certificate Store)。&lt;/p>
&lt;h2 id="7-解決方案使用-powershell-建立與部署自簽章憑證">7. 解決方案：使用 PowerShell 建立與部署自簽章憑證
&lt;/h2>&lt;p>為了解決這個問題，必須確實執行以下兩個步驟：&lt;/p>
&lt;ol>
&lt;li>建立有效的自簽章憑證，並匯出包含私鑰的 PFX 檔案。&lt;/li>
&lt;li>將所建立憑證的公鑰部分 (CER 檔案)，安裝到所有目標 PC 的**「受信任的根憑證授權單位 (Trusted Root Certification Authorities)」存放區**中。&lt;/li>
&lt;/ol>
&lt;p>透過使用 PowerShell，就能確實且自動地處理這些工作。&lt;/p>
&lt;h3 id="步驟-1建立與匯出自簽章憑證">步驟 1：建立與匯出自簽章憑證
&lt;/h3>&lt;p>首先以系統管理員權限啟動 PowerShell，執行以下指令碼來建立憑證。在這裡，我們將產生專用於程式碼簽章 (Code Signing) 的憑證。&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="c"># 1. 參數定義&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$SubjectName&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;CN=MyCompany Self-Signed, O=MyCompany&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$CertStoreLocation&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;Cert:\CurrentUser\My&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># 2. 產生自簽章憑證 (程式碼簽章用途: 1.3.6.1.5.5.7.3.3)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$Cert&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="nb">New-SelfSignedCertificate&lt;/span> &lt;span class="n">-Type&lt;/span> &lt;span class="n">Custom&lt;/span> &lt;span class="p">`&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">-Subject&lt;/span> &lt;span class="nv">$SubjectName&lt;/span> &lt;span class="p">`&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">-KeyUsage&lt;/span> &lt;span class="n">DigitalSignature&lt;/span> &lt;span class="p">`&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">-FriendlyName&lt;/span> &lt;span class="s2">&amp;#34;MyCompany MSIX Signing Cert&amp;#34;&lt;/span> &lt;span class="p">`&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">-CertStoreLocation&lt;/span> &lt;span class="nv">$CertStoreLocation&lt;/span> &lt;span class="p">`&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">-TextExtension&lt;/span> &lt;span class="vm">@&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;2.5.29.37={text}1.3.6.1.5.5.7.3.3&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;2.5.29.19={text}&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Write-Host&lt;/span> &lt;span class="s2">&amp;#34;已產生憑證。指紋 (Thumbprint): &lt;/span>&lt;span class="p">$(&lt;/span>&lt;span class="nv">$Cert&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">Thumbprint&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># 3. 建立匯出 PFX (含私鑰) 用的密碼&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$Password&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="nb">ConvertTo-SecureString&lt;/span> &lt;span class="n">-String&lt;/span> &lt;span class="s2">&amp;#34;YourSecurePassword123!&amp;#34;&lt;/span> &lt;span class="n">-Force&lt;/span> &lt;span class="n">-AsPlainText&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># 4. 匯出 PFX 檔案 (供 SignTool 簽章用)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$PfxPath&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;C:\Path\To\Output\MyCompanyCert.pfx&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Export-PfxCertificate&lt;/span> &lt;span class="n">-Cert&lt;/span> &lt;span class="nv">$Cert&lt;/span> &lt;span class="n">-FilePath&lt;/span> &lt;span class="nv">$PfxPath&lt;/span> &lt;span class="n">-Password&lt;/span> &lt;span class="nv">$Password&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># 5. 匯出 CER (僅含公鑰) (供安裝至用戶端 PC 用)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$CerPath&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;C:\Path\To\Output\MyCompanyCert.cer&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Export-Certificate&lt;/span> &lt;span class="n">-Cert&lt;/span> &lt;span class="nv">$Cert&lt;/span> &lt;span class="n">-FilePath&lt;/span> &lt;span class="nv">$CerPath&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>使用此處建立的 &lt;code>$PfxPath&lt;/code> 檔案，為 MSIX 套件進行簽章。&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cmd" data-lang="cmd">&lt;span class="line">&lt;span class="cl">SignTool.exe sign /fd SHA256 /a /f &lt;span class="s2">&amp;#34;C:\Path\To\Output\MyCompanyCert.pfx&amp;#34;&lt;/span> /p &lt;span class="s2">&amp;#34;YourSecurePassword123!&amp;#34;&lt;/span> &lt;span class="s2">&amp;#34;C:\Path\To\Output\AwesomeApp_1.0.0.0_x64.msix&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="步驟-2將憑證安裝至用戶端-pc-解除陷阱">步驟 2：將憑證安裝至用戶端 PC (解除陷阱)
&lt;/h3>&lt;p>即使將已簽章的 MSIX 帶到另一台 PC (或虛擬環境)，直接連按兩下也如前所述無法安裝。必須在事前 (或同時) 將剛才匯出的 &lt;code>$CerPath&lt;/code> 檔案安裝到「本機電腦」的「受信任的根憑證授權單位」。&lt;/p>
&lt;p>為此，請在部署目標的 PC 上開啟&lt;strong>具備系統管理員權限&lt;/strong>的 PowerShell，並執行以下命令。&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;span class="lnt">7
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="c"># CER 檔案的路徑&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$CerPath&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;C:\Path\To\Output\MyCompanyCert.cer&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># 匯入至本機電腦的「受信任的根憑證授權單位」&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Import-Certificate&lt;/span> &lt;span class="n">-FilePath&lt;/span> &lt;span class="nv">$CerPath&lt;/span> &lt;span class="n">-CertStoreLocation&lt;/span> &lt;span class="s2">&amp;#34;Cert:\LocalMachine\Root&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Write-Host&lt;/span> &lt;span class="s2">&amp;#34;已將憑證安裝至受信任的根憑證授權單位。&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;blockquote>
&lt;p>[!CAUTION]
要新增至「本機電腦 (&lt;code>LocalMachine&lt;/code>)」的根憑證授權單位存放區，必須具備系統管理員權限。如果放進使用者個人的存放區 (&lt;code>CurrentUser&lt;/code>)，可能會因為 App Installer 權限情境的緣故而無法被識別，請務必注意。&lt;/p>
&lt;/blockquote>
&lt;p>此指令碼成功執行後，請嘗試再次連按兩下剛才發生錯誤的 MSIX 檔案。錯誤訊息會宛如施了魔法般消失，並顯示鮮豔藍色、處於可用狀態的「安裝」按鈕。如此一來便成功完全突破了「自簽章憑證的陷阱」。&lt;/p>
&lt;h2 id="8-企業環境中的維運與最佳實務">8. 企業環境中的維運與最佳實務
&lt;/h2>&lt;p>如果是開發者的本機測試，上述步驟已經足夠，但若要將側載應用程式部署到公司內數十台、數百台的 PC 上，要求每位使用者執行憑證安裝指令碼是不切實際的，且伴隨著安全風險。&lt;/p>
&lt;p>企業環境中的最佳實務如下：&lt;/p>
&lt;h3 id="1-活用-active-directory-群組原則-gpo">1. 活用 Active Directory 群組原則 (GPO)
&lt;/h3>&lt;p>若公司內部有導入 Active Directory，可以使用 GPO 的「公開金鑰原則」，將自簽章憑證 (CER 檔案) 自動派發到所有加入網域的 PC 的「受信任的根憑證授權單位」。透過此方式，員工完全不需意識到憑證的存在，只需連按兩下共用資料夾上的 MSIX 檔案即可安裝。&lt;/p>
&lt;h3 id="2-透過-microsoft-intune-mdm-部署">2. 透過 Microsoft Intune (MDM) 部署
&lt;/h3>&lt;p>在現代化的環境中，會使用 Microsoft Intune 來進行裝置管理。在 Intune 中，可以使用「組態設定檔」功能將受信任的憑證 (.cer) 推送傳遞至端點。之後，即可將 MSIX 套件本身以無訊息安裝的方式做為企業營運 (LOB) 應用程式來部署。&lt;/p>
&lt;h3 id="3-透過-app-installer-檔案-appinstaller-自動更新">3. 透過 App Installer 檔案 (.appinstaller) 自動更新
&lt;/h3>&lt;p>MSIX 具備強大的自動更新應用程式功能。只要建立以 XML 為基礎的 &lt;code>.appinstaller&lt;/code> 檔案，並將其放置在網頁伺服器或 SMB 共用資料夾上，就能在應用程式啟動時於背景檢查是否有新版本的 MSIX，並自動套用更新。&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-xml" data-lang="xml">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;utf-8&amp;#34;?&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;AppInstaller&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">Uri=&lt;/span>&lt;span class="s">&amp;#34;https://internal.mycompany.com/apps/AwesomeApp.appinstaller&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">Version=&lt;/span>&lt;span class="s">&amp;#34;1.0.0.0&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">xmlns=&lt;/span>&lt;span class="s">&amp;#34;http://schemas.microsoft.com/appx/appinstaller/2018&amp;#34;&lt;/span>&lt;span class="nt">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;MainPackage&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">Name=&lt;/span>&lt;span class="s">&amp;#34;MyCompany.AwesomeApp&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">Publisher=&lt;/span>&lt;span class="s">&amp;#34;CN=MyCompany Self-Signed, O=MyCompany&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">Version=&lt;/span>&lt;span class="s">&amp;#34;1.0.0.0&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">ProcessorArchitecture=&lt;/span>&lt;span class="s">&amp;#34;x64&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">Uri=&lt;/span>&lt;span class="s">&amp;#34;https://internal.mycompany.com/apps/AwesomeApp_1.0.0.0_x64.msix&amp;#34;&lt;/span> &lt;span class="nt">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;UpdateSettings&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;OnLaunch&lt;/span> &lt;span class="na">HoursBetweenUpdateChecks=&lt;/span>&lt;span class="s">&amp;#34;0&amp;#34;&lt;/span> &lt;span class="nt">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/UpdateSettings&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;/AppInstaller&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>將此檔案派發給使用者安裝後，未來只需替換伺服器上的 MSIX 檔案並更新 &lt;code>.appinstaller&lt;/code> 的版本號碼，所有使用者的應用程式就會自動更新。&lt;/p>
&lt;h2 id="9-疑難排解與憑證相關的常見錯誤">9. 疑難排解：與憑證相關的常見錯誤
&lt;/h2>&lt;p>最後，在此彙整其他與憑證或簽章相關、可能會發生的常見錯誤與解決方案。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>0x800B0101&lt;/strong>：用於簽章的憑證已過期。請重新核發新的憑證，或在簽章時使用時間戳記伺服器 (例如：&lt;code>http://timestamp.digicert.com&lt;/code>)，以證明簽章是在憑證有效期間內進行的 (只要加上時間戳記，即使憑證本身過期，該簽章仍會被視為有效)。&lt;/li>
&lt;li>&lt;strong>0x80080204&lt;/strong>：&lt;code>AppxManifest.xml&lt;/code> 中記載的 &lt;code>Publisher&lt;/code> 值與憑證的 &lt;code>Subject&lt;/code> 值沒有完全一致。請嚴格確認字串是否完全相符，例如逗號後是否有空白等。&lt;/li>
&lt;li>&lt;strong>檢查事件檢視器&lt;/strong>：要尋找錯誤更詳細的原因，開啟 Windows 的事件檢視器，並檢查「應用程式及服務記錄檔」-&amp;gt;「Microsoft」-&amp;gt;「Windows」-&amp;gt;「AppxPackagingOM」或「AppXDeployment-Server」的記錄檔，這點非常重要。&lt;/li>
&lt;/ul>
&lt;h2 id="10-總結">10. 總結
&lt;/h2>&lt;p>面向 Windows 11 的 MSIX 封裝是一項強大的技術，能夠飛躍性地提升應用程式的生命週期管理。能從 Win Rot 與 DLL 地獄中解脫，提供使用者乾淨又安全的環境。&lt;/p>
&lt;p>另一方面，由於安全模型變得更為嚴格，對於數位簽章與憑證「信任鏈結」的深入理解是不可或缺的。「自簽章憑證的陷阱」可說是初次接觸 MSIX 技術的開發者幾乎必然會面臨的難關。只要理解本文所解說的憑證產生、匯出，以及匯入適當存放區的機制，並活用指令碼或 GPO 來進行自動化，就能引出 MSIX 的最大潛力，實現順暢的部署。&lt;/p>
&lt;p>請務必善用這些知識，建構次世代的乾淨 Windows 應用程式散佈環境。&lt;/p></description></item></channel></rss>