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>

Verifying Helm Charts#

Charts are published three ways from the same build: as release assets on the matching tag, as OCI artifacts in GHCR, and indexed at https://docs.jans.io/charts (the index points at the release assets).

Fetch the chart. Either source gives the same file, but the signature bundle and the provenance are release assets, so download them alongside it:

helm repo add janssen https://docs.jans.io/charts
helm pull janssen/janssen --version <VERSION>

gh release download v<VERSION> --repo JanssenProject/jans \
  --pattern 'janssen-<VERSION>.tgz.bundle' \
  --pattern 'helm-charts.intoto.jsonl'

With janssen-<VERSION>.tgz, its .bundle and helm-charts.intoto.jsonl in the working directory:

slsa-verifier verify-artifact janssen-<VERSION>.tgz \
  --provenance-path helm-charts.intoto.jsonl \
  --source-uri github.com/JanssenProject/jans \
  --source-tag v<VERSION>

cosign verify-blob \
  --bundle janssen-<VERSION>.tgz.bundle \
  --certificate-identity-regexp "https://github.com/JanssenProject/jans/.github/workflows/release-helm-charts\\.yml@refs/tags/.*" \
  --certificate-oidc-issuer "https://token.actions.githubusercontent.com" \
  janssen-<VERSION>.tgz

Verify the OCI copy and its registry attestation:

helm pull oci://ghcr.io/janssenproject/charts/janssen --version <VERSION>

gh attestation verify oci://ghcr.io/janssenproject/charts/janssen:<VERSION> \
  --repo JanssenProject/jans

Charts released before v2.0.0 predate Cosign signing and carry neither a .bundle sidecar nor provenance.


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
Maven artifacts maven-artifacts.intoto.jsonl provenance-maven
Helm charts helm-charts.intoto.jsonl provenance-charts
Docker images (GHCR) Registry attestation docker (via actions/attest-build-provenance)
Helm charts (GHCR) Registry attestation publish (via actions/attest-build-provenance)

Further Reading#