encabezado - WiX: proyecto de inicio de sesión digital de BootStrapper
meta tags wix (3)
Tengo un proyecto para el cual he creado un archivo WiX msi. También tengo WiX bootstrapper (archivo exe) que comprueba la existencia de C ++ 2005, lo instala si no se encuentra y luego instala el paquete msi. Mi proyecto incluye Crystal Reports como un archivo msm que se instala con el msi pero requiere que C ++ 2005 se instale correctamente.
En el proyecto MSI, incluí el siguiente evento de compilación posterior para firmar digitalmente el archivo msi.
sign /f "$(ProjectDir)/myPFXFile.pfx" /p mySecretKey/d "My Program" /t http://timestamp.verisign.com/scripts/timstamp.dll /v "MyProgram.msi"
Si instalo solo el msi, identifica correctamente al publicador cuando solicita un permiso elevado para la instalación.
Intenté agregar el mismo evento post-build al proyecto bootstrapper de la siguiente manera:
sign /f "$(ProjectDir)/myPFXFile.pfx" /p mySecretKey/d "My Program" /t http://timestamp.verisign.com/scripts/timstamp.dll /v "MyProgram Setup.exe"
Cuando intento instalar el archivo exe, identifica correctamente el publicador pero luego no se puede instalar con el siguiente archivo de registro:
[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}/.be/MyProgram Setup.exe'' to: ''C:/ProgramData/Package 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:/ProgramData/Package Cache/{6ab8eece-89c6-4417-905f-6d9c5136519d}/
[1604:2574][2013-12-04T11:50:00]i399: Apply complete, result: 0x80004005, restart: None, ba requested restart: No
Luego encontré otra alternativa para firmar el exe agregando lo siguiente al final del archivo .wixproj:
<Target Name="SignBundleEngine">
<Exec Command=""C:/Program Files (x86)/Microsoft SDKs/Windows/v7.0A/bin/signtool.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 SDKs/Windows/v7.0A/bin/signtool.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 SDKs/Windows/v7.1A/Bin/signtool.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>
Al usar este método, el archivo de instalación se ejecuta e instala todo correctamente, pero no identifica al editor cuando solicita un permiso elevado para instalar, dice "Editor: Desconocido".
¿Alguien sabe cómo hacer que la firma digital funcione en este programa de arranque?
Aquí están mis archivos Bundle.wxs y vcredist.wxs:
Bundle.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="Resources/program.ico">
<BootstrapperApplicationRef Id="WixStandardBootstrapperApplication.HyperlinkLicense">
<Payload SourceFile="Resources/Bootstrapper Screen.png" />
</BootstrapperApplicationRef>
<WixVariable Id="WixStdbaLicenseUrl" Value=""/>
<WixVariable Id="WixStdbaThemeXml" Value="Resources/CustomHyperlinkTheme.xml"/>
<WixVariable Id="WixStdbaThemeWxl" Value="Resources/CustomHyperlinkTheme.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="SOFTWARE/Microsoft/VisualStudio/10.0/VC/VCRedist/x86" Value="Installed" Variable="vcredist_x86" />
<util:RegistrySearch Root="HKLM" Key="SOFTWARE/Microsoft/VisualStudio/10.0/VC/VCRedist/x64" 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>
La respuesta de @ jchoover adicional, tiene 3 opciones al firmar paquetes:
Construya el paquete sin firmar, luego, fírmelo más tarde. Sin embargo, también debe firmar el motor exe que está incrustado en el paquete. Como dice @jchoover, puede usar una insignia para evitar esto extrayendo el motor de un archivo. A continuación, puede firmar el archivo con su proceso normal (por ejemplo, con signtool.exe) y luego importarlo de nuevo en el paquete
Agregue los objetivos SignBundle y SignBundleEngine a su (s) proyecto (s). Puede hacerlo abriendo en un editor de texto y editando el código subyacente de MSBuild. La respuesta de @jchoover describe cómo puedes hacer esto.
Cree un archivo .targets con los objetivos SignBundle y SignBundleEngine, y pase la ruta utilizando la propiedad CustomAfterWixTargets:
msbuild your.sln /p:CustomAfterWixTargets=customafterwix.targets /p:SignOutput=true
<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>
Esto funciona bien para mi. O lo haces durante la construcción, o necesitas usar una insignia.
Ejemplo: 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
Para mí, usar la insignia
herramienta incorporada de WiX es la más directa. Aquí están los pasos que hice para hacer un código de firma de un instalador de WiX MSI e bootstrap:
(los pasos 1 y 2 están configurados para que la lectura 3 y 4 sea más fácil y más reutilizable y actualizable. Los pasos 3 y 4 son la firma real)
- Configure el
signtool
como un archivo por lotes en mi RUTA para que pueda llamarlo y cambiarlo fácilmente. Estoy ejecutando Windows 10 y mi "signtool.bat" se ve así:
"c:/Program Files (x86)/Windows Kits/10/bin/x64/signtool.exe" %*
- También configuro
insignia
como un archivo por lotes en mi PATH para que pueda cambiarlas con las nuevas compilaciones de WiX a medida que vayan apareciendo. Mi "insignia.bat" se ve así:
"C:/Program Files (x86)/WiX Toolset v3.10/bin/insignia.exe" %*
- Firme mi MSI en un evento posterior a la construcción (Proyecto MSI -> Propiedades -> Eventos de compilación) llamando a esto:
signtool sign /f "c:/certificates/mycert.pfx" /p cert-password /d "Your Installer Label" /t http://timestamp.verisign.com/scripts/timstamp.dll /v $(TargetFileName)
Firme mi paquete en un evento posterior a la construcción para el proyecto de arranque de la siguiente manera:
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)"
Notas y pensamientos adicionales:
También he firmado la aplicación (creo) simplemente haciendo
Project Properties -> Signing
y habilitando manifiestos de hacer clic una vez, seleccionando el certificado y marcando la opciónSign the assembly
.La especificación de CALL es necesaria en eventos posteriores a la creación cuando se llama a un archivo por lotes o solo se llama al primero.