如何在CI脚本中为.wapproj项目配置EV证书签名及PIN验证
解决方案:使用EV USB密钥签名Avalonia .wapproj应用
错误原因
APPX0101错误是因为MSBuild无法找到签名所需的证书配置——当前命令未指定证书相关参数,且远程服务器的EV USB密钥证书未被构建流程识别。
方案1:CLI命令指定证书(适合CI自动化)
如果远程服务器的USB密钥已被系统识别,且证书存在于当前用户的证书存储中,可通过证书指纹直接指定:
- 先在远程服务器的
certmgr.msc中获取EV证书的指纹:右键证书→属性→详细信息→指纹,去掉指纹中的空格。 - 修改msbuild命令,添加证书相关参数:
msbuild -t:restore msbuild /p:Configuration=Release /p:RuntimeIdentifier=win-x64 /p:AppxBundle=Always /p:AppxBundlePlatforms="x64" /p:Platform=x64 /p:UapAppxPackageBuildMode=SideloadOnly /p:PackageCertificateThumbprint="你的EV证书指纹(无空格)" /p:PackageCertificateStoreName="MY"
PackageCertificateStoreName="MY":EV证书默认存于「个人」存储区,若证书在其他区可调整此值。- 构建时Windows会自动弹出PIN码输入框,需确保远程服务器会话为交互式(如保持远程桌面连接活跃),无界面服务会话可能无法弹出PIN框。
方案2:Windows GUI选择证书(适合手动构建)
若在远程服务器上手动触发构建,可让MSBuild弹出证书选择对话框:
- 确保远程服务器已连接USB密钥,证书在系统存储中可见。
- 修改msbuild命令,强制触发证书选择窗口:
msbuild -t:restore msbuild /p:Configuration=Release /p:RuntimeIdentifier=win-x64 /p:AppxBundle=Always /p:AppxBundlePlatforms="x64" /p:Platform=x64 /p:UapAppxPackageBuildMode=SideloadOnly /p:PackageCertificateKeyFile=""
- 在弹出的证书选择框中选中EV证书,点击确定后会自动弹出PIN码输入框,输入完成即可完成签名。
额外注意事项
- 远程服务器需安装EV证书厂商提供的USB密钥驱动,确保密钥能被系统识别。
- 若CI以服务账户运行,需给服务账户授予证书私钥访问权限:在
certmgr.msc中右键证书→所有任务→管理私钥,添加服务账户并赋予「读取」权限。 - 验证证书可用性:在远程服务器PowerShell中执行
Get-ChildItem Cert:\CurrentUser\My | Where-Object {$_.Subject -match "你的证书主题"},能输出证书信息即识别正常。
内容的提问来源于stack exchange,提问作者YaRmgl
相关产品推荐
相关产品推荐

