visual-studio-2010 - 通过 TFS Build 2008 签署 ClickOnce list ?

标签 visual-studio-2010 code-signing tfsbuild

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

我通过选中“签署 ClickOnce list ”复选框并从文件中选择我们的代码签名 key ,在 VS 2010 中配置了我的签名页面,如下面的屏幕截图所示:

Signing page in VS 2010

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

security warning showing good certificate

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

我试图设置 TFSBuild.proj 文件,以便我的构建服务器知道证书并且我希望签署我的 list ,但我不知道如何做到这一点。

我尝试了以下方法:

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

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

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

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

最佳答案

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

  • 将证书导入到构建机器上,同时以用于运行 TFSBuild 的任何 TFSService 帐户登录。导入证书后,您需要进入证书管理器以获取其指纹(我认为它在证书管理器 UI 中称为“哈希”)。
  • 将目标添加到您的 .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>
    
  • 在适当的时候调用你的新目标;我们只签署发布版本,所以我们这样做:
    <Target Name="AfterBuild">
      <CallTarget Targets="SignOutput" Condition="'$(ConfigurationName)' == 'Release'" />
    </Target>
    

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

    关于visual-studio-2010 - 通过 TFS Build 2008 签署 ClickOnce list ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6059797/

    相关文章:

    android - 无法签署黑莓 android 应用程序 : Server response did not contain version

    excel - 如何从 Excel 2016 签署带有时间戳的 XLA?

    c# - 在 C# 应用程序中从 Azure DevOps 获取构建测试结果

    reporting - 代理的 TFS 构建持续时间报告

    c++ - 错误 C4430 : missing type specifier

    c++ - Wheb Build pcl with visual studio 2010 我得到 point_types.hpp(1185) : error C2146: syntax error : missing ';' before identifier 'traits'

    c++ - 未解析的符号:sql::mysql::get_driver_instance(void)

    c++ - Intellisense 说错误 : member "Class::field" is inaccessible but it's still works? 为什么?

    macos - Codesign 说 "no identity found"但是身份在钥匙串(keychain)上

    command-line - 如何从命令行更新项目中的单个 nuget 包?