Skip to content

Verify a release

Every install route obtains the same signed artifacts, so the verification steps are written once here. The binary route runs them for you as part of its paste block; the Docker and Kubernetes routes verify the image and the manifest separately, before you apply them.

A signature that does not verify means the file is not ours. Do not run it.

SHA256SUMS lists both archives with bare relative names, so -c works in whatever directory you downloaded into:

Terminal window
sha256sum -c SHA256SUMS

Expect one OK per archive you downloaded. Add --ignore-missing if you only fetched one of the two.

A checksum fetched from the same host as the artifact proves the download was not truncated. It proves nothing about provenance: whoever can serve you a modified tarball can serve a matching SHA256SUMS beside it. The signature is the control that answers that question, which is why it runs first and the checksum runs against a file it has already vouched for.

Signing is cosign keyless: there is no public key to trust and no key of ours to leak. The signing identity is a GitHub Actions workflow, and the attestation is in the public Rekor transparency log.

Each artifact carries its own <name>.cosign.bundle:

Terminal window
cosign verify-blob \
--bundle SHA256SUMS.cosign.bundle \
--certificate-identity <the identity printed in that release's notes> \
--certificate-oidc-issuer https://token.actions.githubusercontent.com \
SHA256SUMS

For agent-v0.1.3 that identity is:

https://github.com/WireWatch/wirewatch/.github/workflows/agent-release.yml@refs/tags/agent-v0.1.3

That string names the producing repository, which is private, while the releases are hosted in the public one. It is an OIDC subject for keyless signing, not a link — nothing resolves it, and a 404 there is expected rather than a problem.

The archives and agent-k8s.yaml verify the same way against their own bundles.

The image is signed by digest, never by tag. Read the digest first — it is the Digest: line:

Terminal window
docker buildx imagetools inspect ghcr.io/wirewatch/agent:0.1.3

Then verify that digest, written in place of <digest>:

Terminal window
cosign verify \
--certificate-identity https://github.com/WireWatch/wirewatch/.github/workflows/agent-release.yml@refs/tags/agent-v0.1.3 \
--certificate-oidc-issuer https://token.actions.githubusercontent.com \
ghcr.io/wirewatch/agent@<digest>

It exits 0 and reports the workflow, the tag and the source commit that built the image.