C# 如何手动设置MSBuild签名目标的密码?

C# 如何手动设置MSBuild签名目标的密码?,c#,msbuild,outlook-addin,pfx,C#,Msbuild,Outlook Addin,Pfx,我们正在用C#构建Outlook插件。它在VS中构建时没有问题,并使用临时pfx证书进行签名。我们想把构建过程放在Jenkins中,让它自动运行 我们尝试使用MSBuild运行VS解决方案。它在开发机器上非常有效,但在Jenkins中存在一个错误: 无法导入以下密钥文件:OutlookPlugin_TemporaryKey.pfx。密钥文件 可能受密码保护。若要更正此问题,请尝试再次或手动导入证书 使用以下密钥容器名称将证书安装到强名称CSP: VS_键_A688DC31A30F3EF1 我们不

我们正在用C#构建Outlook插件。它在VS中构建时没有问题,并使用临时pfx证书进行签名。我们想把构建过程放在Jenkins中,让它自动运行

我们尝试使用MSBuild运行VS解决方案。它在开发机器上非常有效,但在Jenkins中存在一个错误:

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

我们不知道如何为自动生成指定pfx密码。或者自动执行签名过程

我们发现的一个解决方案是在VS中以与自动化流程相同的用户在同一台机器上打开项目,并键入密码。这不起作用,可能是因为詹金斯每次都会清除工作区。 如果我们尝试在不签名的情况下进行编译,然后对其进行签名,它会抱怨必须对ClickOnce程序集进行签名。Office插件似乎必须使用ClickOnce

那么,如何在构建文件的某个地方指定pfx密码呢

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

创建一个文件(本地或已知网络共享),其中包含密码作为属性,并引用来自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>

密码
MyOutlookPlugin.dll
OutlookPlugin_TemporaryKey.pfx
$(PfxPassword)

有关MSBuild属性的详细信息,请参阅。

使用MSBuild和竹子构建项目时遇到问题。我们的修复方法是从.csproj文件中删除以下行

<AssemblyOriginatorKeyFile>applicationcert.pfx</AssemblyOriginatorKeyFile>
applicationcert.pfx

这里的主要问题不是安全性。我们只是不知道如何将密码输入到MSBuild脚本中。我们将项目中的sln文件用作MSBuild脚本。@Aleximi添加了有关如何添加MSBuild属性的信息。我们的csproj文件中没有任何SignTask。当我们在控制台中运行MSBuild时,我们可以看到正在执行的任务,但我们无法判断哪个任务是签名任务,因此我们可以覆盖它。可能是因为此项目是ClickOnce Outlook插件,与普通的c#项目有所不同。@Aleximi请尝试在Visual Studio中配置密码,然后复制项目文件。更改密码并对文件进行区分。这将告诉您密码存储的位置。您可能还需要检查csproj.user和类似文件。@alexsimi.sln文件不是msbuild脚本。AFAIK您可以创建没有密码的pfx文件,如果这是一个选项(可能不是由于明显的安全问题)。我认为您需要调查在CI中运行的实际msbuild脚本,并找出用于对exe进行签名的确切任务。然后检查它以了解如何为pfx指定密码。我怀疑这将通过属性来完成,您只需要找到确切的属性名。删除它是否会影响构建过程或安装过程?