【问题标题】:Team Foundation Server Build with password protected codesigning failsTeam Foundation Server Build 带有密码保护的代码设计失败
【发布时间】:2012-01-17 06:04:29
【问题描述】:

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

这是TFS给出的错误:

C:\WINDOWS\Microsoft.NET\Framework\v3.5\Microsoft.Common.targets(1805,7): 错误 MSB4018:“ResolveKeySource” 任务意外失败。 System.InvalidOperationException: 显示模式对话框或表单 当应用程序未运行时 UserInteractive 模式无效 手术。指定 服务通知或 DefaultDesktopOnly 样式以显示 来自服务的通知 应用。在 System.Windows.Forms.Form.ShowDialog(IWin32Window 所有者)在 System.Windows.Forms.Form.ShowDialog() 在 Microsoft.Build.Tasks.ResolveKeySource.ResolveAssemblyKey() 在 Microsoft.Build.Tasks.ResolveKeySource.Execute()

【问题讨论】:

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


    【解决方案1】:

    下面这个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. 将密钥文件从您的一个项目复制到解决方案项中,以便您可以将其用于测试运行配置

    为重新签名设置测试运行配置

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

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

    在开发者工作站上禁用强名称验证

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

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

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

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

    类型: sn -Vr *,YOUR_KEY_TOKEN

    例如:sn -Vr *,0123456789abcdef

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

    为 Team Build 安装私钥

    由于私钥 (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 使用私钥文件并禁用部分签名,我们需要在 TFSBuild.proj 中设置 CustomPropertiesForBuild 属性

    检查您的 TFSBuild.proj 构建脚本 搜索占位符属性(默认在第 130 行附近) 将其替换为以下内容: SignAssembly=true;DelaySign=false;AssemblyOriginatorKeyFile=$(MSBuildExtensionsPath)\Key.pfx 签入您的更改 排队构建 验证 Team Build 输出

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

    打开 Visual Studio 命令提示符 类型: sn.exe -vf 程序集名称.dll

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

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

    【讨论】:

    • 很好的答案,谢谢!但是在尝试手动构建项目以安装密钥时遇到了一些麻烦。我没有安装“普通”的视觉工作室,只有 tfs explorer 和 tfs build。这是否意味着我必须安装 team dev 才能构建我的项目一次?
    • 我没有收到错误。除了让 tfs 进行构建时我的问题中的 MSB4018。在构建服务器上的 Visual Studio 中打开项目后,我被卡住了。整个项目是灰色的,因为我只有在服务器上安装了构建服务的 shell。我想我在这里监督一些事情;)
    • 确实不需要在构建服务器上打开项目,因为您的 MSBuild 脚本会进行构建?
    • 已修复...必须从命令行运行 MSBuild ;) 默认情况下,MSBuild 存储在 c:\windows\Microsoft.NET\FrameWork\v3.5 中,必须进行搜索。从构建脚本所在的 \TeamBuildTypes\CI 目录中获得了整个搜索结果,并且只运行了没有任何参数的 MSBuild。再次感谢!
    • 如果您使用 Visual Studio Online(微软托管的 TFS 解决方案)怎么办?您无法访问可以登录的构建机器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-18
    • 1970-01-01
    • 1970-01-01
    • 2018-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多