Verify a conda-sigstore publication#

The conda publishing workflow signs a CEP 27 publication statement for the exact package uploaded to https://conda.anaconda.org/jezdez. It verifies the bundle before upload and retains it in GitHub, alongside separate SLSA build provenance.

The existing 0.1.2 conda package has SLSA provenance only and cannot pass the CEP 27 publication check below. Use a package published after CEP 27 signing was added to the workflow.

Download the package and bundle#

Install conda-sigstore, GitHub CLI, and curl. Authenticate GitHub CLI with gh auth login if needed. The commands below use a POSIX shell.

Choose the exact package filename from the jezdez channel’s files and find the corresponding successful publication run in the repository’s workflows. Replace VERSION, BUILD, and PUBLISH_RUN_ID below. If the release workflow called the conda publishing workflow, use that release run.

package='conda-sigstore-VERSION-BUILD.conda'
run_id='PUBLISH_RUN_ID'

curl --fail --location --output "$package" \
  "https://conda.anaconda.org/jezdez/noarch/$package"
gh run download "$run_id" --repo conda-incubator/conda-sigstore \
  --name conda-publication-attestation --dir evidence

The workflow artifact contains one raw Sigstore bundle named $package.sigstore.json. GitHub Actions artifacts expire according to the repository’s retention settings. If it is no longer available, use the attestation download method below.

Verify the publication#

conda sigstore verify "$package" \
  --bundle "evidence/$package.sigstore.json" \
  --channel https://conda.anaconda.org/jezdez

Verification checks the Sigstore evidence, exact package filename and SHA-256, CEP 27 statement, and target channel. The result reports the authenticated certificate identity and OIDC issuer. It does not establish channel permission or package safety. SLSA provenance describes the build and does not substitute for the CEP 27 statement.

To require a particular signer, obtain the expected workflow path and Git ref from trusted release metadata, then set EXPECTED_CERTIFICATE_IDENTITY to https://github.com/conda-incubator/conda-sigstore/.github/workflows/WORKFLOW_FILE@GIT_REF for a publication made after the repository transfer. Earlier publications, including the original 0.1.3 package, retain https://github.com/jezdez/conda-sigstore/.github/workflows/WORKFLOW_FILE@GIT_REF. The transfer does not rewrite existing certificates. Select the exact identity for the publication being checked from trusted release metadata, and do not derive it solely from the bundle. Supply both signer options together:

conda sigstore verify "$package" \
  --bundle "evidence/$package.sigstore.json" \
  --channel https://conda.anaconda.org/jezdez \
  --cert-identity "$EXPECTED_CERTIFICATE_IDENTITY" \
  --cert-oidc-issuer https://token.actions.githubusercontent.com

Retrieve the bundle from GitHub’s attestation store#

The workflow also records the publication bundle in GitHub’s attestation store. For publications made after the transfer, retrieve it by the downloaded package’s digest, filtering for the CEP 27 predicate:

gh attestation download "$package" --repo conda-incubator/conda-sigstore \
  --predicate-type https://schemas.conda.org/attestations-publish-1.schema.json

For a publication made before the transfer, replace --repo conda-incubator/conda-sigstore with --owner jezdez. Historical bundles remain available through the original owner. The repository lookup does not retrieve them after the transfer.

GitHub CLI writes raw bundles as JSON Lines to sha256:DIGEST.jsonl on Linux and macOS or sha256-DIGEST.jsonl on Windows. Use the filename printed by the command. With jq installed, convert those lines into the bundle array accepted by conda sigstore verify:

jq -s . 'sha256:DIGEST.jsonl' > publication-bundles.json
conda sigstore verify "$package" --bundle publication-bundles.json \
  --channel https://conda.anaconda.org/jezdez

You can add the paired signer options here too. A missing CEP 27 bundle is a verification failure, even if SLSA evidence is available.

These commands retrieve evidence from GitHub and do not require attestation sidecars on Anaconda.org. Installing the package does not automatically run this check. See Install verification for the separate opt-in installation behavior and its transport requirements.