11

実行可能ファイルに署名するために使用するAuthenticode証明書(.pfx)があります。

プロジェクトのビルド中にすべての実行可能ファイル(.exe、.dll、...)に自動的に署名するようにTeam Buildを構成するにはどうすればよいですか?

4

4 に答える 4

17

使用する方法は次のとおりです。

  1. WiX プロジェクトをアンロードし、[編集] を選択します。

  2. 一番下までスクロールすると、<Import Project="$(WixTargetsPath)" />

  3. そのすぐ上に新しい行を追加し<Import Project="ProjectName.custom.targets" /> ます。命名規則「ProjectName.custom.targets」を使用しますが、ファイルには任意の名前を付けることができます。

  4. ProjectName.custom.Targets という名前の新しい XML ファイルを作成し、次のコードを配置します。

    <?xml version="1.0" encoding="utf-8"?>
    <Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
      <PropertyGroup>
        <!-- replace the contents of this with your private test authenticode certificate -->
        <AuthenticodeCertFile Condition="'$(AuthenticodeCertFile)' == ''">$(MSBuildProjectDirectory)\AuthenticodeTest.pfx</AuthenticodeCertFile>
      </PropertyGroup>
    
      <!-- this gets the path to signtool.exe and places it in the _SignToolSdkPath property -->
      <Target Name="_GetSignToolPath">
        <GetFrameworkSdkPath>
          <Output TaskParameter="Path" PropertyName="_SignToolSdkPath" />
        </GetFrameworkSdkPath>
        <PropertyGroup>
          <_SignToolPath>$(_SignToolSdkPath)bin\signtool.exe</_SignToolPath>
        </PropertyGroup>
      </Target>
    
      <!-- This gets a list of all of the "referenced" assembies used by the installer project --> 
      <!-- Unfortunately, I cheated and used an "internal" item list - you could replace this with each specific assembly but it gets complicated if your build output is redirected -->
      <Target Name="_GetSourceAssembliesToSign" DependsOnTargets="ResolveReferences">
        <!-- Kludge - not supposed to target internal items, but there are no other options -->
        <CreateItem Include="@(_ResolvedProjectReferencePaths)">
          <Output ItemName="_SourceAssemblyToSign" TaskParameter="Include" />
        </CreateItem>
      </Target>
    
      <!-- This signs the assemblies in the @(_SourceAssemblyToSign) item group -->
      <!-- Note that it only executes when build output is redirected ie/ on TFS Build or when OutDir is changed -->  
      <!-- Authenticode timestamp is optional - doesn't make sense to timestamp the test certificate -->
      <Target Name="_AuthenticodeSignSourceAssemblies" AfterTargets="BeforeBuild" DependsOnTargets="_GetSignToolPath;_GetSourceAssembliesToSign" Condition="'$(AuthenticodeCertFile)' != '' and '$(OutDir)' != '$(OutputPath)'">
        <Exec Command="&quot;$(_SignToolPath)&quot; sign /f &quot;$(AuthenticodeCertFile)&quot; /p &quot;$(AuthenticodePassword)&quot; /t $(AuthenticodeTimestamp) /v &quot;%(_SourceAssemblyToSign.Identity)&quot;" Condition="'$(AuthenticodeTimestamp)' != ''" />
        <Exec Command="&quot;$(_SignToolPath)&quot; sign /f &quot;$(AuthenticodeCertFile)&quot; /p &quot;$(AuthenticodePassword)&quot; /v &quot;%(_SourceAssemblyToSign.Identity)&quot;" Condition="'$(AuthenticodeTimestamp)' == ''" />
      </Target>
    
      <!-- This signs the MSI file itself -->
      <!-- Note that additional changes may be needed if your CAB files are separate - those would need to be signed as well -->
      <!-- Note that it only executes when build output is redirected ie/ on TFS Build or when OutDir is changed -->  
      <Target Name="_AuthenticodeSignMsi" AfterTargets="SignMsi" DependsOnTargets="_GetSignToolPath" Condition="'$(AuthenticodeCertFile)' != '' and '$(OutDir)' != '$(OutputPath)'">
        <PropertyGroup>
          <_MsiFileToSign>$(TargetDir)%(CultureGroup.OutputFolder)$(TargetName)$(TargetExt)        </_MsiFileToSign>
        </PropertyGroup>
    
        <Exec Command="&quot;$(_SignToolPath)&quot; sign /f &quot;$(AuthenticodeCertFile)&quot; /p &quot;$(AuthenticodePassword)&quot; /t $(AuthenticodeTimestamp) /v &quot;$(_MsiFileToSign)&quot;" Condition="'$(AuthenticodeTimestamp)' != ''" />
        <Exec Command="&quot;$(_SignToolPath)&quot; sign /f &quot;$(AuthenticodeCertFile)&quot; /p &quot;$(AuthenticodePassword)&quot; /v &quot;$(_MsiFileToSign)&quot;" Condition="'$(AuthenticodeTimestamp)' == ''" />
      </Target>
    </Project>
    

テスト用の Authenticode 証明書 (AuthenticodeTest.pfx という名前を付けました) を作成し、ソース管理に配置します。パスは AuthenticodeCertFile プロパティに設定されています。テストするには、コマンド ラインで msbuild を実行し、OutDir プロパティを変更します - ie/ msbuild Test.sln /p:OutDir=C:\Test

次の場合、いくつかのカスタマイズが必要になります。

  • 「非公開」アイテムグループを使いたくない場合(騙されました)
  • WiX プロジェクト参照を使用しない場合
  • cab ファイルが MSI とは別のものである場合は、それらも署名する必要があります。

最終ビルドを実行するには、TFS で [Queue New Build] を選択します。[パラメータ] をクリックし、[詳細設定] を展開します。「MSBuild 引数」の下に を追加し/p:AuthenticodeCertFile=ProductionCertFile.pfx /p:AuthenticodePassword=Secretます。これは完全に安全ではない可能性があることに注意してください。ビルド エージェントがチェックインせずに PFX ファイルを見つけるのは難しい場合があり、パスワードがビルド出力に記録される可能性があります。別の方法として、このために特別なロックダウン ビルド エージェントを作成するか、コマンド ラインでビルドをローカルで実行することもできますが、明らかに「クリーン ルーム」環境にはなりません。その目的のために特別にロックダウンされた「クリーンな」サーバーを作成する価値があるかもしれません。

于 2011-06-07T15:26:05.653 に答える
3

同意しません。署名を実行するには、コード署名証明書をビルド コンピューターにインストールする必要があるため、ビルドするたびに、そのコンピューター上でビルドされるすべてのものに署名してみませんか? コード署名証明書がインストールされているため、コンピューターは「危険にさらされている」ため、何らかの方法 (物理的なセキュリティとシステムのセキュリティ) で保護する必要があります。ファイルが保護されている場合は、意図したとおりの作業を実行させて、配信用のファイルを常に一貫して繰り返し準備してみませんか?

残念ながら、MSBuild では、リスト内の各ファイル名に対してプログラムを 1 回呼び出して、ファイル名のリストをループするサポートをほとんど提供していないように見えるため、「しない」という答えも Microsoft の標準的な答えのようです。ワイルドカードで生成されたファイルのリストを Signtool.exe プログラムに渡す方法を見つけましたが、一度に 1 つのファイルしか処理できません。

引数をループし、引数ごとに signtool を呼び出すバッチ ファイルの作成に戻ってしまうのではないかと (私にとっては) 恐れています。ビルド出力に署名するという一般的なタスクのためにバッチ ファイルを作成すると、MSBuild は本来あるべきほど成熟したビルド システムではないと思います。それか、signtool のインターフェースが間違っています。いずれの場合も、署名するすべてのファイルの名前を列挙せずに複数のファイルに署名することは、MSBuild では "うまくいかない" ように見えます。

于 2009-10-29T23:55:55.260 に答える
-5

しないでください。

ビルドに自動的に署名したくありません。とにかく、ほとんどのビルドは署名を必要としません。テストの自動化にのみ使用されます。一部のビルドは、社内のテスターに​​渡される場合があります。ただし、Authenticode 署名が必要なのは、実際に組織外にリリースするビルドだけです。

その場合は、とにかく署名した後に手動で検証する必要があります。そのため、手動で署名しても、リリース プロセスに余分な手動の手順が挿入されることはなく、自動化してもほとんど時間が節約されません。代わりに、組織内に出回っている署名済みファイルがはるかに少なくなり、署名済みファイルについてより強力な保証を行うことができます。

于 2009-08-28T14:57:15.513 に答える