本指南将指导你为每个开发阶段(从本地测试到生产分发)对 MSIX 包进行签名。 有关签名选项和成本的比较,请参阅 签署 MSIX 包概述。
选择签名方法
| 阶段 | 建议的方法 | Windows 版本 |
|---|---|---|
| 本地开发和测试 | WinApp CLI (自签名证书) | Windows 10及更高版本 |
| 分发给测试人员(侧载) | 具有证书信任步骤的自签名证书 | Windows 10及更高版本 |
| 生产分配 | Azure工件签名(之前称为信任签名) | Windows 10版本 1809 及更高版本、Windows Server 2016及更高版本 |
| Microsoft Store分布 | 提交时由商店签名 | 所有受支持的Windows版本 |
开发:为本地测试签名
对于本地开发,请使用自签名证书。 自签名包只能安装在显式信任证书的计算机上, 这是有意的,适合进行测试。
选项 A:WinApp CLI(建议用于新项目)
重要
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 信誉。
相关文章
- MSIX 包签名概述
- 使用 SignTool 对应用包进行签名
- 创建用于包签名的证书
- 使用 Azure 密钥保管库 签署包
- 工件签名快速入门
- WinApp CLI 参考
- MSIX 故障排除指南