创建用于包签名的证书

本文介绍如何使用 PowerShell 工具创建和信任应用包签名的证书(对于 CMD 工具,请参阅 此处)。 建议使用 Visual Studio 打包 UWP 应用打包桌面应用,但如果不使用 Visual Studio 开发应用,仍可手动打包应用。

先决条件

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

  • 公钥基础结构 (PKI) Cmdlet
    需要 PKI cmdlet 才能创建和导出签名证书。 有关详细信息,请参阅 公钥基础结构 Cmdlet

创建自签名证书

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

注释

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

确定打包应用的主题

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

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

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

在本例中,“Publisher”是“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 -KeyUsage DigitalSignature -CertStoreLocation "Cert:\CurrentUser\My" -TextExtension @("2.5.29.37={text}1.3.6.1.5.5.7.3.3", "2.5.29.19={text}") -Subject "CN=Contoso Software, O=Contoso Corporation, C=US" -FriendlyName "Your friendly name goes here"

请注意以下有关某些参数的详细信息:

  • 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)。

运行此命令后,将创建证书并将其添加到用户个人证书存储。 该命令的结果还将生成证书的指纹。

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

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

这将在用户个人证书存储中显示所有证书。

若要安装使用此证书签名的应用,必须将证书导入到本地计算机受信任人员证书存储中。

将证书导出到 PFX 文件

若要将新创建的证书导入本地计算机受信任人员证书存储,需要首先使用 Export-PfxCertificate cmdlet 将其导出到个人信息交换 (PFX) 文件。

使用 Export-PfxCertificate 时,必须创建和使用密码,或使用“-ProtectTo”参数指定哪些用户或组可以在不使用密码的情况下访问文件。 请注意,如果不使用“-Password”或“-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>

将证书导入本地计算机受信任的人员存储

将证书导出到 PFX 文件后,即可使用管理员 PowerShell 会话中的 Import-PfxCertificate cmdlet 将其导入本地计算机受信任人员存储。

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

证书受信任后,即可使用 SignTool 对应用包进行签名。 有关手动打包过程的下一步,请参阅 使用 SignTool 对应用包进行签名

安全注意事项

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