对 MSIX 包进行签名:端到端指南

本指南将指导你为每个开发阶段(从本地测试到生产分发)对 MSIX 包进行签名。 有关签名选项和成本的比较,请参阅 签署 MSIX 包概述

选择签名方法

阶段 建议的方法 Windows 版本
本地开发和测试 WinApp CLI (自签名证书) Windows 10及更高版本
分发给测试人员(侧载) 具有证书信任步骤的自签名证书 Windows 10及更高版本
生产分配 Azure工件签名(之前称为信任签名) Windows 10版本 1809 及更高版本、Windows Server 2016及更高版本
Microsoft Store分布 提交时由商店签名 所有受支持的Windows版本

开发:为本地测试签名

对于本地开发,请使用自签名证书。 自签名包只能安装在显式信任证书的计算机上, 这是有意的,适合进行测试。

重要

Windows应用开发CLI目前处于公开预览版,需要在安装了WinGet的Windows 10上运行。

WinApp CLI 处理证书生成和单步登录。

步骤 1:安装 WinApp CLI

winget install -e --id Microsoft.WinAppCLI --source winget

步骤 2:生成自签名开发证书

winapp cert generate --manifest .\appxmanifest.xml --output .\devcert.pfx --install

--manifest 标志直接从你的 appxmanifest.xml读取发布者名称。 该 --install 标志将证书添加到本地计算机信任存储,以便可以立即安装包。

步骤 3:对包进行签名

winapp sign MyApp.msix --cert .\devcert.pfx

选项 B:PowerShell + SignTool (Windows 10 及更高版本)

如果不使用 WinApp CLI,请使用此方法。

步骤 1:创建自签名证书

在提升的 PowerShell 提示符下运行以下命令。 Subject 值必须与 Publisher 中的 appxmanifest.xml完全匹配:

New-SelfSignedCertificate -Type Custom -KeyUsage DigitalSignature `
  -Subject "CN=MyPublisher" `
  -CertStoreLocation "Cert:\CurrentUser\My" `
  -TextExtension @("2.5.29.37={text}1.3.6.1.5.5.7.3.3", "2.5.29.19={text}") `
  -FriendlyName "MyApp Dev Cert"

记下输出中的指纹 - 后续步骤中需要用到它。

步骤 2:将证书导出到 PFX 文件

$password = ConvertTo-SecureString -String "YourPassword" -Force -AsPlainText
Export-PfxCertificate -cert "Cert:\CurrentUser\My\<Thumbprint>" `
  -FilePath .\devcert.pfx -Password $password

步骤 3:在本地信任证书

Import-PfxCertificate -CertStoreLocation "Cert:\LocalMachine\TrustedPeople" `
  -FilePath .\devcert.pfx -Password $password

步骤 4:对包进行签名

SignTool sign /fd SHA256 /a /f .\devcert.pfx /p "YourPassword" MyApp.msix

有关完整的 SignTool 用法,请参阅 使用 SignTool 对应用包进行签名


测试:使用自签名证书分发给测试人员

若要在测试人员的计算机上安装自签名 MSIX 包,必须先在该计算机上安装证书。

注释

Windows 10 2004 及更高版本Windows 11 上,默认情况下启用旁加载。 在早期Windows 10版本中,测试人员必须在 设置 > 更新和安全 > 面向开发人员 中启用 旁加载应用

为测试人员提供证书:.pfx.cer(仅限公钥)文件与.msix包一起共享。

测试人员在提升的 PowerShell 提示符下运行以下命令:

# If you shared a .pfx file (testers need the password)
Import-PfxCertificate -CertStoreLocation "Cert:\LocalMachine\TrustedPeople" `
  -FilePath .\devcert.pfx -Password (ConvertTo-SecureString "YourPassword" -Force -AsPlainText)

# If you shared a .cer file (public key only, no password needed)
Import-Certificate -CertStoreLocation "Cert:\LocalMachine\TrustedPeople" -FilePath .\devcert.cer

信任证书后,测试人员可以通过双击来安装 .msix 证书。

重要

自签名证书只能用于测试。 不再需要时,请将它们从测试机中删除。 对于广泛分发,请改用公开信任的签名方法。


生产:Azure工件签名(以前称为受信任的签名)

应用程序到: Windows 10版本 1809 及更高版本、Windows 11(所有版本)、Windows Server 2016及更高版本

Azure工件签名是以前称为“受信任的签名”的新名称。 服务是相同的 - 仅更改了名称。 某些工具(如 azure/trusted-signing-action GitHub 操作和 winget 包 ID)中仍可能会看到“受信任的签名”,因为这些引用会随着时间推移而更新。

Azure 组件签名是生产 MSIX 签名的建议选项。 信誉与已验证的标识(而不是特定证书)相关联,这意味着发布者标识会在用户安装已签名的应用时生成 SmartScreen 信誉。 在设置帐户之前,请参阅 登录 MSIX 包概述 ,了解资格要求和成本信息。

重要

Azure项目签名可用性:美国、加拿大、欧盟和英国的组织可以注册。 个人开发人员目前仅限于美国和加拿大。 如果你是这些区域之外的单个开发人员,请改用 CA 中的 OV 代码签名证书(请参阅以下 生产:OV 代码签名证书 )。

注释

使用 Azure Artifact 签名不能提供即时的 SmartScreen 信任。 与 OV 证书一样,你的应用最初会显示 SmartScreen 警告,直到发布者标识生成足够的下载信誉(通常是几周和数百次全新安装)。 这是新发布者的预期行为。 有关 SmartScreen 信誉的运作方式以及作为新发布者的预期,请参阅 面向 Windows 应用开发人员的 SmartScreen 信誉

先决条件

  • 已完成标识验证的项目签名帐户和已创建的证书配置文件。 请参阅 项目签名快速入门
  • 用于签名的标识被分配了受信任签名证书配置文件签名者角色。

步骤 1:安装项目签名客户端工具

Artifact 签名客户端工具包括所需的 dlib 插件、兼容版本的 SignTool 和 .NET 8 运行时。 标准 SignTool 语法如果没有这个包,不适用于 工件签名。

winget install -e --id Microsoft.Azure.ArtifactSigningClientTools

如果 WinGet 不可用(例如,在Windows Server生成代理上),请以管理员身份通过 PowerShell 进行安装:

$ProgressPreference = 'SilentlyContinue'
Invoke-WebRequest -Uri "https://download.microsoft.com/download/70ad2c3b-761f-4aa9-a9de-e7405aa2b4c1/ArtifactSigningClientTools.msi" -OutFile .\ArtifactSigningClientTools.msi
Start-Process msiexec.exe -Wait -ArgumentList '/I ArtifactSigningClientTools.msi /quiet'
Remove-Item .\ArtifactSigningClientTools.msi

步骤 2:创建元数据 JSON 文件

使用您的构件签名帐户详细信息创建名为metadata.json的文件。 终结点 URI 必须与您创建帐户时所在的 Azure 区域匹配(您可以在 Azure 门户中的工件签名帐户下找到它,Account URI):

{
  "Endpoint": "https://<region>.codesigning.azure.net/",
  "CodeSigningAccountName": "<your-account-name>",
  "CertificateProfileName": "<your-certificate-profile-name>"
}

有关特定于区域的终结点 URI 的完整列表,请参阅 签名集成

步骤 3:身份验证

将Azure凭据设置为环境变量(将应用注册凭据用于 CI/CD):

$env:AZURE_CLIENT_ID     = "<your-client-id>"
$env:AZURE_TENANT_ID     = "<your-tenant-id>"
$env:AZURE_CLIENT_SECRET = "<your-client-secret>"

或者,运行 az login 交互式本地签名。

步骤 4:对包进行签名

使用随项目签名客户端工具一起安装的 SignTool。 标志 /dlib 指向在上一步中安装的 dlib 插件:

signtool sign /v /fd SHA256 `
  /tr "https://timestamp.acs.microsoft.com" /td SHA256 `
  /dlib "C:\Program Files (x86)\Microsoft\ArtifactSigningClientTools\bin\Azure.CodeSigning.Dlib.dll" `
  /dmdf .\metadata.json `
  MyApp.msix

小窍门

如果签名失败,请使用 /debug 标志获取详细的输出 , 它显示证书链和身份验证详细信息。

CI/CD:GitHub Actions

使用官方 azure/trusted-signing-action

- name: Sign MSIX with Azure Artifact Signing
  uses: azure/trusted-signing-action@v0
  with:
    azure-tenant-id: ${{ secrets.AZURE_TENANT_ID }}
    azure-client-id: ${{ secrets.AZURE_CLIENT_ID }}
    azure-client-secret: ${{ secrets.AZURE_CLIENT_SECRET }}
    endpoint: ${{ secrets.AZURE_TRUSTED_SIGNING_ENDPOINT }}
    trusted-signing-account-name: ${{ secrets.AZURE_CODE_SIGNING_NAME }}
    certificate-profile-name: ${{ secrets.AZURE_CERT_PROFILE_NAME }}
    files-folder: ${{ github.workspace }}\output
    files-folder-filter: msix

有关Azure DevOps,请参阅 使用受信任的签名设置Azure DevOps


制作:Microsoft Store 分发

应用于:所有受支持的 Windows 版本

如果要通过Microsoft Store分发,则无需自行对包进行签名 - 应用商店会在提交过程中对其进行签名。 生成包并通过 合作伙伴中心提交。 应用商店提供全局受信任的签名并处理所有证书管理。


生成:OV 代码签名证书

适用于: Windows 10 及更高版本

如果项目签名不适用于你的区域或情况,可以从证书颁发机构(CA)(例如 DigiCert、Sectigo 或 GlobalSign)购买 OV(组织验证)代码签名证书。 成本通常从 300 到 500 美元/年不等。

从 CA 获得 PFX 文件后:

SignTool sign /fd SHA256 /a /f .\cert.pfx /p "YourPassword" `
  /tr http://timestamp.digicert.com /td SHA256 `
  MyApp.msix

有关完整签名选项,请参阅 使用 SignTool 对应用包进行签名

注释

OV 证书不提供即时 SmartScreen 信任。 随着已签名包的安装而不进行标记,信誉会随着时间推移而生成。 有关详细信息,请参阅Windows 应用开发人员的 SmartScreen 信誉