共用方式為


nuget.org 上的可信發布

信任發佈是發佈 NuGet 套件的更好方式。 您不再需要管理長期存在的 API 金鑰。 相反地,您可以使用 CI/CD 系統核發的短期認證,例如 GitHub Actions。

這可降低憑證外洩的風險,讓您的發佈程式更安全。 它還使自動化變得更容易,因為您不需要輪換或存儲秘密。 這種方法是更廣泛的行業向安全、無密鑰發布轉變的一部分。 如果您好奇,請查看 OpenSSF 計劃: https://repos.openssf.org/trusted-publishers-for-all-package-repositories

提醒您:如果您在 nuget.org 帳戶中看不到「受信任發布」選項,這可能意味著您尚未能使用該功能。 我們正在逐步推出它。

運作方式

當您的 GitHub Actions 工作流程執行時,它會向 github.com 要求加密的 OIDC 權杖。 此權杖包含有關您的存放庫和工作流程的資訊,並由 GitHub Actions 以加密方式簽署以防止竄改。 工作流程會將此權杖轉送至 nuget.org,後者會使用業界標準的加密方法,通過 github.com 安全地驗證權杖的真實性。 然後,nuget.org 上的權杖交換端點會檢查權杖的詳細資料是否符合您已設定的受信任發佈原則。 如果一切符合,nuget.org 會發出短期的 API 金鑰,供工作流程在發佈套件時使用。

這是基本流程

  1. 您的 CI/CD 系統 (例如 GitHub Actions) 會執行工作流程。
  2. 它發行一個短期的代幣。
  3. 已傳送該令牌至 nuget.org。
  4. NuGet 會驗證它並傳回暫存 API 金鑰。
  5. 您的工作流程會使用該金鑰來推送套件。

顯示 [信任發佈] 頁面的螢幕擷取畫面。

NuGet 的暫存 API 金鑰有效期為 1 小時,因此您的工作流程應該在發佈前不久要求金鑰。 如果您過早請求它,它可能會在推送發生之前過期。

每個短期權杖只能使用一次來取得單一暫存 API 金鑰,也就是一個權杖、一個 API 金鑰。

此設定可讓您以安全且自動化的方式發佈套件,而不會產生長期秘密帶來的風險。

GitHub Actions 設定

開始之前:

  1. 登入 nuget.org
  2. 按一下您的使用者名稱,然後選擇 [信任發佈]。
  3. 新增信任的發佈原則。 對於具有工作流程檔案https://github.com/contoso/contoso-sdk的 GitHub 儲存庫.github/workflows/build.yml,請輸入下列受信任的原則詳細資料 (不區分大小寫):
    • 儲存庫擁有者:contoso
    • 儲存庫:contoso-sdk
    • 工作流程檔案:build.yml

      這對應於您在.github/workflows/build.yml的工作流程。 僅輸入檔案名稱build.yml) - 不包含.github/workflows/路徑。

    • 環境(可選):release

      如果您的工作流程使用例如 environment: release ,並且您想要將此策略限制為該環境,請輸入環境。 如果您不使用 GitHub Actions 環境,請將此選項保留空白。

  4. GitHub 存放庫中,更新您的工作流程以要求短期 API 金鑰並推送您的套件。
    這是一個基本範例:
jobs:
  build-and-publish:
    permissions:
      id-token: write  # enable GitHub OIDC token issuance for this job
    
    steps:
      # Build your artifacts/my-sdk.nupkg package here
    
      # Get a short-lived NuGet API key
      - name: NuGet login (OIDC → temp API key)
        uses: NuGet/login@v1
        id: login
        with:
          user: contoso-bot # Recommended: use a secret like ${{ secrets.NUGET_USER }} for your nuget.org username (profile name), NOT your email address
    
      # Push the package
      - name: NuGet push
        run: dotnet nuget push artifacts/my-sdk.nupkg --api-key ${{steps.login.outputs.NUGET_API_KEY}} --source https://api.nuget.org/v3/index.json

保單擁有權

當您建立信任發佈原則時,您必須選擇誰擁有該原則。 擁有者可以是:

  • 您(個人用戶)
  • 您所屬的組織

政策將套用至所選擁有者所擁有的所有套件。 這表示它會控制誰可以使用信任發佈來發佈或修改這些套件。

如果您選擇組織,請確保您是活躍成員。 如果您稍後離開組織,政策可能會停用,直到您重新加入為止。

選擇合適的擁有者有助於確保您的發布設定保持安全並與團隊結構保持一致。

政策待全面啟用

有時,當您建立信任發佈原則時,它會暫時處於有效狀態,為期 7 天。 這通常發生在私人 GitHub 存放庫上。 您會在 UI 中看到此狀態。 在此期間,它的行為就像常規政策一樣。 但是,如果在這 7 天內沒有發生任何發佈,則原則會自動變成非作用中狀態。 您可以隨時重新啟動 7 天的時限,即使在它到期後也是如此。

為什麼需要這個臨時期限? 因為 NuGet 需要 GitHub 存放庫和擁有者識別碼,才能將原則鎖定至原始存放庫和擁有者。 這有助於防止復活攻擊。 如果沒有這些 ID,有人可以刪除存放庫、以相同的名稱重新建立它,然後嘗試發布,就好像沒有任何變化一樣。

一旦成功發佈提供識別碼(作為 GitHub 短效權杖的一部分),政策就會永久生效。

保單擁有權警告

信任發佈原則會繫結至特定擁有者,可以是個別使用者或組織。 如果該擁有權發生變化,該政策可能會失效。 發生這種情況時,您會在 UI 中看到警告。

常見案例

  • 使用者已從組織中移除
    如果原則由組織擁有,且建立該原則的使用者稍後會從該組織移除,則該原則會變成非作用中。
    如果將使用者新增回組織,原則將自動再次啟用。

  • 組織不再活躍
    如果擁有原則的組織已鎖定或刪除,則原則會變成非作用中。

這些警告有助於確保在發佈套件時只使用作用中、安全的原則。