Как найти 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 &quot;[WixBundleName]&quot;"
          RepairCommand="/q /norestart /repair /ChainingPackage &quot;[WixBundleName]&quot;"
          UninstallCommand="/uninstall /q /norestart /ChainingPackage &quot;[WixBundleName]&quot;"
          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

и не беспокоиться о том, что он на самом деле делает, как это работает!! :)


вы можете найти всю информацию о подписи в диалоговом окне свойств файла:

  1. в диалоговом окне свойств файла перейдите на вкладку подписи. File properties

  2. нажмите "подробности", затем нажмите "Просмотреть сертификат". View Certificate

  3. свойства, такие как "открытый ключ", можно найти на вкладке "подробности". Certificate Details

  4. если вам нужен хэш этого открытого ключа, то вы можете использовать свой стандарт инструменты хэширования, чтобы получить его с помощью кнопки "копировать в файл" и хэширования этого файла.

    Я ошибся, "копировать в файл" не экспортирует выбранное свойство, а вместо этого весь сертификат. Вы можете скопировать и вставить это значение в хэш-программы и HEX-редактор, чтобы получить хэш.