本文介绍如何使用 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 对应用包进行签名。
安全注意事项
通过将证书添加到 本地计算机证书存储,会影响计算机上的所有用户的证书信任。 建议在不再需要这些证书时删除这些证书,以防止它们用于破坏系统信任。