Verifying a release
Keystone asks you to sign everything it installs. It would be hard to defend if it did not sign itself.
From v0.9.0 every release carries, beside the archives:
| File | What it is |
|---|---|
checksums.txt | SHA-256 of every other file in the release |
checksums.txt.bundle | Sigstore bundle: signature, certificate and transparency-log entry in one file |
checksums.txt.sig, checksums.txt.pem | The same signature in detached form |
keystone_<version>_linux_<arch>.tar.gz.sbom.json | SPDX 2.3 inventory of the modules inside that archive |
Why the signature is not the checksum
checksums.txt proves integrity: the bytes you downloaded are the bytes
that were published. It proves nothing about who published them — whoever can
replace an archive can replace the checksum file sitting next to it.
The signature proves provenance: these bytes were produced by this repository’s release workflow, running on a tag. That is the property that matters for a deployment agent, because whoever controls the agent controls everything it installs afterwards.
There is no private key anywhere in this. Signing is keyless: the workflow exchanges a short-lived OIDC token for a certificate that names it, signs, and the certificate expires. The signature is recorded in Sigstore’s public transparency log, which is what makes a forgery detectable rather than merely hard.
Checking it
Needs cosign.
The detached pair is published too, and verifies the same signature:
Current cosign deprecates --signature and --certificate in favour of
--bundle, so prefer the first form; the pair is kept for anything already
written against it.
The first command answers “did this repository’s release workflow produce this list?”; the second answers “is my download on that list?”. Both, in that order, or neither is worth much.
Pin the identity. Dropping --certificate-identity-regexp makes the
verification accept a signature from any workflow in any repository, which
passes just as happily against an attacker’s fork. Verifying against an
unpinned identity is theatre.
The SBOM
One SPDX 2.3 document per archive, produced by syft, listing every Go module compiled into the binaries inside it.
The SBOMs are listed in checksums.txt, so the signature covers them too.
A Go binary already embeds its own module list — go version -m keystone shows
it — but that is not a format a scanner, an auditor or a customer can consume,
and it requires having the binary to hand rather than the release page.
What this does not prove
- Not that the build is reproducible. The signature says these bytes came from that workflow, not that you would get the same bytes by rebuilding the source yourself.
- Not that the source is sound. Provenance is not review. A signed release of a compromised commit verifies perfectly.
- Nothing about releases before v0.9.0. Earlier tags carry
checksums.txtand nothing else; they cannot be verified retroactively, because the certificate has to be minted at signing time.