我正在尝试为旧的 WinForms 应用程序创建一个管道来构建解决方案。在上述解决方案中,有许多项目是使用 .pfx 文件进行签名的。以下是项目文件中的相关行。
<SignAssembly>true</SignAssembly>
<AssemblyOriginatorKeyFile>MySigningKeyFile.pfx</AssemblyOriginatorKeyFile>
我在管道中的 Microsoft 托管代理上使用
windows-latest
图像,但收到以下错误。
错误 MSB3325:无法导入以下密钥文件: D:\s\MySigningKeyFile.pfx。密钥文件可能受密码保护。 要纠正此问题,请尝试再次导入证书或手动导入证书 使用以下密钥将证书安装到强名称 CSP 容器名称:VS_KEY_73E817AD0FB98BD9
请注意,此 ID 会更改管道的每次运行,但我无法在构建安装之前找到确定这一点的方法?
如何解决这个问题?
我尝试在 Powershell 任务中使用以下脚本使用 Powershell 安装 .pfx 文件(.pfx 位于存储库中)。
$securePassword = ConvertTo-SecureString -String "$(SnKeyPwd)" -Force -AsPlainText
Import-PfxCertificate -FilePath "MySigningKeyFile.pfx" -CertStoreLocation "Cert:\LocalMachine\My" -Password $securePassword
此任务成功,因为我可以在管道日志中看到证书的指纹。
我还将以下 msbuild 参数传递给 VSBuild 任务
/p:SignAssembly=true /p:AssemblyOriginatorKeyFile=MySigningKeyFile.pfx /p:SignAssemblyTimestampUrl=$(TimestampUrl)
但这也带来了同样的问题。如果我一起删除签名,那么构建将完全失败,因为所有引用都会损坏。
我正在为
Release
建造
Any CPU
非常感谢任何建议,提前致谢。 :)
由于您使用 Microsoft 托管的代理来运行构建作业,因此您将为管道中的每个作业获得一个新的虚拟机。为
.pfx
文件生成的密钥容器名称在不同机器上会有所不同。
作为解决方法,您可以使用安装在本地计算机(或虚拟机)上的自托管代理。然后,使用以下命令将证书安装到 CSP,并使用首次在自托管代理上运行构建作业时错误消息中报告的密钥容器名称。
sn.exe -i <pfx_file> <key_container_name_from_error_message>
如果您仍想使用 Microsoft 托管的代理来运行构建作业,可以尝试添加 CMD 任务来运行以下命令行,以在构建之前生成并安装
.pfx
文件的密钥容器名称工作中的任务。
SnInstallPfx.exe <pfx_file> <pfx_password>
此命令来自 SnInstallPfx 工具,您可能还需要在运行之前使用命令行下载
SnInstallPfx.exe
。