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

NuGet.org发布是否需证书?如何在GitHub/GitLab CI/CD签名NuGet包?

.NET项目CI/CD发布NuGet.org的签名问题解答

发布至NuGet.org是否需要CodeSigning证书?

NuGet.org不强制要求提供CodeSigning证书。未签名的包可以正常上传发布,但签名后的包会在NuGet平台显示已验证标识,既能提升用户信任度,也能有效防止包被篡改。如果是企业级发布或追求更高安全性的场景,建议对包进行签名。

USB令牌存储证书的CI/CD签名方案

由于USB令牌的私钥不可导出,常规CI/CD虚拟环境无法直接访问令牌硬件,因此需要通过远程签名服务的方式实现,具体步骤分GitHub Actions和GitLab CI/CD两种场景:

GitHub Actions 实现步骤

  1. 搭建远程签名服务器
    • 准备一台物理服务器,将USB令牌插入该服务器并确保系统能识别(安装对应令牌驱动)
    • 在服务器上部署签名服务:可使用signtool配合微软远程签名接口,或自定义API服务对外提供包签名能力,同时添加身份验证(如GitHub OIDC令牌或自定义密钥),并限制访问IP为GitHub CI的出口IP段
  2. 配置GitHub仓库密钥
    • 在仓库「Settings」→「Secrets and variables」→「Actions」中添加以下密钥:
      • SIGN_SERVICE_URL:远程签名服务地址
      • SIGN_SERVICE_TOKEN:签名服务认证密钥
      • NUGET_API_KEY:NuGet.org的API密钥
  3. 编写Workflow文件
    示例.github/workflows/build-sign-push.yml片段:
    jobs:
      build-sign-push:
        runs-on: ubuntu-latest
        steps:
          - uses: actions/checkout@v4
          - name: Setup .NET SDK
            uses: actions/setup-dotnet@v4
            with:
              dotnet-version: '8.0.x'
          - name: Build NuGet package
            run: dotnet pack --configuration Release -o ./output
          - name: Sign package via remote service
            run: |
              curl -X POST \
                -H "Authorization: Bearer ${{ secrets.SIGN_SERVICE_TOKEN }}" \
                -F "package=@./output/YourProject.1.0.0.nupkg" \
                ${{ secrets.SIGN_SERVICE_URL }} \
                --output ./output/Signed_YourProject.1.0.0.nupkg
          - name: Push to NuGet.org
            run: dotnet nuget push ./output/Signed_YourProject.1.0.0.nupkg --api-key ${{ secrets.NUGET_API_KEY }} --source https://api.nuget.org/v3/index.json
    

GitLab CI/CD 实现步骤

  1. 搭建远程签名服务器
    同GitHub场景,需要一台接入USB令牌的物理服务器,部署带身份验证的签名服务,限制访问IP为GitLab Runner的出口IP
  2. 配置GitLab项目变量
    在项目「Settings」→「CI/CD」→「Variables」中添加以下变量(设置为「Protected」和「Masked」):
    • SIGN_SERVICE_URL:远程签名服务地址
    • SIGN_SERVICE_TOKEN:签名服务认证密钥
    • NUGET_API_KEY:NuGet.org API密钥
  3. 编写CI配置文件
    示例.gitlab-ci.yml片段:
    stages:
      - build
      - sign
      - publish
    
    build:
      stage: build
      image: mcr.microsoft.com/dotnet/sdk:8.0
      script:
        - dotnet pack --configuration Release -o ./packages
      artifacts:
        paths:
          - ./packages/*.nupkg
    
    sign:
      stage: sign
      image: curlimages/curl:latest
      script:
        - |
          curl -X POST \
            -H "Authorization: Bearer $SIGN_SERVICE_TOKEN" \
            -F "package=@./packages/YourProject.1.0.0.nupkg" \
            $SIGN_SERVICE_URL \
            --output ./packages/Signed_YourProject.1.0.0.nupkg
      artifacts:
        paths:
          - ./packages/Signed_YourProject.1.0.0.nupkg
    
    publish:
      stage: publish
      image: mcr.microsoft.com/dotnet/sdk:8.0
      script:
        - dotnet nuget push ./packages/Signed_YourProject.1.0.0.nupkg --api-key $NUGET_API_KEY --source https://api.nuget.org/v3/index.json
    

关键注意事项

  • 远程签名服务器必须严格防护:启用HTTPS传输、限制访问IP、定期更新令牌驱动和签名工具
  • 测试阶段先在本地验证签名服务的可用性,确保能正常完成包签名后再接入CI/CD流程
  • 若使用微软signtool,可通过/http参数直接调用远程签名服务,无需自定义API

内容的提问来源于stack exchange,提问作者AxD

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 01:23:16