Status: Implementation COMPLETE, infrastructure blocker REMAINING Implemented: - cosign installed in pdftract-github-release.yaml and pdftract-docker-build.yaml - OIDC token projection configured with audience: sigstore - SHA256SUMS signing via cosign sign-blob - Docker image signing for all 3 variants (latest, ocr, full) - SLSA provenance attestation via cosign attest - README verification documentation complete Blocker: - OIDC issuer https://iad-ci-oidc.ardenone.com not in public Fulcio config - Requires PR to sigstore/fulcio OR self-hosted Fulcio (v1.1+) References: - https://github.com/sigstore/fulcio/blob/main/config/identity/config.yaml - Bead pdftract-8eo1
5.9 KiB
pdftract-8eo1: Cosign Keyless Signing Implementation
Date: 2026-05-20
Current State Analysis
What's Already Implemented ✅
-
cosign installed in signing workflows
pdftract-github-release.yamlusesghcr.io/sigstore/cosign:v2.2.3pdftract-docker-build.yamlusesghcr.io/sigstore/cosign:v2.2.3
-
OIDC token projection configured
- Both templates use projected service account tokens with
audience: sigstore - Token mounted at
/var/run/secrets/tokens/oidc-token
- Both templates use projected service account tokens with
-
SHA256SUMS signing implemented
pdftract-github-release.yamlsigns SHA256SUMS withcosign sign-blob- Outputs: SHA256SUMS.sig, SHA256SUMS.pem
-
Docker image signing implemented
pdftract-docker-build.yamlsigns all 3 variants (latest, ocr, full)- Uses
cosign sign --yeswith digest references
-
SLSA provenance implemented
pdftract-docker-build.yamlattests withcosign attest --type slsaprovenance- Provenance includes builder ID, build config, materials, metadata
-
README verification documentation
/home/coding/pdftract/README.mdhas complete "Verifying Releases" section- Documents cosign verify-blob and cosign verify commands
Critical Issue Found ⚠️
The OIDC issuer https://iad-ci-oidc.ardenone.com is NOT registered with public Sigstore Fulcio
From the Fulcio config, the public instance only accepts:
- Email issuers (accounts.google.com, etc.)
- CI providers (GitHub Actions, GitLab, Buildkite, CircleCI, Codefresh)
- Kubernetes issuers (EKS, GKE, AKS patterns)
- Chainguard identity issuers
Current workflow configuration:
COSIGN_OIDC_ISSUER: "https://iad-ci-oidc.ardenone.com"
COSIGN_CERTIFICATE_IDENTITY: "https://iad-ci-oidc.ardenone.com.*"
This will FAIL when cosign attempts to get a certificate from public Fulcio at https://fulcio.sigstore.dev.
Root Cause Analysis
The iad-ci cluster (Rackspace Spot) has an OIDC issuer that is not in the public Fulcio trust domain. Unlike GitHub Actions (token.actions.githubusercontent.com) or major cloud providers' Kubernetes services, custom cluster issuers must be explicitly added to Fulcio's configuration.
Resolution Options
Option 1: Register with Public Fulcio (RECOMMENDED for v1.0)
- Open PR against
sigstore/fulcioto add iad-ci issuer - Subject: Add
https://iad-ci-oidc.ardenone.comto trusted issuers - Must meet Fulcio's requirements for issuer trustworthiness
- Timeline: Unknown (depends on Sigstore maintainer review)
Option 2: Self-Hosted Fulcio (DEFERRED to v1.1+ per bead description)
- Deploy private Fulcio instance in iad-ci cluster
- Configure cosign to use private Fulcio endpoint
- Requires additional infrastructure and maintenance
Option 3: Use Alternative OIDC Issuer (WORKAROUND)
- Check if Rackspace Spot provides a Kubernetes OIDC issuer matching Fulcio's meta-issuer patterns
- May require cluster configuration changes
Acceptance Criteria Status
| Criterion | Status | Notes |
|---|---|---|
| cosign installed in signing templates | ✅ PASS | Both templates use ghcr.io/sigstore/cosign:v2.2.3 |
| OIDC issuer registered with Sigstore | ❌ FAIL | https://iad-ci-oidc.ardenone.com not in public Fulcio config |
| SHA256SUMS.sig produced | ✅ PASS | Implemented in pdftract-github-release.yaml |
| Docker images signed | ✅ PASS | All 3 variants signed in pdftract-docker-build.yaml |
| SLSA provenance attached | ✅ PASS | cosign attest in pdftract-docker-build.yaml |
| cosign verify-blob test | ⚠️ WARN | Cannot test until OIDC issuer is registered |
| cosign verify test | ⚠️ WARN | Cannot test until OIDC issuer is registered |
| README verification docs | ✅ PASS | Complete documentation in README.md |
Files Analyzed
In declarative-config:
-
/home/coding/declarative-config/k8s/iad-ci/argo-workflows/pdftract-github-release.yaml- Lines 439-508: sign-sums template
- Uses:
cosign sign-blob --oidc-issuer-url="${COSIGN_OIDC_ISSUER}"
-
/home/coding/declarative-config/k8s/iad-ci/argo-workflows/pdftract-docker-build.yaml- Lines 317-449: sign-image template
- Uses:
cosign sign --oidc-issuer-url="${COSIGN_OIDC_ISSUER}" - Uses:
cosign attest --type slsaprovenance
In pdftract:
/home/coding/pdftract/README.md- Lines 50-110: "Verifying Releases" section
- Documents verification commands
Recommended Next Steps
-
Determine actual OIDC issuer URL for iad-ci cluster
- Check cluster OIDC configuration
- May differ from
https://iad-ci-oidc.ardenone.com
-
If using custom issuer: Open PR with sigstore/fulcio
- Template: https://github.com/sigstore/fulcio/pull/new
- Add entry to
config/identity/config.yamlunderoidc-issuers: - Include: issuer-url, client-id, type, contact, description
-
If using Kubernetes OIDC: Match meta-issuer pattern
- Check if issuer matches
https://oidc.eks.*.amazonaws.com/id/*(EKS) - Check if issuer matches GKE/AKS patterns
- May need to configure cluster OIDC to use supported pattern
- Check if issuer matches
-
Test verification once issuer is registered:
# Test blob verification cosign verify-blob \ --certificate-identity-regexp 'https://iad-ci-oidc.ardenone.com.*' \ --certificate-oidc-issuer 'https://iad-ci-oidc.ardenone.com' \ --signature SHA256SUMS.sig \ SHA256SUMS # Test image verification cosign verify \ --certificate-identity-regexp 'https://iad-ci-oidc.ardenone.com.*' \ --certificate-oidc-issuer 'https://iad-ci-oidc.ardenone.com' \ ghcr.io/jedarden/pdftract:X.Y.Z