@@ -6,3 +6,49 @@ from source before changing any trust behavior.
66
77Do not add private keys, credentials, or personal registry configuration to this
88repository.
9+
10+ ## Signature format: legacy ` .sig ` tag, not the new bundle format
11+
12+ Bluefin images must be signed so that ** podman, skopeo and ` bootc switch ` can verify
13+ them** — not merely so that ` cosign verify ` passes. Those are different requirements,
14+ and conflating them has already cost the project months of unsigned images.
15+
16+ ` containers/image ` , the library behind all three tools, discovers a signature only at
17+ the legacy tag:
18+
19+ ```
20+ sha256-<image-digest>.sig
21+ ```
22+
23+ It does ** not** consult the OCI 1.1 referrers API — and GHCR does not implement
24+ ` /referrers ` anyway, returning 404. So a signature written in Sigstore's newer bundle
25+ format (attached as an OCI referrer under a bare ` sha256-<digest> ` tag) is invisible to
26+ a ` policy.json ` ` sigstoreSigned ` entry, even though it is a perfectly valid signature.
27+
28+ ** cosign 3.x flipped ` --new-bundle-format ` to default ` true ` .** Every image built after
29+ that default reached our pipeline (~ 2026-06-08) is signed in a way podman cannot see.
30+ See projectbluefin/common #977 for the inventory and projectbluefin/actions #420 for the
31+ fix.
32+
33+ ### Why CI did not catch it
34+
35+ ` cosign verify ` accepts ** both** formats. The signing workflow signed, verified, and
36+ reported success on every run throughout the regression. Verification with cosign is
37+ therefore * not* sufficient evidence that an image is usable by our own consumers.
38+
39+ ### What to check
40+
41+ When touching anything in the signing path, confirm the legacy tag exists in the
42+ registry rather than trusting a green ` cosign verify ` :
43+
44+ ``` bash
45+ DIGEST=$( skopeo inspect --format ' {{.Digest}}' docker://ghcr.io/projectbluefin/bluefin:stable)
46+ skopeo inspect " docker://ghcr.io/projectbluefin/bluefin:${DIGEST/:/ -} .sig" > /dev/null \
47+ && echo " signature visible to podman/bootc" \
48+ || echo " NOT verifiable by podman/bootc"
49+ ```
50+
51+ ` projectbluefin/actions ` enforces this automatically in ` sign-and-publish ` via the
52+ ` Assert legacy .sig tag exists ` step. Do not set ` new-bundle-format: "true" ` on that
53+ action unless every consumer of the image verifies with cosign rather than with
54+ podman/bootc policy.
0 commit comments