Skip to content

SLSA Artifact Verification#

Every release of the Janssen Project ships with SLSA Build Level 3 provenance attestations alongside the existing cosign signatures. This document explains how to verify both binary/wheel/WASM artifacts and Docker images.


Prerequisites#

Install slsa-verifier#

macOS (Homebrew)

brew install slsa-verifier

Go install

go install github.com/slsa-framework/slsa-verifier/v2/cli/slsa-verifier@latest

GitHub Release download
Download the latest binary from https://github.com/slsa-framework/slsa-verifier/releases/latest and place it on your PATH.

Verify the installation

slsa-verifier version

Install cosign (for signature verification)#

brew install cosign         # macOS
# or
go install github.com/sigstore/cosign/v2/cmd/cosign@latest

Verifying Binary / Wheel / WASM Artifacts#

Every GitHub Release contains one .intoto.jsonl provenance file per artifact family, generated by the slsa-framework/slsa-github-generator reusable workflow. A single provenance file covers all artifacts in the same family (e.g., binary.intoto.jsonl covers every DEB and RPM package). See the Artifact Families table for the exact filename to use with each artifact type.

General command#

slsa-verifier verify-artifact <ARTIFACT_FILE> \
  --provenance-path <FAMILY>.intoto.jsonl \
  --source-uri github.com/JanssenProject/jans \
  --source-tag <RELEASE_TAG>

Replace <FAMILY> with the provenance filename for the artifact's family (e.g., binary.intoto.jsonl) and <RELEASE_TAG> with the release tag (e.g., v1.2.0 or nightly).

Examples#

DEB package (Ubuntu 24.04)

slsa-verifier verify-artifact \
  jans_1.2.0-stable~ubuntu24.04_amd64.deb \
  --provenance-path binary.intoto.jsonl \
  --source-uri github.com/JanssenProject/jans \
  --source-tag v1.2.0

RPM package (EL9)

slsa-verifier verify-artifact \
  jans-1.2.0-stable.el9.x86_64.rpm \
  --provenance-path binary.intoto.jsonl \
  --source-uri github.com/JanssenProject/jans \
  --source-tag v1.2.0

Python zipapp

slsa-verifier verify-artifact \
  jans-linux-ubuntu-X86-64-setup.pyz \
  --provenance-path python.intoto.jsonl \
  --source-uri github.com/JanssenProject/jans \
  --source-tag v1.2.0

Cedarling WASM tarball

slsa-verifier verify-artifact \
  cedarling_wasm_1.2.0_pkg.tar.gz \
  --provenance-path wasm.intoto.jsonl \
  --source-uri github.com/JanssenProject/jans \
  --source-tag v1.2.0

Cedarling Python wheel

slsa-verifier verify-artifact \
  cedarling_python-1.2.0-cp311-cp311-manylinux_2_17_x86_64.whl \
  --provenance-path cedarling-python.intoto.jsonl \
  --source-uri github.com/JanssenProject/jans \
  --source-tag v1.2.0

Cedarling Go shared library

slsa-verifier verify-artifact \
  libcedarling_go-1.2.0_x86-64.so \
  --provenance-path cedarling-go.intoto.jsonl \
  --source-uri github.com/JanssenProject/jans \
  --source-tag v1.2.0

Cedarling KrakenD plugin

slsa-verifier verify-artifact \
  cedarling-krakend-amd64-builder-2.9.0-1.2.0.so \
  --provenance-path cedarling-krakend.intoto.jsonl \
  --source-uri github.com/JanssenProject/jans \
  --source-tag v1.2.0

Cedarling UniFFI library / Kotlin binding

slsa-verifier verify-artifact \
  libcedarling_uniffi-1.2.0.so \
  --provenance-path cedarling-uniffi.intoto.jsonl \
  --source-uri github.com/JanssenProject/jans \
  --source-tag v1.2.0

Also verify the cosign bundle signature#

Each artifact also ships with a .bundle sidecar (cosign keyless signature). Verify it alongside the provenance attestation:

cosign verify-blob \
  --bundle <ARTIFACT_FILE>.bundle \
  --certificate-identity-regexp "https://github.com/JanssenProject/jans/.github/workflows/build-packages\\.yml@refs/tags/.*" \
  --certificate-oidc-issuer "https://token.actions.githubusercontent.com" \
  <ARTIFACT_FILE>

Verifying Docker Images#

Docker images published to GHCR (ghcr.io/janssenproject/jans/<image>) carry SLSA provenance attestations generated by actions/attest-build-provenance. The attestation is stored in the registry and can be verified with slsa-verifier or via gh attestation verify.

With slsa-verifier#

slsa-verifier verify-image \
  ghcr.io/janssenproject/jans/<image>@<digest> \
  --source-uri github.com/JanssenProject/jans

Example — auth-server

slsa-verifier verify-image \
  ghcr.io/janssenproject/jans/auth-server@sha256:abc123... \
  --source-uri github.com/JanssenProject/jans

With the GitHub CLI (gh)#

gh attestation verify \
  oci://ghcr.io/janssenproject/jans/<image>@<digest> \
  --owner JanssenProject

Find the image digest#

docker pull ghcr.io/janssenproject/jans/<image>:<tag>
docker inspect --format='{{index .RepoDigests 0}}' ghcr.io/janssenproject/jans/<image>:<tag>
# or
cosign triangulate ghcr.io/janssenproject/jans/<image>:<tag>

Also verify the cosign signature on Docker images#

cosign verify \
  --certificate-identity-regexp "https://github.com/JanssenProject/jans/.github/workflows/build-docker-image\\.yml@refs/tags/.*" \
  --certificate-oidc-issuer "https://token.actions.githubusercontent.com" \
  ghcr.io/janssenproject/jans/<image>@<digest>

Artifact Families and Provenance Files#

Artifact family Provenance file Workflow job
DEB / RPM binary packages binary.intoto.jsonl provenance-binary
Python zipapps (.pyz) python.intoto.jsonl provenance-python
Cedarling WASM tarball wasm.intoto.jsonl provenance-wasm
Cedarling Python wheels cedarling-python.intoto.jsonl provenance-cedarling-python
Cedarling Go libraries cedarling-go.intoto.jsonl provenance-cedarling-go
Cedarling KrakenD plugins cedarling-krakend.intoto.jsonl provenance-cedarling-krakend
Cedarling UniFFI / Kotlin cedarling-uniffi.intoto.jsonl provenance-cedarling-uniffi
Demo source zips / Chrome extension demo.intoto.jsonl provenance-demo
Docker images (GHCR) Registry attestation docker (via actions/attest-build-provenance)

Further Reading#