7

以前我们有一个代码签名证书,一切正常。最近证书过期了,所以我们从 Comodo 获取了新证书,并使用该证书发布了新版本。

所以这就是问题所在:Package Family Name Changed with that new cert,所以我无法使用这个新版本与新证书打包来升级旧安装的应用程序。

需要解决方案来保持包系列名称不变或新证书,我们还需要为旧应用程序提供升级。

我们怎样才能做到这一点?

从 PowerShell 升级软件包时出现错误消息:

Add-AppxPackage:部署失败,HRESULT:0x80073CF3,包失败
更新、依赖或冲突验证。
Windows 无法安装软件包 df70dbc9-455c-4c32-b052-7ac2943630b7_1.0.193.1_x64__qbsrcgy0j364g
因为不同的包 df70dbc9-455c-4c32-b052-7ac2943630b7_1.0.0.191_x64__hs446qhh7vdt4
已经安装了同名的。移除包裹
df70dbc9-455c-4c32-b052-7ac2943630b7_1.0.0.191_x64__hs446qhh7vdt4 之前
安装。
注意:有关其他信息,请查找 [ActivityId]
事件日志中的 b0deec37-ac10-0001-81fd-deb010acd101 或使用命令行
获取-AppxLog -ActivityID b0deec37-ac10-0001-81fd-deb010acd101
在 C:\Users\\Desktop\\myappName_1.0.193.1_x64_Test\Add-AppDevPackage.ps1:388 char:13
+ 添加-AppxPackage -Path $DeveloperPackagePath.FullName -DependencyPath ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : WriteError: (C:\Users\myuser....193.1_x64.appx:String) [Add-AppxPackage], IOException
    + FullyQualifiedErrorId:部署错误,Microsoft.Windows.Appx.PackageManager.Commands.AddAppxPackageCommand
错误:无法安装应用程序。
4

1 回答 1

8

包系列名称(PFN)后缀(在您的情况下hs446qhh7vdt4)是证书主题(AKA主题名称)的哈希:

certutil -dump foo.pfx
Enter PFX password:
================ Certificate 0 ================
================ Begin Nesting Level 1 ================
Element 0:
Serial Number: xxxxxxxxxxxxxxxxx
Issuer: CN=Microsoft, O=Contoso, L=Redmond, S=Washington, C=US
 NotBefore: 11/1/2016 12:00 AM
 NotAfter: 11/1/2017 12:00 AM
Subject: CN=Microsoft, O=Contoso, L=Redmond, S=Washington, C=US <== THIS IS HASHED

如果您确保生成的新证书具有相同的主题,您将获得相同的 PFN。请注意,您可能无法从 Visual Studio 中生成商店证书(在撰写本文时,它无法解析像上面那样具有多个“部分”的复杂主题,如CN=X, O=Y)。在这种情况下,您必须创建自己的,但它必须符合商店验证

幸运的是,有一个简单的命令可以生成您需要的确切证书。打开 Visual Studio 开发人员提示并运行(一行):

makecert -sv foo.pvk -n "CN=Contoso, O=Contoso, L=Redmond, S=Washington, C=US" 
    foo.cer -b 11/01/2016 -e 11/01/2017 -r -cy end -a sha256 -eku 1.3.6.1.5.5.7.3.3

确保替换有效日期(相隔不超过一年!)以及主题(取自您以前的证书,使用certutil -dump)。输出证书 ( cer) 和私钥 ( pvk) 的名称没有意义。该命令将生成foo.pvkand foo.cer,然后您可以将其组合到 pfx 中,如下所示:

PVK2PFX -pvk foo.pvk -spc foo.cer -pfx foo.pfx

高级一代的另一种选择

如果您有更高级的证书要求,您应该可以使用certreq(虽然还没有测试过)。创建一个包含cert.inf以下内容的文件:

[Version]
Signature = "$Windows NT$"

[Strings]
szOID_ENHANCED_KEY_USAGE = "2.5.29.37"
szOID_CODE_SIGNING = "1.3.6.1.5.5.7.3.3"
szOID_BASIC_CONSTRAINTS2 = "2.5.29.19"

[NewRequest]
Subject = "CN=Contoso, O=Contoso, L=Redmond, S=Washington, C=US"
Exportable = true
HashAlgorithm = Sha256
KeyLength = 2048
RequestType = Cert
ValidityPeriod = "Years"
ValidityPeriodUnits = "1"

[Extensions]
%szOID_ENHANCED_KEY_USAGE% = "{text}%szOID_CODE_SIGNING%"
%szOID_BASIC_CONSTRAINTS2% = "{text}"

替换主题和有效期,并根据文档调整您需要的任何高级设置(或者更有可能在网络上找到)。然后执行以下操作:

  1. certreq -new cert.inf cert.cer
  2. 双击结果cert.cer并将其安装到受信任的根证书颁发机构存储(用户或计算机)。
  3. certreq -accept -user cert.cercertreq -accept -machine cert.cer(取决于您在上一步中选择的商店)。
  4. 转到证书管理器中的个人商店(用户或机器范围,取决于您在上面选择的内容)并找到您刚刚安装的证书。双击它并从详细信息选项卡中复制序列号(我在这里遇到了一些伏都教,证书只有在很长一段时间后才会显示,或者在我安装了不同的证书(具有不同的主题名称)之后才会显示。
  5. certutil -exportpfx -p "YOUR_PFX_PASS" my SERIAL_NUMBER foo.pfx(将密码和序列号替换为实际值)

您现在应该有一个有效的存储 pfx。

更高级一代的另一种选择

使用OpenSSL。很确定它可以做到以上所有以及更多,但我没有亲自尝试过,所以你必须弄清楚 - 并希望一旦你这样做就在这里分享!

于 2016-11-03T19:40:31.563 回答