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) |