WiX: проект загрузчика с цифровой подписью
у меня есть проект, для которого я построил файл msi WiX. У меня также есть загрузчик WiX (exe-файл), который проверяет наличие C++ 2005, устанавливает его, если он не найден, а затем устанавливает пакет msi. Мой проект включает Crystal Reports как файл msm, который установлен с msi, но требует правильной установки C++ 2005.
в проекте MSI я включил следующее событие сборки post для цифровой подписи файла msi.
sign /f "$(ProjectDir)myPFXFile.pfx" /p mySecretKey/d "My Program" /t http://timestamp.verisign.com/scripts/timstamp.dll /v "MyProgram.msi"
если я установлю просто msi правильно идентифицирует издателя при запросе повышенного разрешения на установку.
Я попытался добавить то же событие после сборки в проект bootstrapper следующим образом:
sign /f "$(ProjectDir)myPFXFile.pfx" /p mySecretKey/d "My Program" /t http://timestamp.verisign.com/scripts/timstamp.dll /v "MyProgram Setup.exe"
когда я пытаюсь установить exe-файл, он правильно идентифицирует издателя, но затем не может установить следующее Из файла журнала:
[1604:2574][2013-12-04T11:49:51]i001: Burn v3.7.1224.0, Windows v6.2 (Build 9200: Service Pack 0), path: C:Users.....MyProgram Setup.exe, cmdline: ''
[1604:2574][2013-12-04T11:49:51]i000: Setting string variable 'WixBundleLog' to value 'C:Users.....MyProgram_20131204114951.log'
[1604:2574][2013-12-04T11:49:51]i000: Setting string variable 'WixBundleOriginalSource' to value 'C:Users.....MyProgram Setup.exe'
[1604:2574][2013-12-04T11:49:51]i000: Setting string variable 'WixBundleName' to value 'MyProgram'
[1604:2574][2013-12-04T11:49:51]i100: Detect begin, 2 packages
[1604:2574][2013-12-04T11:49:51]i000: Setting string variable 'vcredist_x86' to value '1'
[1604:2574][2013-12-04T11:49:51]i000: Setting string variable 'vcredist_x64' to value '1'
[1604:2574][2013-12-04T11:49:51]i052: Condition 'vcredist_x86 AND (vcredist_x86 >= 1)' evaluates to true.
[1604:2574][2013-12-04T11:49:51]i101: Detected package: vcredist_x86, state: Present, cached: None
[1604:2574][2013-12-04T11:49:51]i101: Detected package: MyProgram, state: Absent, cached: None
[1604:2574][2013-12-04T11:49:51]i199: Detect complete, result: 0x0
[1604:2574][2013-12-04T11:49:53]i200: Plan begin, 2 packages, action: Install
[1604:2574][2013-12-04T11:49:53]w321: Skipping dependency registration on package with no dependency providers: vcredist_x86
[1604:2574][2013-12-04T11:49:53]i000: Setting string variable 'WixBundleRollbackLog_MyProgram' to value 'C:Users.....MyProgram_20131204114951_0_MyProgram_rollback.log'
[1604:2574][2013-12-04T11:49:53]i000: Setting string variable 'WixBundleLog_MyProgram' to value 'C:Users.....MyProgram_20131204114951_0_MyProgram.log'
[1604:2574][2013-12-04T11:49:53]i201: Planned package: vcredist_x86, state: Present, default requested: Present, ba requested: Present, execute: None, rollback: None, cache: No, uncache: No, dependency: None
[1604:2574][2013-12-04T11:49:53]i201: Planned package: MyProgram, state: Absent, default requested: Present, ba requested: Present, execute: Install, rollback: Uninstall, cache: Yes, uncache: No, dependency: Register
[1604:2574][2013-12-04T11:49:53]i299: Plan complete, result: 0x0
[1604:2574][2013-12-04T11:49:53]i300: Apply begin
[1FF8:10F8][2013-12-04T11:49:58]i360: Creating a system restore point.
[1FF8:10F8][2013-12-04T11:49:59]i361: Created a system restore point.
[1FF8:10F8][2013-12-04T11:50:00]i000: Caching bundle from: 'C:Users.....{6ab8eece-89c6-4417-905f-6d9c5136519d}.beMyProgram Setup.exe' to: 'C:ProgramDataPackage Cache{6ab8eece-89c6-4417-905f-6d9c5136519d}MyProgram Setup.exe'
[1FF8:10F8][2013-12-04T11:50:00]i320: Registering bundle dependency provider: {6ab8eece-89c6-4417-905f-6d9c5136519d}, version: 2.0.0.0
[1604:2FB4][2013-12-04T11:50:00]i336: Acquiring container: WixAttachedContainer, copy from: C:Users.....MyProgram Setup.exe
[1604:2FB4][2013-12-04T11:50:00]i000: Setting string variable 'WixBundleLastUsedSource' to value 'C:Users.....'
[1604:24F8][2013-12-04T11:50:00]e000: Error 0x80004005: Failed to extract all files from container.
[1604:2FB4][2013-12-04T11:50:00]e000: Error 0x80004005: Failed to wait for operation complete.
[1604:2FB4][2013-12-04T11:50:00]e000: Error 0x80004005: Failed to open container.
[1604:2FB4][2013-12-04T11:50:00]e000: Error 0x80004005: Failed to open container: WixAttachedContainer.
[1604:2FB4][2013-12-04T11:50:00]e312: Failed to extract payloads from container: WixAttachedContainer to working path: C:Users.....{6ab8eece-89c6-4417-905f-6d9c5136519d}C7C1FB4E513C19E0F5E8F6856FF2ACC4D7D143A2, error: 0x80004005.
[1604:2574][2013-12-04T11:50:00]e000: Error 0x80004005: Failed while caching, aborting execution.
[1FF8:10F8][2013-12-04T11:50:00]i330: Removed bundle dependency provider: {6ab8eece-89c6-4417-905f-6d9c5136519d}
[1FF8:10F8][2013-12-04T11:50:00]i352: Removing cached bundle: {6ab8eece-89c6-4417-905f-6d9c5136519d}, from path: C:ProgramDataPackage Cache{6ab8eece-89c6-4417-905f-6d9c5136519d}
[1604:2574][2013-12-04T11:50:00]i399: Apply complete, result: 0x80004005, restart: None, ba requested restart: No
затем я нашел другую альтернативу подписанию exe, добавив следующее в конец .файл wixproj:
<Target Name="SignBundleEngine">
<Exec Command=""C:Program Files (x86)Microsoft SDKsWindowsv7.0Abinsigntool.exe" sign /f "$(ProjectDir)sigFile.pfx" /p sigKey /d "My Program" /t http://timestamp.verisign.com/scripts/timstamp.dll "@(SignBundleEngine)"" />
</Target>
<Target Name="SignBundle">
<Exec Command=""C:Program Files (x86)Microsoft SDKsWindowsv7.0Abinsigntool.exe" sign /f "$(ProjectDir)sigFile.pfx" /p sigKey /d "My Program" /t http://timestamp.verisign.com/scripts/timstamp.dll "@(SignBundle)"" />
</Target>
<PropertyGroup>
<PostBuildEvent>"C:Program Files (x86)Microsoft SDKsWindowsv7.1ABinsigntool.exe" sign /f "$(ProjectDir)sigFile.pfx" /p sigKey /d "My Program" /t http://timestamp.verisign.com/scripts/timstamp.dll /v "MyProgram Setup.exe"</PostBuildEvent>
</PropertyGroup>
используя этот метод, установочный файл выполняет и устанавливает все правильно, но не идентифицирует издателя при запросе повышенного разрешения на установку, он говорит "Publisher: Unknown".
кто-нибудь знает, как заставить цифровую подпись работать на этом загрузчике?
вот мой набор.wxs и vcredist.wxs файлы:
пакета.wxs
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
xmlns:bal="http://schemas.microsoft.com/wix/BalExtension">
<Bundle Name="My Program"
Version="2.0.0"
Manufacturer="My Company"
UpgradeCode="PUT-GUID-HERE"
HelpUrl="http://www.mycompany.com"
AboutUrl="http://www.mycompany.com"
HelpTelephone="888 888 8888"
IconSourceFile="Resourcesprogram.ico">
<BootstrapperApplicationRef Id="WixStandardBootstrapperApplication.HyperlinkLicense">
<Payload SourceFile="ResourcesBootstrapper Screen.png" />
</BootstrapperApplicationRef>
<WixVariable Id="WixStdbaLicenseUrl" Value=""/>
<WixVariable Id="WixStdbaThemeXml" Value="ResourcesCustomHyperlinkTheme.xml"/>
<WixVariable Id="WixStdbaThemeWxl" Value="ResourcesCustomHyperlinkTheme.wxl"/>
<Chain>
<!-- Define the list of chained packages. -->
<PackageGroupRef Id="vcredist"/>
<MsiPackage Id="MyProgram"
SourceFile="$(var.MyProgramSetup.TargetPath)"
ForcePerMachine="yes" />
</Chain>
</Bundle>
</Wix>
vcredist с.wxs
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
<Fragment>
<util:RegistrySearch Root="HKLM" Key="SOFTWAREMicrosoftVisualStudio.0VCVCRedistx86" Value="Installed" Variable="vcredist_x86" />
<util:RegistrySearch Root="HKLM" Key="SOFTWAREMicrosoftVisualStudio.0VCVCRedistx64" Value="Installed" Variable="vcredist_x64" />
<PackageGroup Id="vcredist">
<ExePackage Id="vcredist_x86"
Cache="no"
Compressed="yes"
PerMachine="yes"
Permanent="yes"
Vital="yes"
Name="vcredist_x86.exe"
SourceFile="vcredist3.5_x86.exe"
InstallCommand="/q"
DetectCondition="vcredist_x86 AND (vcredist_x86 >= 1)">
</ExePackage>
</PackageGroup>
</Fragment>
</Wix>
3 ответов
<Target Name="UsesFrameworkSdk">
<GetFrameworkSdkPath>
<Output TaskParameter="Path" PropertyName="FrameworkSdkPath" />
</GetFrameworkSdkPath>
<PropertyGroup>
<Win8SDK>$(registry:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v8.0@InstallationFolder)</Win8SDK>
</PropertyGroup>
</Target>
<Target Name="UsesSignTool" DependsOnTargets="UsesFrameworkSdk">
<PropertyGroup>
<SignToolPath Condition="('@(SignToolPath)'=='') and Exists('$(FrameworkSdkPath)bin\signtool.exe')">$(FrameworkSdkPath)bin\signtool.exe</SignToolPath>
<SignToolPath Condition="('@(SignToolPath)'=='') and Exists('$(Win8SDK)\bin\x86\signtool.exe')">$(Win8SDK)\bin\x86\signtool.exe</SignToolPath>
</PropertyGroup>
</Target>
<Target Name="SignBundleEngine" DependsOnTargets="UsesSignTool">
<Exec Command=""$(SignToolPath)" sign /d "App Setup" /t http://timestamp.digicert.com /a "@(SignBundleEngine)"" />
</Target>
<Target Name="SignBundle" DependsOnTargets="UsesSignTool">
<Exec Command=""$(SignToolPath)" sign /d "App Setup" /t http://timestamp.digicert.com /a "@(SignBundle)"" />
</Target>
это хорошо работает для меня. Либо вы делаете это во время сборки, либо вам нужно использовать insignia.
Бывший:
http://wixtoolset.org/documentation/manual/v3/overview/insignia.html
insignia -ib bundle.exe -o engine.exe
... sign engine.exe
insignia -ab engine.exe bundle.exe -o bundle.exe
... sign bundle.exe
для меня с помощью встроенного инструмента WiX insignia
является наиболее прямолинейным. Вот шаги, которые я сделал, чтобы сделать код-подписать установщик Wix MSI и bootstrap:
(шаги 1 и 2 просто настроены, чтобы сделать 3 и 4 легко и более многоразовыми и обновляемыми! Шаги 3 и 4 являются фактической подписью)
- настройка
signtool
как пакетный файл на моем пути, чтобы я мог вызвать его и легко изменить. Я запускаю Windows 10 и поэтому мой " signtool.летучая мышь" выглядит это:"c:\Program Files (x86)\Windows Kits\bin\x64\signtool.exe" %*
- настройка
insignia
как пакетный файл в моем пути тоже, так что вы можете изменить его с новыми сборками WiX, как они приходят. Мои "регалии.летучая мышь" выглядит так:"C:\Program Files (x86)\WiX Toolset v3.10\bin\insignia.exe" %*
-
Подпишите мой MSI в событии после сборки (проект MSI - > свойства - > события сборки), вызвав это:
signtool sign /f "c:\certificates\mycert.pfx" /p cert-password /d "Your Installer Label" /t http://timestamp.verisign.com/scripts/timstamp.dll /v $(TargetFileName)
-
Подпишите мой пакет в событии после сборки для проекта начальной загрузки следующим образом:
CALL insignia -ib "$(TargetFileName)" -o engine.exe
CALL signtool sign /f "c:\certificates\mycert.pfx" /p cert-password /d "Installer Name" /t http://timestamp.verisign.com/scripts/timstamp.dll /v engine.exe
CALL insignia -ab engine.exe "$(TargetFileName)" -o "$(TargetFileName)"
CALL signtool sign /f "c:\certificates\mycert.pfx" /p cert-password /d "Installer Name" /t http://timestamp.verisign.com/scripts/timstamp.dll /v "$(TargetFileName)"
дополнительные заметки и мысли:
Я также подписал приложение (я думаю), просто делая
Project Properties -> Signing
и включение click-once манифестов, выбор сертификат и проверка .указание вызова необходимо в событиях после сборки при вызове пакетный файл или только первый вызывается.
далее ответ @jchoover, у вас есть 3 варианта при подписании пакетов:
создайте пакет без знака, затем подпишите его позже. Тем не менее, вам также нужно подписать движок exe, который встроен в пакет. Как утверждает @jchoover, вы можете использовать insignia, чтобы обойти это, извлекая движок в файл. Затем вы можете подписать файл с помощью обычного процесса (например, с помощью signtool.exe) и затем импортировать его обратно в бандл
добавьте цели SignBundle и SignBundleEngine в проект(ы). Вы можете сделать это, открыв их в текстовом редакторе и изменение базового кода MSBuild. ответ @jchoover описывает, как вы можете это сделать.
-
создать .целевой файл с целями SignBundle и SignBundleEngine и передача пути с помощью свойства CustomAfterWixTargets:
msbuild your.sln /p:CustomAfterWixTargets=customafterwix.targets /p:SignOutput=true