VisualStudio.com在构建过程中无法加载临时的UWP证书

16

我已经设置了我的Visual Studio Team Service帐户,克隆我的私有GitHub存储库并在任何时候排队构建时构建Windows UWP应用程序。克隆没有任何问题;编译每个项目(6)都能正常工作,除了一个Windows UWP应用程序项目。

当构建服务器编译该应用程序时,我收到以下警告:

C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\AppxPackage\Microsoft.AppXPackage.Targets(1778,5): 警告 APPX0104: 未找到证书文件“myapp_TemporaryKey.pfx”。

2>C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\AppxPackage\Microsoft.AppXPackage.Targets(1778,5): 警告 APPX0104: 未找到证书文件“myapp_TemporaryKey.pfx”。 [C:\a\1\s\Source\Applications\myapp.WindowsUWP\myapp.csproj]

C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\AppxPackage\Microsoft.AppXPackage.Targets(1778,5): 警告 APPX0102: 在项目中指定的具有指纹“58F2EA544193F6FC9F2737135570555B388E58D8”的证书未在证书存储中找到。请在项目文件中指定有效的指纹。

2>C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\AppxPackage\Microsoft.AppXPackage.Targets(1778,5): 警告 APPX0102: 在项目中指定的具有指纹“58F2EA544193F6FC9F2737135570555B388E58D8”的证书未在证书存储中找到。请在项目文件中指定有效的指纹。[C:\a\1\s\Source\Applications\myapp.WindowsUWP\myapp.csproj]

C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\AppxPackage\Microsoft.AppXPackage.Targets(1778,5):

警告APPX0107:指定的证书无法用于签名。有关有效证书的更多信息,请参见http://go.microsoft.com/fwlink/?LinkID=241478。 2> C:\ Program Files(x86)\ MSBuild \ Microsoft \ VisualStudio \ v14.0 \ AppxPackage \ Microsoft.AppXPackage.Targets(1778,5): 警告APPX0107:指定的证书无法用于签名。有关有效证书的更多信息,请参见http://go.microsoft.com/fwlink/?LinkID=241478 [C:\ a \ 1 \ s \ Source \ Applications \ myapp.WindowsUWP \ myapp.csproj]

这是6个项目中最后一个编译的项目。在收到警告后,它继续将所有输出文件复制到最终的/ bin目录中。然后当全部完成时,报告与上述相同的消息,但这次是作为错误,并且构建失败。

  

_GenerateAppxPackageFile:   C:\ Program Files(x86)\ Windows Kits \ 10 \ bin \ x64 \ MakeAppx.exe打包/ l / h sha256 / f obj \ x86 \ Debug \ package.map.txt / o / p C:\ a \ 1 \ s \ Source \ Applications \ MyApp.WindowsUWP \ AppPackages \ MyApp_1.0.0.0_x86_Debug_Test \ MyApp_1.0.0.0_x86_Debug.appx
           MyApp - > C:\ a \ 1 \ s \ Source \ Applications \ MyApp.WindowsUWP \ AppPackages \ MyApp_1.0.0.0_x86_Debug_Test \ MyApp_1.0.0.0_x86_Debug.appx   C:\ Program Files(x86)\ MSBuild \ Microsoft \ VisualStudio \ v14.0 \ AppxPackage \ Microsoft.AppXPackage.Targets(2382,5):错误APPX0104:找不到证书文件'MyApp_TemporaryKey.pfx'。

2>C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\AppxPackage\Microsoft.AppXPackage.Targets(2382,5): 错误 APPX0104: 找不到证书文件 'MyApp_TemporaryKey.pfx'。[C:\a\1\s\Source\Applications\MyApp.WindowsUWP\MyApp.csproj] C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\AppxPackage\Microsoft.AppXPackage.Targets(2382,5): 错误 APPX0102: 项目中指定的具有指纹 '58F2EA544193F6FC9F2737135570555B388E58D8' 的证书在证书存储中找不到。请在项目文件中指定有效的指纹。 2>C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\AppxPackage\Microsoft.AppXPackage.Targets(2382,5): 错误 APPX0102: 项目中指定的具有指纹 '58F2EA544193F6FC9F2737135570555B388E58D8' 的证书在证书存储中找不到。请在项目文件中指定有效的指纹。[C:\a\1\s\Source\Applications\MyApp.WindowsUWP\MyApp.csproj] C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\AppxPackage\Microsoft.AppXPackage.Targets(2382,5): 错误 APPX0107: 指定的证书无效,请参阅 http://go.microsoft.com/fwlink/?LinkID=241478 了解有关有效证书的更多信息。2>C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\AppxPackage\Microsoft.AppXPackage.Targets(2382,5): 错误 APPX0107: 指定的证书无效。有关有效证书的更多信息,请参见http://go.microsoft.com/fwlink/?LinkID=241478。[C:\a\1\s\Source\Applications\MyApp.WindowsUWP\MyApp.csproj] 2>已完成项目“C:\a\1\s\Source\Applications\MyApp.WindowsUWP\MyApp.csproj”(默认目标) -- 失败。 1>已完成项目“C:\a\1\s\Source\MyApp.UWP.sln”(默认目标) -- 失败。 构建失败。

如果我删除证书(就像我在这个特定的错误日志中所做的那样),它会因为找不到证书而失败。如果我使用VS中的清单编辑器来生成证书,并给它分配一个密码,构建服务器会因为不知道密码而失败。因此,无论是提供临时测试证书还是不提供都不能使它构建成功。

我们应该如何通过Visual Studio团队服务构建系统运行Windows 10 UWP应用程序?这是微软一直在推广的东西,因此我认为这是可以做到的。但我似乎无法让UWP项目真正构建。


1
因为我不需要签名,所以我只需在 YAML 文件的 msbuildArgs 部分添加参数 /p:AppxPackageSigningEnabled=false 来禁用签名。 - Artemious
6个回答

10

您可以生成一个未分配密码的证书。

或者在您的构建定义中添加一个 PowerShell 步骤以导入受密码保护的证书。以下是您可以使用的 PowerShell 脚本:

$pfxpath = 'myapp_TemporaryKey.pfx'
$password = 'yourpassword'

Add-Type -AssemblyName System.Security
$cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2
$cert.Import($pfxpath, $password, [System.Security.Cryptography.X509Certificates.X509KeyStorageFlags]"PersistKeySet")
$store = new-object system.security.cryptography.X509Certificates.X509Store -argumentlist "MY", CurrentUser
$store.Open([System.Security.Cryptography.X509Certificates.OpenFlags]"ReadWrite")
$store.Add($cert)
$store.Close()

请记得将“工作文件夹”设置为存放pfx文件的路径。


谢谢您!我真的以为MSBuild会搜索证书存储,找到匹配的哈希值并继续执行。显然不是这样。 - mrkg
这个解决方案对我来说完美地运作了。 只需要在此之前添加几件事情: 正如@Michael Mairegger所提到的,确保将pfx文件包含在源代码控制检入中。 同时设置pfx文件属性的“复制到输出目录”为非“None”(默认值),以确保pfx文件被复制到bin文件夹中,以备打包使用。 - ajaxer

3

默认情况下,.gitignore 会忽略任何 *.pfx 文件,因此不会将其添加到 git 中。我遇到了同样的问题,构建机器没有 *_StoreKey.pfx 文件,因此无法成功构建。

对我来说,解决方案是在构建服务器上安装 *_StoreKey.pfx。然后在构建服务器上构建解决方案,成功了。


将存储密钥添加到源代码中是否存在安全风险?我的意思是,当它是一个开源仓库时,肯定会有风险,但对于私有/闭源仓库来说,这不应该是一个问题,对吧? - Patric
1
@Patric 这取决于私有仓库的位置。任何远程操作都应被视为安全风险。目前,我使用TFSO的“安全文件”功能。 - Michael Mairegger
在我的情况下,我在我的解决方案中有我的xx.pfx文件。我遇到了“密钥文件可能受到密码保护”的错误... - Ziggler

2
我使用“安全文件”功能解决了这个问题:https://learn.microsoft.com/en-us/azure/devops/pipelines/library/secure-files?view=vsts 步骤如下:
  1. 在构建管道中,有一个“库”选项卡。我将pfx(已从源代码控制中排除)作为文件添加到其中。
  2. 然后,我添加了一个“下载安全文件”作为构建任务(https://learn.microsoft.com/en-us/azure/devops/pipelines/tasks/utility/download-secure-file?view=vsts)。请注意文档中的环境变量(当前为$env:DOWNLOADSECUREFILE_SECUREFILEPATH)
  3. 然后,我添加了一个命令行任务来将文件移动到预期位置。所以命令是move %DOWNLOADSECUREFILE_SECUREFILEPATH% FolderOfMyProject
现在它的行为就像证书已经被检入一样。

这是非常美丽的,也是我能找到的面向公众的流水线中最好的选择。匿名构建结果页面甚至没有显示安全文件步骤。 - Lance McCarthy

1

最近我遇到了同样的问题,最终在this post的帮助下成功解决了。

事实上,作为UWP开发者,我们必须确保已创建用于测试的.pfx文件,并且以下内容分享了一些我认为有用的解决方案:

  • 使用VS创建测试证书:

    1. 在Visual Studio中,从“解决方案资源管理器”中打开Package.appxmanifest
    2. 在“应用程序清单设计器”中,选择“包装”选项卡,然后选择“选择证书”按钮。
    3. 在“选择证书”对话框中,展开“配置证书”列表,然后选择“创建测试证书”。
    4. 在“创建测试证书”对话框中,输入您的信息,然后单击“确定”按钮。(上述步骤的描述来自此
  • 使用MakeCertPvk2PfxCertutil工具创建证书

    1. MDSN:如何创建应用程序包签名证书

希望这能帮到您!


1

我也遇到了这个错误:

"无法导入密钥文件 'blah.pfx'。密钥文件可能受到密码保护。要解决此问题,请尝试手动将证书导入当前用户的个人证书存储中"。

您可以双击 .pfx 文件将其导入您的存储中,关键是当它弹出向导时,您必须在第一个屏幕上选择“当前用户”,而不是“本地计算机”,然后选择“个人”而不是“自动”。

之后我成功构建了包。 在我选择“本地计算机”+“个人”时并没有起作用。


0

我也遇到了同样的问题(错误APPX0107:指定的证书无法用于签名),尝试了所有解决方案,但都没有起作用。 实际上,在.csproj中的密钥名称后面有一个新行

<PackageCertificateKeyFile>myCert.pfx
</PackageCertificateKeyFile>

将其移除后,它就可以正常工作了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接