如何手动为MSBuild登录目标设置密码?

ale*_*imi 5 c# msbuild pfx outlook-addin

我们正在用C#构建一个Outlook插件。它在VS中构建时没有问题,并使用临时pfx证书签名。我们希望将构建过程放在Jenkins中,并使其自动运行。

我们试图通过MSBuild运行VS解决方案。它在开发机器上很好用,但是在詹金斯(Jenkins)中有一个错误:

无法导入以下密钥文件:OutlookPlugin_TemporaryKey.pfx。密钥文件可能受密码保护。若要更正此问题,请尝试再次导入证书或使用以下密钥容器名称将证书手动安装到“强名称” CSP:VS_KEY_A688DC31A30F3EF1

我们不知道如何为自动构建指定pfx密码。或者以其他方式使签名过程自动化。

我们发现的一种解决方案是,以与自动过程相同的用户和同一用户的方式在VS中打开该项目,然后键入密码。这行不通,可能是因为詹金斯(Jenkins)每次都消灭了工作区。如果我们尝试不签名就进行编译,然后再对其进行签名,则会抱怨必须对ClickOnce程序集进行签名。看来Office插件必须使用ClickOnce。

那么,如何在构建文件中的某处指定pfx密码?

我们将VS 2010与Office工具一起使用。

akt*_*ton 1

创建一个包含密码作为属性的文件(本地或在众所周知的网络共享上)并从 MSBuild 脚本引用该文件。设置文件的权限,以便只有构建帐户才能读取该文件。请注意,任何对构建机器具有管理员访问权限或知道构建帐户密码的人都可以读取该密码。最终,这里没有灵丹妙药。如果 MSBuild 可以找到/解密/无论什么密码,人类也能做到。

如果您担心私钥的安全性,请考虑将签名分离为单独的步骤并将私钥存储在智能卡上。它可能有点过头了,但它是最好的、常用的保护措施之一。

否则,只需将密码添加为属性即可。如您所知,项目文件只是 MSBuild 脚本。例如:

<PropertyGroup>
    <PfxPassword>password</PfxPassword>
</PropertyGroup>

<!-- Sample sign task -->
<SignTask>
    <File>MyOutlookPlugin.dll</File>
    <KeyFile>OutlookPlugin_TemporaryKey.pfx</KeyFile>
    <Password>$(PfxPassword)</Password>
</SignTask>
Run Code Online (Sandbox Code Playgroud)

有关 MSBuild 属性的详细信息,请参阅http://msdn.microsoft.com/en-us/library/ms171458(v=vs.80).aspx 。