feat(release): teken de release-manifest met minisign (#1014) #1026

Merged
brenno merged 2 commits from feat/release-signing-minisign into main 2026-07-31 20:24:50 +00:00
Owner

Implementeert #1014 (Route A): de release-manifest SHA256SUMS krijgt een minisign (Ed25519) detached signature SHA256SUMS.minisig. Omdat SHA256SUMS elk artefact via zijn hash dekt, verankert één handtekening over de lijst de héle release (alle vier platformen + de SBOM's) — het Debian Release/Release.gpg-model.

Ontwerp

  • Lokaal-handmatig tekenen (make sign-releasescripts/sign_release.sh); de private sleutel komt nooit als secret op een runner — dezelfde least-privilege-keuze als de macOS-notarisatie. Het script tekent, verifieert meteen tegen minisign.pub, en ruimt de .minisig op als die verify faalt (getoetst: exit 1 → bestand weg).
  • Publieke sleutel minisign.pub in de repo-root, sleutel-ID 9A467E62F323426D. Verifiëren: minisign -Vm SHA256SUMS -p minisign.pub.
  • minisign boven GPG om dezelfde reden als SSH boven GPG bij commit-ondertekening: één klein bestand, geen keyring/web-of-trust.
  • Poort test/release_signing_test.dart pint de sleutel-ID (een verwisseling laat de bouw falen) en bewaakt dat de private helft niet in de repo belandt (.gitignore-vangnet).

Reviews (beide akkoord-met-kanttekening, alle bevindingen verwerkt)

  • Bewaker: kern ongeschonden (geen lock-in, additief, decks blijven Markdown). Weggewerkt: de tegensprekende "#1014 still-open"-regel, de minisign-boven-GPG-motivering, en een out-of-band kruiscontrole-zin.
  • Security-architect: manifest-tekenen is het juiste model, sleutel off-runner, teken/verify fail-closed. Weggewerkt: sleutel-ID als vast anker in SECURITY.md én gepind in de poort (single-host-vertrouwenswortel afgedekt), .minisig-opruiming bij verify-fout, zwaardere wachtwoord-aanbeveling, en de "alleen gelijste bestanden gedekt"-nuance.

Poort

make check groen; make check-secrets schoon; shellcheck OK; end-to-end getoetst met de echte sleutel (tekenen, zelf-verifiëren, onafhankelijke herverificatie, én de faal-opruiming).

Onderdeel van de veilige-distributievraag #520.

Implementeert #1014 (Route A): de release-manifest `SHA256SUMS` krijgt een **minisign (Ed25519) detached signature** `SHA256SUMS.minisig`. Omdat `SHA256SUMS` elk artefact via zijn hash dekt, verankert één handtekening over de lijst de héle release (alle vier platformen + de SBOM's) — het Debian `Release`/`Release.gpg`-model. ## Ontwerp - **Lokaal-handmatig tekenen** (`make sign-release` → `scripts/sign_release.sh`); de private sleutel komt nooit als secret op een runner — dezelfde least-privilege-keuze als de macOS-notarisatie. Het script tekent, verifieert meteen tegen `minisign.pub`, en ruimt de `.minisig` op als die verify faalt (getoetst: exit 1 → bestand weg). - **Publieke sleutel** `minisign.pub` in de repo-root, sleutel-ID `9A467E62F323426D`. Verifiëren: `minisign -Vm SHA256SUMS -p minisign.pub`. - **minisign boven GPG** om dezelfde reden als SSH boven GPG bij commit-ondertekening: één klein bestand, geen keyring/web-of-trust. - **Poort** `test/release_signing_test.dart` pint de sleutel-ID (een verwisseling laat de bouw falen) en bewaakt dat de private helft niet in de repo belandt (`.gitignore`-vangnet). ## Reviews (beide akkoord-met-kanttekening, alle bevindingen verwerkt) - **Bewaker**: kern ongeschonden (geen lock-in, additief, decks blijven Markdown). Weggewerkt: de tegensprekende "#1014 still-open"-regel, de minisign-boven-GPG-motivering, en een out-of-band kruiscontrole-zin. - **Security-architect**: manifest-tekenen is het juiste model, sleutel off-runner, teken/verify fail-closed. Weggewerkt: **sleutel-ID als vast anker** in SECURITY.md én gepind in de poort (single-host-vertrouwenswortel afgedekt), `.minisig`-opruiming bij verify-fout, zwaardere wachtwoord-aanbeveling, en de "alleen gelijste bestanden gedekt"-nuance. ## Poort `make check` groen; `make check-secrets` schoon; shellcheck OK; end-to-end getoetst met de echte sleutel (tekenen, zelf-verifiëren, onafhankelijke herverificatie, én de faal-opruiming). Onderdeel van de veilige-distributievraag #520.
De release-manifest `SHA256SUMS` krijgt een minisign (Ed25519) detached
signature `SHA256SUMS.minisig`, zodat de checksum-keten een verifieerbaar
herkomst-anker heeft. Omdat SHA256SUMS elk artefact via zijn hash dekt,
verankert één handtekening over de lijst de héle release (alle vier platformen
+ de SBOM's) — het Debian Release/Release.gpg-model.

Ondertekenen is een lokale, handmatige stap (`make sign-release` →
`scripts/sign_release.sh`): de private sleutel komt nooit als secret op een
runner — dezelfde least-privilege-keuze als de macOS-notarisatie. Het script
tekent, verifieert meteen tegen `minisign.pub`, en ruimt de handtekening op als
die verify faalt (geen half product). minisign boven GPG om dezelfde reden als
SSH boven GPG bij commit-ondertekening: één klein bestand, geen keyring.

De publieke sleutel `minisign.pub` staat in de repo-root; de private helft
woont lokaal (`~/.minisign/`, `.gitignore`-vangnet). De poort
`test/release_signing_test.dart` pint de sleutel-ID `9A467E62F323426D`, zodat
een sleutelverwisseling de bouw laat falen, en bewaakt dat de private helft
niet in de repo belandt.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
docs(release): leg de manifest-handtekening en de verificatieroute vast (#1014)
All checks were successful
scans / scans (pull_request) Successful in 3m34s
19d7fdcac4
Werk de documentatie bij op de minisign-ondertekening: SECURITY.md krijgt de
sleutel-ID als vast anker met out-of-band kruiscontrole (spiegel/bron-repo) en
de nuance dat de handtekening alleen de gelijste bestanden dekt; BUILD.md de
eenmalige opzet + release-runbook + de minisign-boven-GPG-motivering; de
release-tekst de verify-instructie (`minisign -Vm SHA256SUMS -p minisign.pub`)
plus de correctie van de onjuiste "Linux warns on first launch"-regel.

KNOWN_LIMITATIONS.md en FAQ.md volgen de nieuwe stand; de ENISA O1-regel is
gedicht (Linux #1014 opgelost, alleen provenance/SLSA rest). Het verouderde
commentaar bij de Checksums-stap in de release-workflow ("zolang er geen
ondertekening is") is bijgewerkt.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
brenno merged commit c36f406e05 into main 2026-07-31 20:24:50 +00:00
Sign in to join this conversation.
No description provided.