在Azure DevOps流水线中用Azure Key Vault签名NuGet包内程序集
解决方案:Azure DevOps流水线中签名程序集并打包NuGet包
一、构建后、打包前签名程序集的可行方案
这是最可靠的实现流程,先完成程序集编译,签名后再打包成NuGet包,步骤如下:
- 仅构建项目,不执行打包
使用dotnet build命令编译项目,指定输出目录保存未签名的程序集,跳过打包步骤:
dotnet build MyProject.csproj --configuration Release --output $(Build.ArtifactStagingDirectory)/build-output --no-restore
- 用AzureSignTool签名程序集
通过AzureSignTool调用Azure Key Vault中的证书,对输出目录下的所有目标程序集(.dll/.exe)进行签名,需确保流水线服务主体拥有Key Vault证书的Sign权限:
AzureSignTool sign \ -kvu https://<你的密钥库名称>.vault.azure.net \ -kvi $(ServicePrincipalId) \ -kvp $(ServicePrincipalSecret) \ -kvc <证书名称> \ -tr http://timestamp.digicert.com \ -td sha256 \ $(Build.ArtifactStagingDirectory)/build-output/*.dll \ $(Build.ArtifactStagingDirectory)/build-output/*.exe
注:可通过dotnet tool install --global AzureSignTool在流水线中临时安装工具。
- 基于已签名程序集打包NuGet
使用dotnet pack指定已签名程序集的目录,跳过构建步骤,直接生成包含签名程序集的NuGet包:
dotnet pack MyProject.csproj --configuration Release --output $(Build.ArtifactStagingDirectory)/nuget-packages --no-build --no-restore --base-path $(Build.ArtifactStagingDirectory)/build-output
二、直接签名NuGet包内程序集的工具现状
目前没有专门工具能直接修改NuGet包内的程序集并完成签名。虽然可以手动解压NuGet包、签名内部程序集、重新打包,但这种操作会破坏NuGet包的原始哈希校验,可能导致包在验证时出错,因此不推荐这种方式。
Azure DevOps YAML流水线示例片段
steps: - task: DotNetCoreCLI@2 displayName: '编译项目(不打包)' inputs: command: 'build' projects: '**/*.csproj' arguments: '--configuration Release --output $(Build.ArtifactStagingDirectory)/build-output --no-restore' - task: PowerShell@2 displayName: '用AzureSignTool签名程序集' inputs: targetType: 'inline' script: | dotnet tool install --global AzureSignTool AzureSignTool sign ` -kvu https://your-keyvault-name.vault.azure.net ` -kvi $(AZURE_CLIENT_ID) ` -kvp $(AZURE_CLIENT_SECRET) ` -kvc YourCertificateAlias ` -tr http://timestamp.digicert.com ` -td sha256 ` $(Build.ArtifactStagingDirectory)/build-output/*.dll ` $(Build.ArtifactStagingDirectory)/build-output/*.exe - task: DotNetCoreCLI@2 displayName: '打包已签名程序集为NuGet包' inputs: command: 'pack' projects: '**/*.csproj' arguments: '--configuration Release --output $(Build.ArtifactStagingDirectory)/nuget-packages --no-build --no-restore --base-path $(Build.ArtifactStagingDirectory)/build-output'
权限注意事项
确保流水线使用的服务主体在Azure Key Vault的访问策略中,拥有以下权限:
- 证书权限:
Sign - 密钥权限:
Get
内容的提问来源于stack exchange,提问作者BlackTuareg
相关产品推荐
相关产品推荐

