Verifying Signed Artifacts
These artifacts are cryptographically signed using Sigstore Cosign:
- Container images
- Helm charts
This ensures that the images you pull are authentic, tamper-proof, and built by the official Foreseerr release pipeline.
Additionally each container image also includes a CycloneDX SBOM (Software Bill of Materials) attestation, generated with Trivy, providing transparency about all dependencies included in the image.
Prerequisites
You will need the following tools installed:
To verify images:
Verifying Signed Images
Image Locations
Official Foreseerr images are available from:
- GitHub Container Registry (GHCR):
ghcr.io/selmant/foreseerr:<tag> - Docker Hub:
selmantr/foreseerr:<tag>
You can view all available tags on the Foreseerr Releases page.
Verifying a Specific Release Tag
Each tagged release (for example v0.1.0) is immutable and cryptographically signed.
Verification should always be performed using the image digest (SHA256).
Retrieve the Image Digest
- Docker
- Podman / Skopeo
docker buildx imagetools inspect ghcr.io/selmant/foreseerr:v0.1.0 --format '{{json .Manifest.Digest}}' | tr -d '"'
skopeo inspect docker://ghcr.io/selmant/foreseerr:v0.1.0 --format '{{.Digest}}'
Example output:
sha256:abcd1234...
Verify the Image Signature
- GitHub Container Registry (GHCR)
- Docker Hub
cosign verify ghcr.io/selmant/foreseerr@sha256:abcd1234... \
--certificate-identity "https://github.com/selmant/foreseerr/.github/workflows/release.yml@refs/tags/v0.1.0" \
--certificate-oidc-issuer "https://token.actions.githubusercontent.com"
cosign verify selmantr/foreseerr@sha256:abcd1234... \
--certificate-identity "https://github.com/selmant/foreseerr/.github/workflows/release.yml@refs/tags/v0.1.0" \
--certificate-oidc-issuer "https://token.actions.githubusercontent.com"
Verification for ghcr.io/selmant/foreseerr@sha256:abcd1234...
The following checks were performed:
- Cosign claims validated
- Signatures verified against the transparency log
- Certificate issued by Fulcio to the expected workflow identity
Verifying the latest Tag
The latest tag is mutable, meaning it will change with each new release.
Always verify the digest that latest currently points to.
Retrieve the Digest for latest
- Docker
- Podman / Skopeo
docker buildx imagetools inspect ghcr.io/selmant/foreseerr:latest --format '{{json .Manifest.Digest}}' | tr -d '"'
skopeo inspect docker://ghcr.io/selmant/foreseerr:latest --format '{{.Digest}}'
Example output:
sha256:abcd1234...
Verify the Signature
- GHCR
- Docker Hub
cosign verify ghcr.io/selmant/foreseerr@sha256:abcd1234... \
--certificate-identity-regexp "https://github.com/selmant/foreseerr/.github/workflows/release.yml@refs/tags/v.*" \
--certificate-oidc-issuer "https://token.actions.githubusercontent.com"
cosign verify selmantr/foreseerr@sha256:abcd1234... \
--certificate-identity-regexp "https://github.com/selmant/foreseerr/.github/workflows/release.yml@refs/tags/v.*" \
--certificate-oidc-issuer "https://token.actions.githubusercontent.com"
The wildcard v.* ensures verification works for any versioned release that latest represents.
Verifying SBOM Attestations
Each image includes a CycloneDX SBOM attestation.
Verify the Attestation
cosign verify-attestation ghcr.io/selmant/foreseerr@sha256:abcd1234... \
--type cyclonedx \
--certificate-identity "https://github.com/selmant/foreseerr/.github/workflows/release.yml@refs/tags/v0.1.0" \
--certificate-oidc-issuer "https://token.actions.githubusercontent.com"
Verification for ghcr.io/selmant/foreseerr@sha256:abcd1234...
The following checks were performed:
- Cosign claims validated
- Signatures verified against the transparency log
- Certificate issued by Fulcio to the expected workflow identity
Extract the SBOM for Inspection
cosign verify-attestation ghcr.io/selmant/foreseerr@sha256:abcd1234... \
--type cyclonedx \
--certificate-identity "https://github.com/selmant/foreseerr/.github/workflows/release.yml@refs/tags/v0.1.0" \
--certificate-oidc-issuer "https://token.actions.githubusercontent.com" | jq -r '.payload | @base64d' > sbom.json
You can open sbom.json in a CycloneDX viewer or analyse it with Trivy or Dependency-Track.
Expected Certificate Identity
The expected certificate identity for all signed Foreseerr images is:
https://github.com/selmant/foreseerr/.github/workflows/release.yml@refs/tags/v*
This confirms that the image was:
- Built by the official Foreseerr Release workflow
- Produced from the selmant/foreseerr repository
- Signed using GitHub’s OIDC identity via Sigstore Fulcio
Example: Full Verification Flow
- Docker
- Podman / Skopeo
DIGEST=$(docker buildx imagetools inspect ghcr.io/selmant/foreseerr:latest --format '{{json .Manifest.Digest}}' | tr -d '"')
cosign verify ghcr.io/selmant/foreseerr@"$DIGEST" \
--certificate-identity-regexp "https://github.com/selmant/foreseerr/.github/workflows/release.yml@refs/tags/v.*" \
--certificate-oidc-issuer "https://token.actions.githubusercontent.com"
cosign verify-attestation ghcr.io/selmant/foreseerr@"$DIGEST" \
--type cyclonedx \
--certificate-identity-regexp "https://github.com/selmant/foreseerr/.github/workflows/release.yml@refs/tags/v.*" \
--certificate-oidc-issuer "https://token.actions.githubusercontent.com"
DIGEST=$(skopeo inspect docker://ghcr.io/selmant/foreseerr:latest --format '{{.Digest}}')
cosign verify ghcr.io/selmant/foreseerr@"$DIGEST" \
--certificate-identity-regexp "https://github.com/selmant/foreseerr/.github/workflows/release.yml@refs/tags/v.*" \
--certificate-oidc-issuer "https://token.actions.githubusercontent.com"
Verifying Signed Helm charts
Helm Chart Locations
Official Foreseerr helm charts are available from:
- GitHub Container Registry (GHCR):
ghcr.io/selmant/foreseerr/foreseerr-chart:<tag>
You can view all available tags on the Foreseerr package page.
Verifying a Specific Release Tag
Each tagged release (for example 3.7.0) is immutable and cryptographically signed.
Verification should always be performed using the image digest (SHA256).
Retrieve the Helm Chart Digest
- Docker
- Podman / Skopeo
docker buildx imagetools inspect ghcr.io/selmant/foreseerr/foreseerr-chart:3.7.0 --format '{{json .Manifest.Digest}}' | tr -d '"'
skopeo inspect docker://ghcr.io/selmant/foreseerr/foreseerr-chart:3.7.0 --format '{{.Digest}}'
Example output:
sha256:abcd1234...
Verify the Helm Chart Signature
cosign verify ghcr.io/selmant/foreseerr/foreseerr-chart@sha256:abcd1234... \
--certificate-identity "https://github.com/selmant/foreseerr/.github/workflows/helm.yml@refs/heads/develop" \
--certificate-oidc-issuer "https://token.actions.githubusercontent.com"
Verification for ghcr.io/selmant/foreseerr/foreseerr-chart@sha256:abcd1234...
The following checks were performed:
- Cosign claims validated
- Signatures verified against the transparency log
- Certificate issued by Fulcio to the expected workflow identity
Expected Certificate Identity
The expected certificate identity for all signed Foreseerr charts is:
https://github.com/selmant/foreseerr/.github/workflows/helm.yml@refs/heads/develop
This confirms that the image was:
- Built by the official Foreseerr Release workflow
- Produced from the selmant/foreseerr repository
- Signed using GitHub’s OIDC identity via Sigstore Fulcio
Example: Full Verification Flow
- Docker
- Podman / Skopeo
DIGEST=$(docker buildx imagetools inspect ghcr.io/selmant/foreseerr/foreseerr-chart:3.7.0 --format '{{json .Manifest.Digest}}' | tr -d '"')
cosign verify ghcr.io/selmant/foreseerr/foreseerr-chart@"$DIGEST" \
--certificate-identity-regexp "https://github.com/selmant/foreseerr/.github/workflows/helm.yml@refs/heads/develop" \
--certificate-oidc-issuer "https://token.actions.githubusercontent.com"
cosign verify-attestation ghcr.io/selmant/foreseerr/foreseerr-chart@"$DIGEST" \
--type cyclonedx \
--certificate-identity-regexp "https://github.com/selmant/foreseerr/.github/workflows/helm.yml@refs/heads/develop" \
--certificate-oidc-issuer "https://token.actions.githubusercontent.com"
DIGEST=$(skopeo inspect docker://ghcr.io/selmant/foreseerr/foreseerr-chart:3.7.0 --format '{{.Digest}}')
cosign verify ghcr.io/selmant/foreseerr/foreseerr-chart@"$DIGEST" \
--certificate-identity-regexp "https://github.com/selmant/foreseerr/.github/workflows/helm.yml@refs/heads/develop" \
--certificate-oidc-issuer "https://token.actions.githubusercontent.com"
Troubleshooting
| Issue | Likely Cause | Suggested Fix |
|---|---|---|
no matching signatures | Incorrect digest or tag | Retrieve the digest again using Docker or Skopeo |
certificate identity does not match expected | Workflow reference changed | Ensure your --certificate-identity matches this documentation |
cosign: command not found | Cosign not installed | Install Cosign from the official release |
certificate expired | Old release | Verify a newer tag or digest |