Download kubectl with its .sig and .cert files, then run cosign verify-blob with the release identity and the Google OIDC issuer. A passing check shows the binary was signed by the Kubernetes release process and not altered. Cosign 2.0 requires both identity flags.
What is signed
The Kubernetes docs state that the release process signs all binary artifacts, meaning tarballs, SPDX files and standalone binaries, using cosign keyless signing. The verification page is marked beta since Kubernetes v1.26. You need cosign, curl and jq.
Steps
- Pick the version and platform, for example a release URL under dl.k8s.io.
- Download three files: the binary, the .sig file and the .cert file.
- Run the verification.
URL=https://dl.k8s.io/release/v1.37.0/bin/linux/amd64
BINARY=kubectl
for FILE in "$BINARY" "$BINARY.sig" "$BINARY.cert"; do
curl -sSfL --retry 3 --retry-delay 3 "$URL/$FILE" -o "$FILE"
done
cosign verify-blob "$BINARY" \
--signature "$BINARY".sig \
--certificate "$BINARY".cert \
--certificate-identity krel-staging@k8s-releng-prod.iam.gserviceaccount.com \
--certificate-oidc-issuer https://accounts.google.com
The version number above is the example used in the Kubernetes docs at the time of writing. Replace it with the release you need.
What the identity flags do
Keyless signing ties a signature to an identity, not a key you store. The two flags tell cosign which identity and which issuer to accept. If you omit them, verification cannot be meaningful, which is why cosign 2.0 made them mandatory. For binaries and the SBOM, the docs list the identity krel-staging at k8s-releng-prod, and for container images they list a different one, krel-trust. Using the wrong one is the most common reason a good download appears to fail.
What a pass means
| Result | Meaning |
|---|---|
| Verified | Signed by the stated release identity, and the file matches |
| Fails on identity | You may be using the image identity for a binary, or the reverse |
| Fails on file | The download is damaged or altered, so fetch it again and investigate |
A passing check says nothing about whether the Kubernetes version itself has open vulnerabilities. Check the release notes and your own scanner for that. For a wider view on what signatures prove, read what a container image signature proves and does not.
Put it in your build
If your CI image installs kubectl, add this verification to the image build and fail the build when it fails. Pin the version, so a change is a reviewed commit.
Quick check
Do I need to verify kubectl if I install it from a package manager?
The package manager has its own trust chain. Direct downloads are where this check helps most, because nothing else vouches for the file.
Why does cosign ask for an OIDC issuer?
Keyless signatures record who authenticated at signing time. The issuer tells cosign which identity provider to trust for that claim.
Safeguard can scan the tools and images in your pipeline as part of dependency and SBOM scanning.
Sources
Last reviewed: 19 October 2026.