11

WiX RemotePayloadハッシュを解決しようとしていますが、CertificatePublicKey属性がどのように検出されるかわかりません。

たとえば、WiX3.6ソースからの.NET4.0パッケージ定義を取り上げます。

  <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="redist\dotNetFx40_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から-sources\src \ ext \ NetFxExtension \ wixlib \ NetFx4.wxs

Hash私はsha1を見つけることができます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か?

編集:熱を使わずに、ハッシュがどこから来ているのかを理解したいと思います。

編集:これがWiXソースコードでどのように行われ、実行できるかは知って
heat payload file -out file.wxsいますが、熱を使用せずに期待されるハッシュを提供できる外部ツールを探しています。これは本当に私の好奇心を満足させるためだけのものです。

4

2 に答える 2

17

ヒートツールのソースコードを見ると、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

問題は、証明書からRFC4716に準拠するssh-keygen pubファイルを生成することであり、これが私が困惑した場所です。

個人的には、heatコマンドラインを使用します。

heat.exe payload PATH_TO_FILE -o Output.wxs

それが機能するので、それが実際に何をしているのか心配する必要はありません!! :)

于 2012-09-19T10:15:22.547 に答える
1

署名に関するすべての情報は、ファイルのプロパティダイアログにあります。

  1. [ファイルのプロパティ]ダイアログで、[署名]タブをクリックします。 ファイルのプロパティ

  2. [詳細]をクリックし、[証明書の表示]をクリックします。 ビューの証明書

  3. 「公開鍵」などのプロパティは、「詳細」タブにあります。 証明書の詳細

  4. この公開鍵のハッシュが必要な場合は、標準のハッシュツールを使用して、[ファイルにコピー]ボタンを使用し、そのファイルをハッシュすることで取得できます。

    私は間違っていました。「ファイルにコピー」は選択したプロパティをエクスポートせず、代わりに証明書全体をエクスポートします。ただし、この値をコピーしてハッシュプログラムまたは16進エディタに貼り付けると、ハッシュを取得できます。

于 2012-10-08T17:08:37.803 に答える