2012-09-18 34 views
6

我正在嘗試解析WiX RemotePayload散列,但我不確定CertificatePublicKey屬性是如何找到的。如何查找WiX RemotePayload的CertificatePublicKey散列

舉個例子來說,在.NET 4.0包從維克斯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="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來源的\ src \分機\ NetFxExtension \ wixlib \ NetFx4.wxs

我可以找到SHA1 Hashfciv -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,但我在尋找一些外部工具,它可以提供期望的散列(ES),而不使用熱。這只是爲了滿足我的好奇心。

+0

上面的CertificateThumbprint在哪裏? – DaveO

+0

@DaveO它是簽名證書鏈的最後一個SHA1哈希。 –

回答

7

如果你看看加熱工具的源代碼,它使用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(); 

可以明顯地使用此代碼來生成對Public Key fingerprints指紋或根據維基頁面,您還可以使用命令行

ssh-keygen -lf /path/to/key.pub 

問題是生成SSH-凱基酒館文件符合規定與RFC4716從證書,這是我被難倒的地方。

個人而言,我只是用熱命令行:

heat.exe payload PATH_TO_FILE -o Output.wxs 

,而不用擔心實際上做它是什麼,它的作品! :)

+0

現在我正在使用'heat',但是我正在尋找一種從WiX本身獲取'CertificatePublicKey'的方法。另外,'ssh-keygen'將會生成一個PublicKey,但我想從一個Authenticode簽名的可執行文件中找到一個**讀取** PublicKey的方法,其方式與''NativeMethods' heat'。 –

+0

我已經接受了您的答案,因爲您發佈了WiX使用的代碼。我仍然無法找到任何工具,除了散熱之外,這就是我一直在尋找的。由於看起來沒有這樣的外部應用程序,所以你的答案就像它得到的那樣好。 –

+0

'heat.exe有效載荷PATH_TO_FILE -o Output.wxs'是金童,在這裏。非常感謝你! –

1

你可以找到所有你在文件屬性對話框的簽名信息:

  1. 在文件屬性對話框中,單擊簽名選項卡。 File properties

  2. 點擊詳情,然後點擊'查看證書'。 View Certificate

  3. 像'公鑰'這樣的屬性可以在'Details'選項卡上找到。 Certificate Details

  4. 如果需要此公鑰的哈希值,那麼你可以使用你的標準哈希工具使用「複製到文件」按鈕和散列該文件得到它。

    我錯了,'複製到文件'不會導出選定的屬性,而是導出整個證書。您可以將該值複製並粘貼到散列程序或十六進制編輯器中,以獲得散列值。

+0

您在這裏提供的內容沒有提供比我在問題中已經顯示的更多細節。最後一步將獲得證書文件的SHA1哈希值,而不是公鑰本身。我也遇到過很多選項[這裏](http://www.openssl.org/docs/apps/x509.html),但似乎無法找到生成'672605E36DD71EC6B8325B91C5FE6971390CB6B6'的正確選項,這就是我正在尋找。 –

+0

@JimSchubert,你是對的。我認爲這只是公鑰的散列,但事實並非如此。我相信這是來自['CryptHashPublicKeyInfo'](http://msdn.microsoft.com/en-us/library/windows/desktop/aa380204 \(v = vs.85 \).aspx)的散列,它包含一個ID對於鍵的類型。 –

+0

謝謝。 WiX是開源的,所以我可以把代碼(caveman_dick發佈的)和編寫一個實用程序。我真的更感興趣的是如何通過'heat'之外的一些外部工具來獲得這個散列,這個'heat'用所需的散列來產生有效載荷。這更多的是學術好奇心(也許還有我團隊其他開發者的文檔)。 –