【问题标题】:Signing a ClickOnce manifest through TFS Build 2008?通过 TFS Build 2008 签署 ClickOnce 清单?
【发布时间】:2011-08-28 22:09:33
【问题描述】:

我在弄清楚如何从 TFS Build 中为我的应用程序“签署 ClickOnce 清单”时遇到问题。

我在 VS 2010 中配置了我的签名页面,方法是选中“签署 ClickOnce 清单”复选框并从文件中选择我们的代码签名密钥,如下图所示:

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

但是,当我尝试从 TFS Build 构建应用程序时,它似乎没有尝试对清单进行签名。事实上,甚至没有错误信息表明某事失败了。

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

我尝试了以下方法:

<CustomPropertiesForBuild>SignManifests=true;ManifestCertificateThumbprint=<thumbprint goes here></CustomPropertiesForBuild>

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

注意:对强命名我的程序集感兴趣;只是signing my code

有人知道怎么做吗?有没有人从 TFS Build 成功部署 ClickOnce 应用程序?

【问题讨论】:

    标签: visual-studio-2010 code-signing tfsbuild


    【解决方案1】:

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

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

    2. 将 Target 添加到您的 .csproj/.wixproj/.whateverproj 中,以定位 signtool.exe 并运行它:

      <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>
      
    3. 在适当的时候给你的新目标打电话;我们只签署发布版本,所以我们这样做:

      <Target Name="AfterBuild">
        <CallTarget Targets="SignOutput" Condition="'$(ConfigurationName)' == 'Release'" />
      </Target>
      

    此方法也适用于开发人员机器,前提是它们安装了正确的 SDK 工具。如果他们不这样做,它将跳过签名步骤,这对我们来说效果很好。

    【讨论】:

    • 谢谢!但我很困惑——有没有像“SignOutput”这样的目标?当我将上述 XML 添加到我的 .csproj 文件时,它似乎不会导致构建过程有所不同。
    【解决方案2】:

    我已经为一些客户完成了这项工作,我在其中创建了一个 MSBuild 通用“执行 Powershell”任务 - 然后通过 TFS Build 2008 调用的 Powershell 脚本完成了类似这样的繁重工作。

    【讨论】:

      猜你喜欢
      • 2010-10-21
      • 2010-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-25
      • 1970-01-01
      • 2016-04-10
      相关资源
      最近更新 更多