Verificar uma versão

Como conferir que uma versão do zn-gate no npm, no PyPI ou no GitHub foi construída pelos workflows de publicação do usezn/zn, com somas de verificação, atestados do GitHub, assinaturas Sigstore, provenance do npm e atestados do PyPI.

Ver .md

Cada versão do zn-gate publicada pelo workflow Release é construída uma única vez a partir de uma tag do repositório usezn/zn. A primeira delas é a primeira publicada depois da 1.5.0-beta.1 (a 1.5.0-beta.2 ou a 1.5.0, a que saísse primeiro). Os mesmos arquivos são então publicados no npm, no PyPI e na GitHub Release, sem tokens de publicação de longa duração: o npm e o PyPI os aceitam por meio de publicação confiável (OpenID Connect do GitHub Actions).

Cada versão tem:

Arquivo O que é
zn-gate-<version>.tgz Pacote npm
zn_gate-<pyversion>.tar.gz Distribuição de código-fonte Python
zn_gate-<pyversion>-py3-none-any.whl Wheel Python
SHA256SUMS Somas SHA-256 dos três arquivos acima
<arquivo>.sigstore.json Bundle Sigstore (assinatura, certificado e prova do log de transparência) de cada arquivo, incluindo SHA256SUMS

Cada arquivo também tem um atestado de artefato do GitHub (procedência de build SLSA), o npm mostra uma declaração de provenance do pacote e o PyPI guarda um atestado de cada arquivo Python.

Qual workflow assinou a sua versão

A partir da 1.12.0, os arquivos são construídos, atestados e assinados por um workflow reutilizável separado, build-release.yml, cujos jobs de build e de assinatura o release.yml chama, mas não consegue alcançar. Isso faz com que a procedência de build seja SLSA Build Level 3, e build-release.yml é o signatário nos passos 2 e 3 abaixo. As versões até a 1.11.x foram construídas e assinadas pelo próprio release.yml (SLSA Build Level 2: construídas em um runner hospedado pelo GitHub). O provenance do npm (passo 4) e os atestados do PyPI (passo 5) são gerados quando os arquivos são publicados; por isso, em todas as versões eles citam release.yml na tag.

Versão Workflow signatário
1.12.0 e posteriores usezn/zn/.github/workflows/build-release.yml
1.5.0-beta.2 a 1.11.x usezn/zn/.github/workflows/release.yml

As versões Python usam a grafia PEP 440 da versão do npm: 1.5.0 é 1.5.0 nos dois, e 1.5.0-beta.2 no npm é 1.5.0b2 no PyPI.

A 1.5.0-beta.1 e todas as anteriores foram publicadas à mão e não têm assinaturas, atestados nem provenance. As verificações abaixo falham para elas. Isso é esperado e não significa que os arquivos foram adulterados. Para conferir uma dessas versões, compare-a com o código-fonte marcado com a tag no repositório.

Dist-tags do npm

Versão Dist-tag do npm
X.Y.Z (final, mais nova que o latest atual) latest
X.Y.Z (correção de uma linha mais antiga) release-X.Y
X.Y.Z-beta.N beta
X.Y.Z-rc.N next
X.Y.Z-alpha.N alpha

Uma pré-versão nunca move o latest. npm install zn-gate instala a última versão final; use npm install zn-gate@beta (ou @next, @alpha) para optar por uma pré-versão.

Nos exemplos abaixo, substitua v1.12.0 / 1.12.0 pela versão que você está conferindo, e build-release.yml por release.yml em uma versão até a 1.11.x.

1. Somas de verificação

Baixe os arquivos e o SHA256SUMS da GitHub Release e execute:

sha256sum --ignore-missing -c SHA256SUMS      # Linux
shasum -a 256 --ignore-missing -c SHA256SUMS  # macOS

As somas só provam que os arquivos correspondem ao SHA256SUMS. Confira a assinatura do SHA256SUMS (passo 3) ou os atestados (passo 2) para saber quem o produziu.

2. Atestados de artefato do GitHub

Com a CLI do GitHub 2.49 ou posterior:

gh attestation verify zn-gate-1.12.0.tgz \
  --repo usezn/zn \
  --signer-workflow usezn/zn/.github/workflows/build-release.yml \
  --source-ref refs/tags/v1.12.0

Execute para cada arquivo. Ele confere que o arquivo foi construído pelos workflows de publicação do usezn/zn a partir dessa tag.

3. Assinaturas Sigstore

A identidade de assinatura é o workflow signatário na tag:

  • identidade: https://github.com/usezn/zn/.github/workflows/build-release.yml@refs/tags/v1.12.0 (até a 1.11.x: https://github.com/usezn/zn/.github/workflows/release.yml@refs/tags/v1.11.0)
  • emissor: https://token.actions.githubusercontent.com

Com o sigstore-python:

python -m pip install sigstore
python -m sigstore verify identity \
  --bundle SHA256SUMS.sigstore.json \
  --cert-identity https://github.com/usezn/zn/.github/workflows/build-release.yml@refs/tags/v1.12.0 \
  --cert-oidc-issuer https://token.actions.githubusercontent.com \
  SHA256SUMS

Com o cosign (2.4 ou posterior; o cosign 3 não precisa de --new-bundle-format):

cosign verify-blob SHA256SUMS \
  --bundle SHA256SUMS.sigstore.json \
  --new-bundle-format \
  --certificate-identity https://github.com/usezn/zn/.github/workflows/build-release.yml@refs/tags/v1.12.0 \
  --certificate-oidc-issuer https://token.actions.githubusercontent.com

Uma assinatura válida no SHA256SUMS junto com a verificação de somas aprovada (passo 1) cobre os três arquivos. Você também pode verificar cada arquivo com o seu próprio bundle da mesma forma.

4. npm

A página do pacote no npmjs.com mostra uma seção de provenance que liga a versão ao commit e à execução do workflow. A partir de um projeto em que o zn-gate está instalado:

npm audit signatures

Ele confere as assinaturas do registro e os atestados de provenance dos pacotes instalados. Você também pode consultar os atestados diretamente:

npm view zn-gate@1.5.0 dist.attestations

5. PyPI

Cada arquivo em pypi.org/project/zn-gate tem uma seção de provenance (abra os detalhes do arquivo em "Download files"). Para conferir pela linha de comando com o pypi-attestations:

python -m pip install pypi-attestations
pypi-attestations verify pypi \
  --repository https://github.com/usezn/zn \
  pypi:zn_gate-1.5.0-py3-none-any.whl

6. A tag da versão

A partir da 1.12.0, a tag vX.Y.Z é criada e assinada pelo workflow Tag release com o gitsign (assinatura sem chaves do Sigstore): a assinatura cita esse workflow, não uma pessoa, e o workflow Release se recusa a publicar uma tag desse commit sem essa assinatura. Com o gitsign 0.17 ou posterior, em um clone do repositório:

git fetch origin tag v1.12.0
gitsign verify-tag v1.12.0 \
  --certificate-identity https://github.com/usezn/zn/.github/workflows/tag-release.yml@refs/heads/main \
  --certificate-oidc-issuer https://token.actions.githubusercontent.com

As tags até a 1.11.x não são assinadas.

Se algo não coincidir

Não instale os arquivos. Informe em particular, como descrito em SECURITY.md.