Repository navigation
feat(workflows)!: step 8, format-agnostic release signing through the key chain - #50
seantronsen wants to merge 9 commits into
Conversation
c1e044b to
5a0ca6e
Compare
|
Looking at this because of OpenCHAMI/github-actions-testbed#13. So we're only signing the checksum list so package signing is up to the package distributor now? Will we be distributing our own packages or is that out-of-scope? @alexlovelltroy @travisbcotton |
@synackd It depends a bit on what you mean, but here's my answer as I understand the question. Yes, we'll distribute our own packages; that's in scope. In the new design, publishing packages to distro repositories (
Why sign only the checksums file? Mostly simplicity. It's a Debian-flavored strategy: one signature over |
5a0ca6e to
1a033b7
Compare
1a033b7 to
f99ee0a
Compare
f99ee0a to
f497be0
Compare
f497be0 to
fa2b880
Compare
fa2b880 to
838ba4a
Compare
synackd
left a comment
There was a problem hiding this comment.
I found no new regression in the rebased changes, but I am withholding approval until the corresponding testbed is updated and its results demonstrate the current revision working. See: OpenCHAMI/github-actions-testbed#13 (comment)
Signed-off-by: Sean Tronsen <sean.tronsen@gmail.com>
Signed-off-by: Sean Tronsen <sean.tronsen@gmail.com>
Signed-off-by: Sean Tronsen <sean.tronsen@gmail.com>
…sum signing Signed-off-by: Sean Tronsen <sean.tronsen@gmail.com>
Signed-off-by: Sean Tronsen <sean.tronsen@gmail.com>
Signed-off-by: Sean Tronsen <sean.tronsen@gmail.com>
Signed-off-by: Sean Tronsen <sean.tronsen@gmail.com>
Signed-off-by: Sean Tronsen <sean.tronsen@gmail.com>
Signed-off-by: Sean Tronsen <sean.tronsen@gmail.com>
838ba4a to
0499457
Compare
Description
Implements this repo's side of #43 (decision A2): releases are signed through the existing key chain (root key -> repo key -> per-run release key), but format-agnostically. Packages ship unsigned; one signature over GoReleaser's
checksums.txtcovers every package, archive, and binary. A central repo (todo-signing-repo, not built yet) later verifies the chain and publishes to dnf/apt with its own archive key.gpg-sign-artifacts: rewritten as one job. Creates a 1-day release key, certifies it with the repo key, signschecksums.txt, verifies, and uploadschecksums.txt.asc+pubkey-{signing,repo,org}.asc. Outputs verification notes for the release. Tag pushes only.gpg-verify-trust-chain: rewritten. Checks the chain against a pinned root key fingerprint, the repo key's certified name, expiry/revocation, and file signatures. The central repo will reuse it.release-modify(new): appends/replaces notes and adds/replaces files on a draft release.release-publish(renamed frompublish-release): both it andrelease-modifyfail if the release is already public.build-release-goreleaser: nfpm package signing removed.docs/(workflows, actions, GoReleaser, signing, distribution, Makefile.common).Stacked on #48. Closes #43.
Breaking changes
build-publish-container-goreleaser,go-build-release,docker-build-release,build-rpm-quadlet,validate-rpm-quadlet,release-signed-artifacts, and thegpg-configure-release-keys,gpg-sign-rpm,gpg-check-key-expirationactions.publish-release->release-publish.build-release-goreleaserdrops thegpg-key/gpg-key-passphrasesecrets andGPG_KEY_PATH; configs still referencing{{ .Env.GPG_KEY_PATH }}fail to render.checksum.name_template: checksums.txtand only the repo key secret (GPG_REPO_CERT_KEY_B64);GPG_REPO_KEY_B64is unused.Caveats
<owner>/<repo> RPM Signing Key). Simpler than a per-repo fingerprint list, but one mis-named certification by the root key holder would let a repo publish as another. Switching to a list later only touches the central repo.Optional improvements (not in this PR)
releaseEnvironment for the repo key, plus an org-widev*tag ruleset. Environments are per repo and can't be enforced org-wide, and without the ruleset anyone who can push av*tag still gets the key; together they mainly help where write access is broader than the set of maintainers who tag releases.Testing
Testbed: OpenCHAMI/github-actions-testbed#13 (signing runs on a
v*tag push there). Also tested locally: signing/verification failure cases in podman, a real GoReleaser snapshot signed and verified end to end, andrelease-modify/release-publishlogic against a stubbedgh.Checklist
make test(or equivalent) locally and all tests passgit commit -s) with my real name and email<filename>.licensesidecarLICENSES/directoryType of Change