通过TFS Build 2008签署ClickOnce清单?

Pan*_*cus 6 tfs2008 code-signing visual-studio-2010 tfsbuild

我在解决如何从TFS Build中"签署我的应用程序的ClickOnce清单"时遇到了问题.

我已经在VS 2010中配置了我的签名页面,选中"签署ClickOnce清单"复选框并从文件中选择我们的代码签名密钥,如下面的屏幕截图所示:

在VS 2010中签名页面

现在,当我从VS 2010发布应用程序时,清单似乎已成功签名:

安全警告显示良好的证书

但是,当我尝试从TFS Build构建应用程序时,它似乎没有尝试签署清单.事实上,甚至没有错误消息表明某些事情失败了.

我试图设置TFSBuild.proj文件,以便我的构建服务器知道证书并且我希望签署我的清单,但我不知道该怎么做.

我尝试过以下方法:

<CustomPropertiesForBuild>SignManifests=true;ManifestCertificateThumbprint=<thumbprint goes here></CustomPropertiesForBuild>
Run Code Online (Sandbox Code Playgroud)

但它似乎没有任何区别.(也不会产生错误).

注意:我对强化命名我的程序集感兴趣; 只需签署我的代码.

有谁知道如何做到这一点?有没有人从TFS Build成功部署ClickOnce应用程序?

Mic*_*eld 6

到目前为止,我能够通过TFSBuild签署代码的唯一方法是启动命令行代码签名工具.这基本上包括三个步骤:

  1. 将证书导入构建计算机,同时以用于运行TFSBuild的任何TFSService帐户登录.一旦您导入证书,您将需要进入Cert Manager以获取它的指纹(我认为它在证书管理器UI中称为"哈希").

  2. 将目标添加到定位signtool.exe并运行它的.csproj/.wixproj/.whateverproj:

    <Target Name="SignOutput">
      <PropertyGroup>
        <WindowsSdkDir>$(Registry:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows\@CurrentInstallFolder)</WindowsSdkDir>
        <WindowsSdkDir Condition="'$(WindowsSdkDir)' != '' and !HasTrailingSlash('$(WindowsSdkDir)')">$(WindowsSdkDir)\</WindowsSdkDir>
        <SignToolPath>$(WindowsSdkDir)bin\signtool.exe</SignToolPath>
        <Hash>...</Hash>
        <TsUrl>http://timestamp.verisign.com/scripts/timstamp.dll</TsUrl>
      </PropertyGroup>
      <ItemGroup>
        <SignableFiles Include="$(TargetDir)\Setup.msi" />
        <SignableFiles Include="$(TargetDir)\Data.cab" />
      </ItemGroup>
      <ResolveKeySource CertificateThumbprint="$(Hash)">
          <Output TaskParameter="ResolvedThumbprint" PropertyName="LocatedThumbprint"/>
      </ResolveKeySource>
      <Exec Condition="'$(LocatedThumbprint)' != '' and Exists('$(SignToolPath)')" ContinueOnError="true" Command="'$(SignToolPath)' sign /q /sha1 $(LocatedThumbprint) /t $(TsUrl) '%(SignableFiles.Identity)'" />
    </Target>
    
    Run Code Online (Sandbox Code Playgroud)
  3. 在适当的时候打电话给你的新目标; 我们只签署发布版本,所以我们这样做:

    <Target Name="AfterBuild">
      <CallTarget Targets="SignOutput" Condition="'$(ConfigurationName)' == 'Release'" />
    </Target>
    
    Run Code Online (Sandbox Code Playgroud)

此方法也适用于开发人员计算机,假设他们安装了正确的SDK工具.如果他们不这样做,它将跳过签名步骤,这对我们来说运作良好.