Lesson 2 of 10 · 6 min read
Sigstore and Keyless Signing
In this lesson
TL;DR: With Sigstore, the signer creates an ephemeral key pair, proves its identity through an OIDC token (a person's account or a CI job's workload identity), and receives a certificate valid for about ten minutes from the Fulcio certificate authority binding the public key to that identity. It signs, records the signature and certificate in the Rekor transparency log, and discards the private key. Verifiers check the signature, that the certificate chains to Fulcio, that the identity matches what they expect (for example "this repository's release workflow"), and that the log entry proves signing happened while the certificate was valid. There is no long-lived key to steal; the risk moves to the identity provider and to verification policy.
Before you read
Pick an answer before you read further. The lesson below explains it, and guessing first, right or wrong, helps the explanation stay with you.
1A package is signed with Sigstore. A verifier checks that the signature is valid and the certificate chains to Sigstore's root, but not which identity is in the certificate. What can an attacker do?
The problem with long-lived keys
Traditional code signing depends on a private key that lives for years. Keys get lost, leaked from CI secrets, stolen from developer laptops, or never rotated. Open-source maintainers in particular rarely manage keys well, so most open-source artifacts were historically unsigned. Sigstore, started in 2021 and now an OpenSSF project, was designed to make signing easy enough to be the default and to remove the long-lived key.
The pieces
| Component | Role |
|---|---|
| OIDC identity provider | Proves who is signing: a GitHub or Google account, or a CI workload (GitHub Actions, GitLab CI) |
| Fulcio | A certificate authority that issues short-lived certificates binding a public key to that OIDC identity |
| Rekor | A public, append-only transparency log of signing events, built on Merkle trees like Certificate Transparency |
| Cosign and client libraries | Tools that sign and verify artifacts (container images, blobs, packages) |
Signing and verifying
Release workflow
CI job
OIDC provider
Fulcio CA
Rekor log
Release workflow to OIDC provider
1
1. request OIDC token
The CI platform issues a signed token describing this job: repository, workflow, branch.
The log entry is what makes a ten-minute certificate useful years later: it proves the signature was created inside the certificate's validity window, so expiry does not invalidate it.
What the transparency log adds
- Detection of misuse. Every signature for an identity is public. A maintainer can monitor the log for signatures made with their identity that they did not make, as domain owners monitor Certificate Transparency.
- Non-equivocation. The log is append-only and auditable, so it cannot show different histories to different verifiers without detection.
- Evidence of when. In Rekor v1 the log's signed entry time anchored the signature. Rekor v2 moved that job to a separate timestamp authority, as the next section explains.
Rekor v2: time comes from a timestamp authority
Sigstore released Rekor v2 as generally available in October 2025, and it changes one detail that verification policies depend on. The new log is tile-based, served from a single entries endpoint, and sharded by year, with shard locations distributed through Sigstore's TUF trust root. It no longer returns signed timestamps with its proofs. Instead, clients obtain a signed timestamp from a timestamp authority: Sigstore runs a public one, and organisations can run their own. Cosign 2.6.0 and the Go, Python and Java clients support v2, and Rekor v1 is in maintenance mode.
So the question "how does a ten-minute certificate verify years later?" now has a two-part answer: the log's inclusion proof shows the signature was recorded and cannot be quietly removed, and a trusted timestamp shows it was made inside the certificate's validity window.
10-minute certificate
Identity from OIDC
Signature
Ephemeral key
Timestamp
From a TSA
Log inclusion
Rekor proof
Identity policy
Repo, workflow, ref
Short-lived identity
The certificate binds an ephemeral key to a workflow or account for ten minutes; no long-lived key exists to steal.
Where the risk moves
Sigstore removes key theft but not trust:
- The identity provider. If an attacker can obtain an OIDC token for the maintainer's account or the release workflow, they can sign as that identity. Protect accounts with phishing-resistant MFA and restrict which CI events can mint tokens.
- Verification policy. Checking "signed by anyone via Sigstore" is close to worthless. Policies must pin the expected identity and issuer, such as a repository, a workflow file and a branch or tag pattern.
- The build. A signature from the correct release workflow is only as good as that workflow's inputs, which is why Sigstore is usually paired with SLSA provenance.
- Privacy. Identities in the public log are visible; use workload identities rather than personal emails for automated releases.
Where it is used
As of November 2026: Cosign signatures and verification for container images and Kubernetes admission policies; npm package provenance (launched 2023) and PyPI digital attestations (PEP 740) built on Sigstore; and the OpenSSF model signing specification, which signs model directories with Sigstore by default. These evolve quickly; check the current documentation before relying on a specific feature.
Trusted publishing, and why it arrived when it did
Package registries adopted the same idea for publishing: instead of a long-lived API token stored in CI, the CI job exchanges its OIDC identity for a short-lived publishing credential.
| Date | Change |
|---|---|
| April 2023 | PyPI trusted publishing; npm package provenance (Sigstore-signed, tied to the CI workflow) |
| November 2024 | PyPI digital attestations (PEP 740) live, generated automatically for trusted publishing through the standard GitHub Action. About 5% of the top 360 projects published them at launch |
| July 2025 | npm trusted publishing generally available for GitHub Actions and GitLab CI, with provenance published by default |
| September 2025 | After the Shai-Hulud worm spread through compromised maintainer accounts, npm announced the revocation of classic tokens, a 7-day default and 90-day maximum lifetime for new write-enabled granular tokens, and a push towards trusted publishing |
GitHub's artifact attestations fit the same picture. On their own they meet SLSA v1.0 Build Level 2; generated inside a reusable workflow, which isolates the signing step from the calling repository's code, they reach Build Level 3. Verification should pin the signer workflow or repository, not just the organisation.
Worked example: a Python package release policy
A consumer's policy for acme-lib requires a PEP 740 attestation whose certificate identity is https://github.com/acme/lib/.github/workflows/release.yml on a ref matching refs/tags/v*, whose issuer is GitHub Actions' token service, and whose signing time falls inside the certificate's ten-minute window by the timestamp evidence.
An attacker phishes a maintainer's PyPI password. If the project publishes only through trusted publishing and holds no API tokens, there is nothing to upload with. If the attacker can also push a tag to the repository, the release workflow runs and produces a legitimately attested release, so the remaining controls are branch and tag protection and required reviewers on the release environment.
Pin only the organisation
Policy: any identity under github.com/acme
A test repo's workflow signs a build
same organisation
Verification passes
Outcome, unsafe: Any repo in the org can publish
One weak repository becomes everyone's release path.
Pin repository, workflow, ref and issuer
Policy: release.yml on refs/tags/v*
Test repo's signature has another identity
identity mismatch
Verification fails closed
Outcome, safe: Only the release path counts
Protected tags and reviewers guard what remains.
Broad identity
Pinning only the organisation accepts signatures from every repository and workflow in it.
Misconceptions interviewers listen for
- "Keyless means no keys." It means ephemeral keys and no long-lived secret to steal.
- "Rekor gives me the timestamp." True for v1; with v2 a separate timestamp authority provides it.
- "Trusted publishing stops compromised maintainers." It removes stealable tokens; a compromised repository or workflow still publishes legitimately.
- "Any Sigstore signature is good." Policy must pin the identity and issuer.
What if · interview follow-ups
Hold your answer as the constraints change
Your company consumes open-source packages and container images and publishes its own SDKs. You are setting Sigstore-based signing and verification policy. The interviewer probes the details.
Start here
How does a certificate valid for ten minutes still verify years later?
Recorded, and signed in time.
The signature's inclusion in the transparency log proves it was recorded publicly and cannot be removed unnoticed, and a trusted timestamp proves it was made while the certificate was valid. With Rekor v2 that timestamp comes from a timestamp authority rather than the log. Expiry afterwards does not matter.
Carry it forwardLog inclusion plus a timestamp inside the validity window replaces a long-lived key.
Weak answerSaying the certificate is renewed.
Constraint changes
Why did npm cut token lifetimes in 2025?
What did the worm spread through?
The Shai-Hulud worm spread through compromised maintainer accounts and their publishing credentials. npm revoked classic tokens, set short default lifetimes for new write tokens, and pushed trusted publishing, where CI exchanges its identity for a short-lived credential, so there is no reusable token to steal.
Carry it forwardShort-lived, identity-bound publishing removes the secret a worm can reuse.
Weak answerSaying two-factor authentication alone was the fix.
Constraint changes
Your verifier pins only github.com/acme. What is the problem?
How many workflows can sign as that?
Every repository and workflow in the organisation passes, including test repositories and forks of tooling, so the weakest repository becomes a release path. Pin the repository, the workflow file, the ref pattern for releases and the issuer, and require protected tags and reviewers on the release environment.
Carry it forwardPin the exact release workflow and ref, not the organisation.
Weak answerAssuming organisation membership is strong enough.
Constraint changes
Rekor v2 no longer returns signed timestamps. What must your verification stack do?
Clients, timestamps, trust roots.
Upgrade clients to versions that support v2, such as Cosign 2.6.0 or later, configure verification to accept or require timestamps from the trusted timestamp authority, and obtain log shard locations and trust roots through Sigstore's TUF repository rather than hard-coded URLs.
Carry it forwardVerification needs a trusted timestamp source and TUF-distributed roots.
Weak answerLeaving verification unchanged and trusting log entry times.
Constraint changes
What if your identity provider itself is compromised?
What does Sigstore trust?
Then an attacker can obtain valid certificates for your identities, and verification will pass. Mitigate with transparency log monitoring for signatures you did not expect, provenance checks that builds came from protected refs, and, for the most important artifacts, an independent second signature under a different trust root.
Carry it forwardKeyless signing moves trust to the identity provider; monitor and add independent checks.
Weak answerClaiming keyless signing cannot be forged.
Now defend it
As the defender, what would you monitor around Sigstore signing?
Transparency log entries for your organisation's identities that do not match release events, verification failures by identity mismatch, releases from unprotected refs, new trusted publisher configurations on registries, and any remaining long-lived publishing tokens.
How this shows up in interviews
"How does keyless signing work, and what does the transparency log add?" probes whether you understand that "keyless" means "no long-lived key", not "no keys". Strong answers walk through OIDC, Fulcio, the ephemeral key and Rekor, explain why a ten-minute certificate still verifies later, and insist on identity-pinned verification policies. Mention where the trust moved: the identity provider and the build.
Say it in 30 seconds: "Sigstore replaces long-lived signing keys. The signer makes an ephemeral key, proves its identity with an OIDC token from a person or a CI workflow, and Fulcio issues a ten-minute certificate binding the key to that identity. The signature goes into Rekor, a public append-only log, and the key is thrown away. Verifiers check the signature, the chain, that the identity is exactly the expected workflow, and that the log shows it was signed while the cert was valid. The risk moves to the identity provider and the build."
Check yourself
Say or write your answer first, then reveal. Explaining it from memory, in your own words, is the skill an interviewer is checking.
1A verification policy for container images accepts any certificate whose identity is from github.com/acme-corp. What is too loose about it?
2Why can a verifier trust a Sigstore signature made two years ago when the certificate expired ten minutes after issue?
3What changed about timestamps in Rekor v2?
4What does trusted publishing remove, and what does it not stop?