skip to content

How does a Fulcio certificate for a CI job differ from one issued to a human maintainer?

level: middleimportance: should knowfreq 44%

answer

  1. two ways to be a signer
  2. who versus what signed
  3. email address or a pipeline URI
  4. issuer differs: directory or CI platform
  5. workload certs carry repo and ref

basics

~20 s

A human signer's Fulcio certificate names an email address asserted by a consumer or corporate identity provider. A CI job's certificate names a pipeline URI asserted by the CI platform, plus extensions recording the repository, ref and build configuration.

solid answer

~50 s

Both are Fulcio certificates with the same short lifetime; what differs is the identity the OIDC token carried. A human logs in interactively, so the subject alternative name is an email address and the issuer extension names the identity provider that authenticated them — a corporate directory, or a consumer account. A CI job presents the token its platform mints for the running job, so there is no email at all: the subject is a URI describing the pipeline — project, path to the job configuration, and the ref it ran from — and the issuer is the CI platform. Workload certificates additionally carry extensions for the source repository, the commit, and the build configuration. Practically, this is how you tell a release signed inside the pipeline from one a maintainer cut by hand on their laptop, and it is the only thing in the release record that distinguishes them.

go deeper

for a junior

Know that the identity in the certificate comes from whoever logged in — a person's email, or the pipeline's own token — and that both use the same issuance path.

for a middle

Be ready to describe the fields concretely: subject alternative name, the issuer extension, and the extra build-context extensions a CI-issued certificate carries.

for a senior

Show you would treat the identity string as a versioned contract, and explain how a pipeline rename or a hotfix branch changes it without anyone intending to.

for a principal

Own the policy question of whether human signing is permitted at all, what break-glass looks like when it is, and who reviews the resulting mixed release record.

## Same certificate, two very different subjects Fulcio does not have two products. It has one issuance path, and the difference between a "human" and a "workload" certificate is entirely a consequence of which OIDC token was presented and what claims that token contained. ### Human identity A person running a signing command interactively is sent through a browser login against an identity provider. The token that comes back asserts an **email address** (or, for some providers, a stable account subject). Fulcio puts that in the certificate's subject alternative name and records the issuer — say a corporate directory, or a consumer account provider — in its own extension. So a human certificate reads, in effect: *the identity provider at this issuer confirmed that the holder of this ephemeral key was this email address, at this moment.* ### Workload identity A CI job has no browser and no human to authenticate. Instead the CI platform itself acts as an OIDC issuer and mints a token describing the job: which project, which pipeline configuration file, which ref, which commit, sometimes whether the runner was platform-hosted or self-managed. Fulcio turns that into a certificate whose subject alternative name is a **URI describing the pipeline** rather than an email — the project path, the path to the job configuration, and the ref it ran from — with the CI platform as issuer, and with additional Sigstore-defined extensions carrying the surrounding build context. A workload certificate reads: *this CI platform confirmed that the holder of this ephemeral key was this pipeline, running from this ref, at this moment.* ## Why the distinction matters in a real release history Picture a crate whose releases are normally cut by a GitLab CI job. Over a year, the published release record contains a mix: most versions signed by the pipeline's workload identity, two signed by a maintainer's personal Google account because a release had to go out during an outage. Nothing about the artifacts differs. Both signatures are cryptographically sound. Both certificates chain to the same authority. The **only** place the difference is visible is in the certificate's identity and issuer: one says "this pipeline on this ref", the other says "this human at this provider". If nobody looks at those fields, a maintainer signing outside the pipeline and an attacker who has taken over that maintainer's account are the same event in your records, and neither will look unusual. That is why the identity fields are the audit surface, not a formality. A release history is only trustworthy to the extent that somebody can say what *should* have appeared there. ## The ref is part of the workload identity, and that surprises people Because the workload subject embeds the pipeline configuration path and the ref, the same release cut from a hotfix branch produces a materially different identity string than the same release cut from the main line. This is honest — the two builds really did run under different conditions — but it means process changes silently change identity. A team that moves a release job to a new file, renames a branch, or introduces a release-branch strategy will find that the identity in the certificate is not the one they were expecting, and the change shows up at verification time rather than at the moment the process changed. Treat the identity string as a contract with a lifecycle, not as a constant. ## Granularity: what identity does a matrix build produce? A build that fans out across many targets — say a dozen platform variants of one release — will have each job obtain its own certificate, but the identity those certificates carry is determined by the claims the platform puts in the token, not by anything the job chooses. If the token describes the workflow and ref, twelve jobs from one workflow produce twelve certificates with the *same* identity, and a single compromised job among them is indistinguishable in the certificate from its eleven siblings. Knowing at what granularity your platform asserts identity — per repository, per pipeline configuration, per ref — is what tells you how much a certificate actually narrows down the origin of an artifact. ## What neither kind of certificate does Neither says the signer was *entitled* to sign. Both are simply an authority repeating what an identity provider said. Human or workload, the certificate names a signer; deciding whether that signer is the right one is a separate act performed by whoever consumes the artifact. ## Frequent confusion Engineers often expect a CI certificate to carry a service-account email, because that is how cloud service identities usually look. In the keyless flow it typically does not: the CI platform describes the *job*, and that description — not a mailbox — is the identity.

  • Your release history contains both pipeline-signed and maintainer-signed versions. Is that a problem?
    Not automatically, but it must be a decision rather than an accident. Signing outside the pipeline skips whatever the pipeline enforces, so it should be rare, expected, and attributable. The risk is not the mixed history itself but that nobody has stated which identities belong there, so an account takeover produces a record that looks entirely normal.
  • Why can't you tell which of twelve matrix jobs produced an artifact from the certificate alone?
    Because the identity comes from claims the CI platform puts in the job's token, and those typically describe the pipeline and ref rather than the individual matrix leg. All twelve jobs then present the same identity, so distinguishing them requires information carried elsewhere — for example in build provenance describing the specific invocation.
  • What breaks when a team renames the release pipeline's configuration file?
    The workload identity string changes, because the path to the job configuration is part of it. Signatures produced afterwards carry a different subject than before, so anything expecting the old identity stops matching. It is a process change with a cryptographic side effect, and it should be planned like one.

saying these in an interview costs you the question

  • Assumes a CI job's certificate carries a service-account email
  • Says human and workload signing use different certificate authorities
  • Thinks the certificate proves the signer was allowed to sign
  • Ignores that the ref is part of the workload identity string
  • Treats a hand-signed release as indistinguishable from a pipeline one

context