security(docs): publish the minisign public key adopters verify with (#1062) #1066
No reviewers
Labels
No labels
bump
major
bump
minor
bump
patch
kind/bug
kind/chore
kind/docs
kind/feature
priority/critical
priority/high
priority/low
priority/medium
size/L
size/M
size/S
size/XL
No milestone
No project
No assignees
3 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
frankenbit/release-toolkit!1066
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "i/1062-publish-minisign-public-key"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Refs frankenbit/release-toolkit#1062
What
The FETCH arm has authenticated
checksums.txtagainst an operator-managed minisign root since #513, and #1058 made signing mandatory. The public key itself was never published. An adopter followingdocs/SECURITY.mdhad no way to obtain the key the whole verification depends on.minisign.pubat the repo root — the key releases are signed withdocs/SECURITY.md§ Verifying a release — names the file and gives the two commandsBoth are needed and neither substitutes for the other.
Verified, not asserted
The documented adopter path is the one that actually validates what we publish — I ran it against the real release rather than reasoning about it.
The caveat is in the doc, deliberately
Copying the key from this repo is a bootstrap, not a trust decision: an actor who could rewrite this repo could rewrite the key beside the signature it validates. The section says so and tells adopters to pin the contents on their side, so a later change here arrives as a visible diff rather than being adopted silently.
That is the same audit-boundary caveat
SECURITY.mdalready makes about ref resolution, applied to the key — rather than implying the repo can vouch for itself.What this does NOT do
No workflow changes. Seven workflows already read
vars.RELEASE_TOOLKIT_MINISIGN_PUBLIC_KEY—goreleaser.yml:835plus six reusable gates. That variable is an instance-side setting, not a repo change, and it is what makes theadopters can fetch the published assetarm pass. This PR is only the adopter-facing half.⚠️ I initially reported that the key was unwired and needed a PR to wire it. That was wrong — I read the bootstrap step and inferred, instead of reading the step that raised the error. The log showed
rt v0.56.1printing successfully; the failure came two steps later inmeasure the cache-hit path, which passes the variable through asRT_MINISIGN_PUBLIC_KEY. The names on that one line are easy to transpose: the left side is the env var, the right side is the variable to create.Context
v0.56.1 published a tag and an empty release on 2026-08-28 —
cfffa82added the signing requirement 14 minutes before the cut, and neither of its two inputs existed (rt#1062). Both are now provisioned and the release was repaired byworkflow_dispatchwithallow_asset_replacement; it now carrieschecksums.txt,checksums.txt.minisigandrt-linux-amd64, all verifying.Filed at ~03:20 by @quartermaster with @bosun unreachable. Reviewers: this is docs plus one new file; the load-bearing claim is the byte-identity and the live verify above, both re-runnable.
a748f991609b8e8e6edaExact-head review of rt#1066. The public key file and SECURITY.md adopter procedure are consistent with the signing contract: the repository key matches the live operator key, and the live v0.56.1 checksums signature verifies with it; the separate sha256 manifest check remains required. The documented bootstrap caveat correctly preserves the trust boundary. Fragment-check and diff checks pass, and Forgejo CI is 25/25 success with zero pending or failed contexts. Approving this exact head.