为包签名创建证书

本文介绍如何使用 PowerShell 工具,为应用包签名创建和导出证书。 建议使用 Visual Studio 打包 UWP 应用打包桌面应用程序,但如果你没有使用 Visual Studio 开发应用,仍可手动打包应用。

先决条件

  • 打包或未打包的应用
    包含了 AppxManifest.xml 文件的应用。 在创建用于对最终应用包进行签名的证书时,需要引用清单文件。 有关如何手动打包应用的详细信息,请参阅使用 MakeAppx.exe 工具创建应用包

  • 公钥基础结构 (PKI) Cmdlets
    你需要 PKI cmdlet 来创建和导出签名证书。 有关更多信息,请参阅公钥基础结构 Cmdlets

创建自签名证书

在你准备好将其发布到 Store 之前,自签名证书可用于测试应用。 按照本节概述的步骤创建自签名证书。

注意

创建和使用自签名证书时,只有安装并信任证书的用户才能运行该应用程序。 这在测试中很容易实现,但可能会阻止其他用户安装应用程序。 准备好发布应用程序时,建议使用可靠来源颁发的证书。 这种集中式信任系统有助于确保应用程序生态系统具有多个验证级别,以保护用户免受恶意参与者的侵害。

确定打包的应用的主题

要使用证书对应用包进行签名,证书中的“使用者”必须与应用清单中的“发布者”部分匹配。

例如,在应用的 AppxManifest.xml 文件中,“身份”部分应如下所示:

  <Identity Name="Contoso.AssetTracker" 
    Version="1.0.0.0" 
    Publisher="CN=Contoso Software, O=Contoso Corporation, C=US"/>

在本示例中,“发布者”是“CN=Contoso Software、O=Contoso Corporation、C=US”,需要用于创建证书。

使用 New-SelfSignedCertificate 创建证书

使用 New-SelfSignedCertificate PowerShell cmdlet 创建自签名证书。 New-SelfSignedCertificate 具有多个用于自定义的参数,但在本文中,我们将重点介绍如何创建将与 SignTool 配合使用的简单证书。 有关该 cmdlet 的更多示例和用法,请参阅 New-SelfSignedCertificate

根据上一示例中的 AppxManifest.xml 文件,应使用以下语法来创建证书。 在提升的 PowerShell 命令提示符中:

New-SelfSignedCertificate -Type Custom -Subject "CN=Contoso Software, O=Contoso Corporation, C=US" -KeyUsage DigitalSignature -FriendlyName "Your friendly name goes here" -CertStoreLocation "Cert:\CurrentUser\My" -TextExtension @("2.5.29.37={text}1.3.6.1.5.5.7.3.3", "2.5.29.19={text}")

请注意以下有关部分参数的详细信息:

  • KeyUsage:该参数定义证书的用途。 对于自签名证书,该参数应设置为 DigitalSignature

  • TextExtension:该参数包括以下扩展的设置:

    • 扩展密钥用法 (EKU):此扩展指示可以使用认证公钥的其他用途。 对于自签名证书,该参数应包含扩展字符串 “2.5.29.37={text}1.3.6.1.5.5.7.3.3”,指示该证书将用于代码签名。

    • 基本约束:此扩展指示证书是否为证书颁发机构 (CA)。 对于自签名证书,此参数应包含扩展字符串“2.5.29.19={text}”,这表明证书是最终实体(而不是 CA)。

运行此命令后,证书将添加到本地证书存储,如在“-CertStoreLocation”参数中指定。 该命令的结果还将生成证书指纹。

可以使用以下 PowerShell 命令查看 PowerShell 窗口中的证书:

Set-Location Cert:\CurrentUser\My
Get-ChildItem | Format-Table Subject, FriendlyName, Thumbprint

这将在本地存储中显示所有证书。

导出证书

要将本地存储中的证书导出到个人信息交换 (PFX) 文件,请使用 Export-PfxCertificate cmdlet。

使用 Export-PfxCertificate 时,必须创建和使用密码,或使用“-ProtectTo”参数来指定哪些用户或群组可以在不使用密码的情况下访问文件。 请注意,如果不使用“-Password”或“-ProtectTo”参数,会显示错误。

密码使用情况

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

ProtectTo 使用情况

Export-PfxCertificate -cert Cert:\CurrentUser\My\<Certificate Thumbprint> -FilePath <FilePath>.pfx -ProtectTo <Username or group name>

创建并导出证书后,可使用 SignTool 对应用包进行签名。 有关手动打包过程的下一步,请参阅使用 SignTool 对应用包进行签名

安全注意事项

通过将证书添加到本地计算机证书存储,你会影响计算机上的所有用户的证书信任。 建议在不再需要这些证书时进行移除,以防止它们被用于破坏系统信任。