能否使用Azure Trusted Signing为ClickOnce清单签名?求解决方案
使用Azure Trusted Signing为ClickOnce清单签名的可行方案
不用依赖Mage或Velopac,你可以通过以下两种方式实现Azure Trusted Signing对ClickOnce清单的签名:
方案一:调用Azure Trusted Signing REST API + 自定义脚本
ClickOnce清单本质是带特定结构的XML文件,Azure Trusted Signing的REST API支持对这类文件进行代码签名,步骤如下:
生成未签名的ClickOnce清单
- 通过Visual Studio发布项目时,在发布设置中取消勾选"签名清单"选项,直接生成未签名的
.manifest和.application文件; - 或使用MSBuild命令生成:
msbuild YourProject.csproj /t:Publish /p:PublishDir=./publish /p:SignManifests=false
- 通过Visual Studio发布项目时,在发布设置中取消勾选"签名清单"选项,直接生成未签名的
编写脚本调用API签名
- 先获取Azure AD访问令牌,用于调用Trusted Signing API:
$token = az account get-access-token --resource https://management.azure.com --query accessToken --output tsv - 构造API请求,将未签名的清单文件内容发送到Trusted Signing服务,获取签名后的内容:
$manifestContent = Get-Content -Path "./publish/YourApp.manifest" -Raw $body = @{ fileContent = [Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes($manifestContent)) signingParameters = @{ signatureAlgorithm = "SHA256" timestampParameters = @{ timestampUri = "http://timestamp.digicert.com" } } } | ConvertTo-Json $signedContent = Invoke-RestMethod -Uri "https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.CodeSigning/codeSigningAccounts/{accountName}/sign?api-version=2024-02-01" -Method Post -Headers @{Authorization = "Bearer $token"} -Body $body -ContentType "application/json" # 将签名后的内容写入文件 [Text.Encoding]::UTF8.GetString([Convert]::FromBase64String($signedContent.signedFileContent)) | Out-File "./publish/YourApp.manifest" -Encoding UTF8 - 重复上述步骤对
.application文件进行签名
- 先获取Azure AD访问令牌,用于调用Trusted Signing API:
验证签名有效性
- 使用
signtool verify /pa /v ./publish/YourApp.manifest命令确认签名成功
- 使用
方案二:使用Azure CLI的Trusted Signing扩展
如果你的环境已安装Azure CLI及Trusted Signing扩展,可以直接通过命令行完成签名:
- 安装扩展:
az extension add --name trusted-signing - 签名清单文件:
az trusted-signing sign \ --account-name <your-signing-account-name> \ --resource-group <your-resource-group> \ --file-path ./publish/YourApp.manifest \ --output-file ./publish/Signed_YourApp.manifest \ --signature-algorithm SHA256 \ --timestamp-uri http://timestamp.digicert.com - 替换原未签名清单,完成后测试ClickOnce部署流程
注意事项
- 确保你的Azure账户拥有Trusted Signing服务的
CodeSigningAccounts.Sign权限 - 签名前需保证清单文件的哈希值正确,避免后续部署时出现验证错误
- 测试时需确保客户端信任Azure Trusted Signing的证书链,必要时可提前部署根证书到客户端机器
内容的提问来源于stack exchange,提问作者dennis_ler
相关产品推荐
相关产品推荐

