Как найти Wix Remotepayload's CertificatePublicKey hash
Я пытаюсь разрешить хэши Wix RemotePayload, но я не уверен, как CertificatePublicKey
атрибут найден.
возьмите, например, определение пакета .NET 4.0 из источников WiX 3.6:
<Fragment>
<util:RegistrySearchRef Id="NETFRAMEWORK40"/>
<WixVariable Id="WixMbaPrereqPackageId" Value="NetFx40Redist" />
<WixVariable Id="WixMbaPrereqLicenseUrl" Value="$(var.NetFx40EulaLink)" />
<PackageGroup Id="NetFx40Redist">
<ExePackage
InstallCommand="/q /norestart /ChainingPackage "[WixBundleName]""
RepairCommand="/q /norestart /repair /ChainingPackage "[WixBundleName]""
UninstallCommand="/uninstall /q /norestart /ChainingPackage "[WixBundleName]""
PerMachine="yes"
DetectCondition="NETFRAMEWORK40"
Id="NetFx40Redist"
Vital="yes"
Permanent="yes"
Protocol="netfx4"
DownloadUrl="$(var.NetFx40RedistLink)"
Compressed="no"
Name="redistdotNetFx40_Full_x86_x64.exe">
<RemotePayload
Size="50449456"
Version="4.0.30319.1"
ProductName="Microsoft .NET Framework 4"
Description="Microsoft .NET Framework 4 Setup"
CertificatePublicKey="672605E36DD71EC6B8325B91C5FE6971390CB6B6"
CertificateThumbprint="9617094A1CFB59AE7C1F7DFDB6739E4E7C40508F"
Hash="58DA3D74DB353AAD03588CBB5CEA8234166D8B99"/>
</ExePackage>
</PackageGroup>
</Fragment>
С wix36-sourcessrcextNetFxExtensionwixlibNetFx4.wxs
Я могу найти sha1 Hash
С fciv -sha1 dotNetFx40_Full_x86_x64.exe
...
58da3d74db353aad03588cbb5cea8234166d8b99 dotnetfx40_full_x86_x64.exe
Я могу найти соответствующий CertificateThumbprint
легко через диалоговое окно свойств для файла или с помощью signtool
, который отображает следующий вывод
C:redist>signtool verify /v /ph dotNetFx40_Full_x86_x64.exe
Verifying: dotNetFx40_Full_x86_x64.exe
Signature Index: 0 (Primary Signature)
Hash of file (sha1): 8E8582D10521962F45F33935C38A2412C4F2D4C7
Signing Certificate Chain:
Issued to: Microsoft Root Authority
Issued by: Microsoft Root Authority
Expires: Thu Dec 31 03:00:00 2020
SHA1 hash: A43489159A520F0D93D032CCAF37E7FE20A8B419
Issued to: Microsoft Code Signing PCA
Issued by: Microsoft Root Authority
Expires: Sat Aug 25 03:00:00 2012
SHA1 hash: 3036E3B25B88A55B86FC90E6E9EAAD5081445166
Issued to: Microsoft Corporation
Issued by: Microsoft Code Signing PCA
Expires: Mon Mar 07 18:40:29 2011
SHA1 hash: 9617094A1CFB59AE7C1F7DFDB6739E4E7C40508F
The signature is timestamped: Thu Mar 18 21:13:46 2010
Timestamp Verified by:
Issued to: Microsoft Root Authority
Issued by: Microsoft Root Authority
Expires: Thu Dec 31 03:00:00 2020
SHA1 hash: A43489159A520F0D93D032CCAF37E7FE20A8B419
Issued to: Microsoft Timestamping PCA
Issued by: Microsoft Root Authority
Expires: Sun Sep 15 03:00:00 2019
SHA1 hash: 3EA99A60058275E0ED83B892A909449F8C33B245
Issued to: Microsoft Time-Stamp Service
Issued by: Microsoft Timestamping PCA
Expires: Thu Jul 25 15:11:15 2013
SHA1 hash: 4D6F357F0E6434DA97B1AFC540FB6FDD0E85A89F
SignTool Error: The signing certificate is not valid for the requested usage.
This error sometimes means that you are using the wrong verification
policy. Consider using the /pa option.
Number of files successfully Verified: 0
Number of warnings: 0
Number of errors: 1
какой инструмент может предоставить хэш для CertificatePublicKey
?
edit: не используя тепло, я хочу понять, откуда взялись хеши.
edit: Я знаю, как это делается в исходном коде WiX, и что я могу выполнитьheat payload file -out file.wxs
, но я ищу какой-то внешний инструмент, который может обеспечить ожидаемый хэш(ы) без использования тепла. На самом деле это только для того, чтобы удовлетворить мое любопытство.
2 ответов
если вы посмотрите на исходный код инструмента тепла он использует Microsoft.Tools.WindowsInstallerXml.Cab.Interop.NativeMethods.HashPublicKeyInfo
функция для генерации CertificatePublicKey
.
byte[] publicKeyIdentifierHash = new byte[128];
uint publicKeyIdentifierHashSize = (uint)publicKeyIdentifierHash.Length;
Microsoft.Tools.WindowsInstallerXml.Cab.Interop.NativeMethods.HashPublicKeyInfo(
certificate.Handle,
publicKeyIdentifierHash,
ref publicKeyIdentifierHashSize);
StringBuilder sb = new StringBuilder(((int)publicKeyIdentifierHashSize + 1) * 2);
for (int i = 0; i < publicKeyIdentifierHashSize; ++i)
{
sb.AppendFormat("{0:X2}", publicKeyIdentifierHash[i]);
}
this.PublicKey = sb.ToString();
вы, очевидно, можете использовать этот код для создания отпечатка пальца или в соответствии со страницей wiki на отпечатки пальцев открытого ключа вы также можете использовать командную строку
ssh-keygen -lf /path/to/key.pub
проблема заключается в создании файла ssh-keygen pub, который соответствует RFC4716 из сертификата, и вот где я был ковылявший.
лично я просто использую командную строку heat:
heat.exe payload PATH_TO_FILE -o Output.wxs
и не беспокоиться о том, что он на самом деле делает, как это работает!! :)
вы можете найти всю информацию о подписи в диалоговом окне свойств файла:
в диалоговом окне свойств файла перейдите на вкладку подписи.
нажмите "подробности", затем нажмите "Просмотреть сертификат".
свойства, такие как "открытый ключ", можно найти на вкладке "подробности".
-
если вам нужен хэш этого открытого ключа, то вы можете использовать свой стандарт инструменты хэширования, чтобы получить его с помощью кнопки "копировать в файл" и хэширования этого файла.Я ошибся, "копировать в файл" не экспортирует выбранное свойство, а вместо этого весь сертификат. Вы можете скопировать и вставить это значение в хэш-программы и HEX-редактор, чтобы получить хэш.