Docs / Verify a release

Verify a release

Every SkelaDB release is signed with one SkelaDB release key. Verify the files you download and the images your cluster runs before you trust them. You need cosign 2.x, or OpenSSL for the files alone.

1. The release key

The public key is published once for all releases:

curl -fsSLO https://skeladb.com/releases/cosign.pub
sha256sum cosign.pub        # macOS: shasum -a 256 cosign.pub

The SHA-256 of cosign.pub must be:

RELEASE-KEY-FINGERPRINT-NOT-YET-PUBLISHED

If the line above is not a 64-character hexadecimal fingerprint, or does not match, stop: do not install, and write to security@skeladb.com. To check the fingerprint through a second channel, ask security@skeladb.com to confirm it. Every release also publishes a copy of cosign.pub beside its files; it must be identical.

If the key is ever replaced, the new fingerprint is published here and in the release notes, and releases signed with the old key are listed.

2. The downloads

Each release lives at https://skeladb.com/releases/<version>/:

File What it is
skeladb-<version>.tar.gz Installer, manifests, release.env, license and notices
release.env, digests.txt, manifest.json Every image by digest, also inside the tarball
skela-<os>-<arch>, skela-mcp-<os>-<arch> CLI and agent server binaries
<image>.<arch>.spdx.json, .cdx.json, .provenance.json SBOMs and build provenance per image and architecture
LICENSE, THIRD-PARTY-NOTICES-*.txt License agreement and third-party notices
SHA256SUMS SHA-256 of every file above
SHA256SUMS.cosign.bundle, SHA256SUMS.sig Signature of the checksum list
<file>.sig, <file>.cosign.bundle Signature of each individual file
cosign.pub The release key

Verify the checksum list, then the files against it:

V=0.0.1; R=https://skeladb.com/releases/$V
for f in SHA256SUMS SHA256SUMS.cosign.bundle SHA256SUMS.sig skeladb-$V.tar.gz; do curl -fsSLO "$R/$f"; done
cosign verify-blob --key cosign.pub --bundle SHA256SUMS.cosign.bundle SHA256SUMS
sha256sum -c SHA256SUMS --ignore-missing      # macOS: shasum -a 256 -c SHA256SUMS --ignore-missing

cosign verify-blob must print Verified OK and every file you downloaded must print OK. A single file can also be checked on its own: cosign verify-blob --key cosign.pub --bundle <file>.cosign.bundle <file>.

Without cosign, OpenSSL checks the same signature:

base64 -d SHA256SUMS.sig > SHA256SUMS.sig.der
openssl dgst -sha256 -verify cosign.pub -signature SHA256SUMS.sig.der SHA256SUMS

It must print Verified OK.

After extracting the tarball, check that its release.env is identical to the verified top-level one (cmp release.env skeladb-$V/release.env).

3. The images

digests.txt lists every image as <registry>/<image>@sha256:<digest>. Each image index is signed, including its per-architecture images:

while read -r image; do
  cosign verify --key cosign.pub "$image" > /dev/null && echo "verified $image"
done < digests.txt

Each per-architecture image also carries signed attestations: an SPDX SBOM, a CycloneDX SBOM and SLSA build provenance. The per-architecture digests are in manifest.json:

jq -r '.images[] | .reference as $r | .platforms | to_entries[] | "\($r)@\(.value)"' manifest.json |
  while read -r image; do
    cosign verify-attestation --key cosign.pub --type spdxjson "$image" > /dev/null &&
    cosign verify-attestation --key cosign.pub --type cyclonedx "$image" > /dev/null &&
    cosign verify-attestation --key cosign.pub --type slsaprovenance1 "$image" > /dev/null &&
    echo "attested $image"
  done

Signatures and attestations are also recorded in the public Rekor transparency log, which cosign checks by default.

If you mirror images into your own registry, copy them by digest with their signatures (for example cosign copy), and verify the mirrored references the same way: the digests must not change.

4. Enforce it in the cluster

To admit only signed SkelaDB images, use an admission controller that checks cosign signatures, for example the Sigstore policy-controller:

apiVersion: policy.sigstore.dev/v1beta1
kind: ClusterImagePolicy
metadata:
  name: skeladb-release
spec:
  images:
    - glob: "<registry>/**"        # the registry in digests.txt, or your mirror
  authorities:
    - key:
        data: |
          <contents of cosign.pub>

Label the skela and skela-cloud namespaces for the policy-controller and test it with an unsigned image before relying on it.

5. What signing does not tell you

A valid signature proves the files and images were published by SkelaDB and not changed since. It does not replace your own vulnerability scanning; scan the SBOMs or images with your usual tools.