Safeguard
Supply Chain•

What do certificate identity and issuer mean when verifying a release?

In keyless signing the identity says who signed and the issuer says which login provider vouched. Verify with both named, or the check proves little.

Safeguard Security Team
3 min read

With keyless signing there is no long lived key to publish. Instead, a signature is tied to an identity, such as an email address, and an issuer, the login provider that vouched for it. When you verify, you state both, and the check passes only if they match.

How keyless signing differs

The Sigstore documentation says cosign supports identity based signing, associating an ephemeral signing key with an identity from an OpenID Connect provider. It calls this keyless signing and uses the sign blob command for files. The signer proves who they are to the provider, receives a short lived certificate, signs, and the key is discarded.

For verification, the documentation shows the verify and verify blob commands taking two flags: the expected certificate identity and the expected OIDC issuer. It lists example issuers, including those for Google, Microsoft, GitHub and GitLab.

What each field tells you

FieldMeaningExample shape
Certificate identityWho the signature claims to come fromAn email address, or for automated builds a workflow identity
OIDC issuerThe provider that authenticated that identityA provider URL

Both are needed. An identity name alone means little without knowing which provider vouched for it, and an issuer alone says nothing about which account signed.

What verification looks like

The documentation's example for a file uses a bundle containing the certificate and signature, then the expected identity and issuer:

cosign verify-blob file.txt --bundle artifact.sigstore.json \
  --certificate-identity=name@example.com \
  --certificate-oidc-issuer=https://accounts.example.com

It also notes that for blobs the signature and certificate can be stored in a bundle created at signing time, and that either the bundle or the individual signature and certificate must be given.

The mistake to avoid

If you tell the verifier to accept any identity, you only learn that someone signed it. That is much weaker than learning that your project's release workflow signed it. Always supply the exact identity you expect, taken from the project's verify page, not from the artifact you are checking. See how to write a verify page for your releases.

For publishers

  • Decide the identity that signs releases, ideally an automated workflow rather than a person's account.
  • Publish that exact identity and issuer string in your docs.
  • When it changes, announce the change like a key rotation.

Related: can you verify Sigstore signatures offline and how to sign release files with cosign sign blob.

An analogy that helps

Think of the identity as the name on an identity card and the issuer as the authority that printed it. A card that names the right person but was printed by an unknown shop proves little. A card printed by a trusted authority but naming a stranger proves something different from what you wanted to check. Verification passes only when both the name and the authority match what you expected in advance. That is why your expected values should come from the project's own verify page, written down before you look at the artifact.

Quick check

Why is there no key to publish?

The key is ephemeral and discarded after signing. Trust comes from the identity and issuer recorded in the certificate.

What does a passing check prove?

That the expected identity, vouched for by the expected issuer, signed the file. It does not prove the code is safe.

Sources

Last reviewed: 19 October 2026.

Never miss an update

Weekly insights on software supply chain security, delivered to your inbox.

Self-healing security runs on Safeguard.

Your first fix PR is minutes away.

No sales call required, even your agent can complete the purchase over MCP.