You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Azure DevOps流水线中用Azure Key Vault签名NuGet包内程序集

解决方案:Azure DevOps流水线中签名程序集并打包NuGet包

一、构建后、打包前签名程序集的可行方案

这是最可靠的实现流程,先完成程序集编译,签名后再打包成NuGet包,步骤如下:

  1. 仅构建项目,不执行打包
    使用dotnet build命令编译项目,指定输出目录保存未签名的程序集,跳过打包步骤:
dotnet build MyProject.csproj --configuration Release --output $(Build.ArtifactStagingDirectory)/build-output --no-restore
  1. 用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在流水线中临时安装工具。

  1. 基于已签名程序集打包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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 23:57:22