Start Debugging

As API keys do NuGet ganham limite de 30 dias em 17 de agosto, e toda key antiga expira em 1 de novembro

O NuGet.org remove a opção de API key de 365 dias em 2026-08-17, limita as novas a 30 dias e expira em 1 de novembro toda key criada antes dessa data. Veja o que quebra e como migrar seu fluxo de publicação para trusted publishing com OIDC.

O time do .NET publicou Strengthening NuGet Supply Chain Security: Reducing API Key Lifetime em 2026-08-03, e o texto traz duas datas rígidas que vão quebrar pipelines de publicação se você ignorá-las.

As duas datas

2026-08-17: novas API keys ficam limitadas a uma duração máxima de 30 dias. A opção de 365 dias some da interface de criação de keys no nuget.org.

2026-11-01: toda API key criada antes de 17 de agosto expira. Não só as de um ano. Se o seu secret NUGET_API_KEY foi gerado em junho, ele para de funcionar em 1 de novembro, independentemente da data de expiração exibida ao lado dele.

Essa segunda data é a que dói. Um fluxo de publicação disparado por tag que não roda desde outubro vai falhar no primeiro push depois de 1 de novembro com um 401, e a falha aparece em um job que ninguém acompanha até precisar realmente publicar.

Por que uma key de 30 dias ainda tem o formato errado

Uma key de 30 dias é melhor que uma de 365, mas continua sendo um secret de vida longa guardado em um cofre de secrets do repositório, e agora você passa a rotacioná-lo doze vezes por ano em vez de uma. Automatizar a rotação é trabalho real: gerar a key no nuget.org com o escopo de pacote certo, enviá-la para o GitHub ou o Azure DevOps, conferir que a anterior foi revogada.

A alternativa para a qual a Microsoft está direcionando todo mundo é o trusted publishing, que usa OIDC no lugar. Seu sistema de CI emite um token assinado de curta duração, o nuget.org valida contra uma política que você registrou e devolve uma API key temporária válida por uma hora. Um token compra exatamente uma key. Nada duradouro fica armazenado em lugar nenhum.

O formato no GitHub Actions é pequeno:

publish:
  environment: release
  permissions:
    id-token: write   # required for GitHub to mint the OIDC token
    contents: read
  steps:
    - name: NuGet login (OIDC to temp API key)
      uses: NuGet/login@v1
      id: login
      with:
        user: ${{ secrets.NUGET_USER }}   # nuget.org profile name, not your email
    - name: Push
      run: >
        dotnet nuget push artifacts/*.nupkg
        --api-key ${{ steps.login.outputs.NUGET_API_KEY }}
        --source https://api.nuget.org/v3/index.json
        --skip-duplicate

A configuração inicial é uma política no nuget.org em Account, Trusted Publishing: proprietário do repositório, repositório, nome do arquivo de workflow (release.yml, sem o prefixo .github/workflows/) e, opcionalmente, o nome do environment. O GitLab também funciona, trocando um claim de id_tokens contra POST https://www.nuget.org/api/v2/token.

Uma pegadinha que vale saber antes de novembro: uma política criada contra um repositório privado do GitHub começa temporariamente ativa por 7 dias. Se nenhuma publicação acontecer nessa janela, ela fica inativa, porque o nuget.org precisa dos IDs de repositório e proprietário vindos de uma troca de token real para fixar a política contra ataques de ressurreição. Registre a política e faça um push descartável; não registre e vá embora.

Se você já mantém uma publicação de múltiplos pacotes, a fiação está coberta em Independently Releasing Multiple NuGet Packages with MinVer + Trusted Publishing. Caso contrário, o mínimo viável nesta semana é auditar quais dos seus pipelines ainda publicam com uma key estática e confirmar que a conta do nuget.org que recebe os avisos de expiração é uma que alguém realmente lê.

Comments

Sign in with GitHub to comment. Reactions and replies thread back to the comments repo.

< Voltar