2016-05-12 127 views
4

以前我們有一個代碼簽名證書,每件事情都很好。最近證書過期了,所以我們從Comodo獲得了新的證書,併發布了具有該證書的新版本。套餐系列名稱隨新代碼簽名證書更改

因此,問題在於:Package Family Name隨新證書更改,因此我無法升級舊版安裝的應用程序,此新版本使用新證書打包。

需要此解決方案來維護套件系列名稱爲常量或新證書的我們還需要爲舊應用程序提供升級。

我們該如何做到這一點?

錯誤味精而從PowerShell的升級包:

Add-AppxPackage : Deployment failed with HRESULT: 0x80073CF3, Package failed 
updates, dependency or conflict validation. 
Windows cannot install package df70dbc9-455c-4c32-b052-7ac2943630b7_1.0.193.1_x64__qbsrcgy0j364g 
because a different package df70dbc9-455c-4c32-b052-7ac2943630b7_1.0.0.191_x64__hs446qhh7vdt4 
with the same name is already installed. Remove package 
df70dbc9-455c-4c32-b052-7ac2943630b7_1.0.0.191_x64__hs446qhh7vdt4 before 
installing. 
NOTE: For additional information, look for [ActivityId] 
b0deec37-ac10-0001-81fd-deb010acd101 in the Event Log or use the command line 
Get-AppxLog -ActivityID b0deec37-ac10-0001-81fd-deb010acd101 
At C:\Users\\Desktop\\myappName_1.0.193.1_x64_Test\Add-AppDevPackage.ps1:388 char:13 
+    Add-AppxPackage -Path $DeveloperPackagePath.FullName -DependencyPath ... 
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : WriteError: (C:\Users\myuser....193.1_x64.appx:String) [Add-AppxPackage], IOException 
    + FullyQualifiedErrorId : DeploymentError,Microsoft.Windows.Appx.PackageManager.Commands.AddAppxPackageCommand 
Error: Could not install the app.
+0

異常說明了一切。在安裝具有相同名稱的新包之前卸載舊包,否? –

+0

我們的意圖是升級應用程序,而不會丟失保存的數據 –

回答

4

的包姓(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=XO=Y)。在這種情況下,您必須創建自己的,但它必須符合store validations

幸運的是,有一個簡單的命令可以生成所需的確切證書。打開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.pvkfoo.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。很確定它可以完成所有上述和更多,但我沒有親自嘗試過,所以你必須弄清楚它 - 希望在這裏分享一下!

+1

完美!當Visual Studio發現我的過期證書時,它創建了一個具有不同發佈者名稱的新證書。這造成了同樣的更新問題 –