使用密码保护的代码签名的Team Foundation Server Build失败

时间:2009-06-29 07:31:36

标签: tfs build continuous-integration code-signing delay-sign

我正在尝试在TFS 2008上设置持续集成构建。在我要构建的项目中,我使用密钥进行签名。此密钥使用密码。我无法构建它,因为在构建期间TFS想要显示一个无法显示的对话框。我想我需要在服务器上手动构建项目,但只有TFS资源管​​理器和构建部件安装在服务器上。关于如何让我的项目正确构建的任何建议?

这是TFS给出的错误:

  

C:\ Windows \ Microsoft.NET \框架\ v3.5版本\ Microsoft.Common.targets(1805,7):   错误MSB4018:“ResolveKeySource”   任务意外失败。   System.InvalidOperationException:   显示模式对话框或表单   当应用程序没有运行时   UserInteractive模式无效   操作。指定   ServiceNotification或   DefaultDesktopOnly样式显示一个   来自服务的通知   应用。在   System.Windows.Forms.Form.ShowDialog(IWin32Window   老板)   System.Windows.Forms.Form.ShowDialog()   在   Microsoft.Build.Tasks.ResolveKeySource.ResolveAssemblyKey()   在   Microsoft.Build.Tasks.ResolveKeySource.Execute()

1 个答案:

答案 0 :(得分:34)

以下blog post详细说明了具体步骤

设置密钥文件

使用项目属性中的Visual Studio“签名”选项卡创建受密码保护的私钥/公钥对(KeyPair.pfx) 从密钥对中提取公钥并将其复制到单独的文件(Key.snk) sn.exe -p KeyPair.pfx Key.snk

将KeyPair.pfx复制到构建服务器。我使用C:\ Program Files \ MSBuild \ KeyFile.pfx,因为它可以被$(MSBuildExtensionsPath)MSBuild属性访问。 将KeyPair.pfx文件移动到安全&安全的位置。保密也是密码。 将Key.snk复制到开发人员可以访问它的共享位置。 设置签名项目

对于您要签名的每个装配体:

  1. 打开项目属性|签署页面
  2. 选择[X]签署程序集复选框。
  3. 选择[X]延迟信号复选框。
  4. 从密钥文件下拉列表中选择。
  5. 浏览到共享位置并选择Key.snk文件
  6. snk文件将被复制到您为其分配的每个项目目录
  7. 将您的某个项目中的密钥文件复制到解决方案项目中,以便将其用于测试运行配置
  8. 设置测试运行配置以重新签名

    如果要检测程序集并为单元测试启用代码覆盖率,则需要指定用于重新签名的密钥文件。

    打开LocalTestRun.testrunco​​nfig文件 在“代码覆盖率”选项卡上,选择密钥作为“重新签名密钥文件”

    禁用开发人员工作站上的强名称验证

    由于您只使用公钥进行延迟签名,因此.NET CLR程序集验证将失败并在本地构建程序集。验证失败后,您将无法运行或调试程序集。

    要在开发过程中克服这个问题,您需要对本地构建的程序集禁用强名称验证,并使用公钥进行延迟签名。

    打开Visual Studio命令提示符 类型: sn.exe -tp Key.snk

    这将输出一些数据,包括令牌。

    类型: sn -Vr *,YOUR_KEY_TOKEN

    示例:sn -Vr *,0123456789abcdef

    这将禁用使用您的公钥签名的所有程序集的强名称验证。 您可以列出强名称验证的当前设置: sn -Vl

    为团队构建安装私钥

    由于私钥(Key.pfx)受密码保护 - Team Build无法访问它。感谢Nagaraju Palla’s Blog: Using Password Protected Signing Keys in Team Build,我们有了解决方案。

    以构建服务帐户登录Team Build服务器 在Visual Studio中打开项目 在Visual Studio中构建项目 系统将提示您输入私钥文件的密码。 输入密码 关闭Visual Studio&注销 私钥文件现在安装在构建服务帐户的本地证书存储中,Team Build可以访问它而无需再次提示输入密码。此证书存储与构建服务帐户的密码一样安全。 (提示:使其与密钥文件的密码一样强大)

    更新TFSBuild.proj构建脚本

    Team Build可以访问私钥文件和密码。这允许它对组件进行完全签名。

    要覆盖项目设置并指示Team Build使用私钥文件并禁用部分签名,我们需要在T​​FSBuild.proj中设置CustomPropertiesForBuild属性

    签出您的TFSBuild.proj构建脚本 搜索占位符属性(默认情况下靠近第130行) 将其替换为以下内容:   SignAssembly = TRUE; DelaySign = FALSE; AssemblyOriginatorKeyFile = $(MSBuildExtensionsPath)\ Key.pfx 签入您的更改 排队构建 验证团队构建输出

    要检查Team Build是否正确地命名了程序集,可以使用sn.exe实用程序验证强名称签名。

    打开Visual Studio命令提示符 类型: sn.exe -vf assemblyname.dll

    您还可以同时验证所有程序集:

    打开Visual Studio命令提示符 类型: FOR%a(* .dll)DO sn.exe -vf%a