Back to Guides
EnterpriseZero TrustNEW

What Are SPIFFE and SPIRE?

Workload and AI agent identity, explained from a PKI standpoint — what is inside the certificate, where the identity lives, and what SPIRE adds that a plain internal CA does not.

14 min readJuly 2026CNCF Graduated
SPIFFE and SPIRE workload identity — network of connected services with short-lived certificate identities

If you already understand TLS certificates, you understand most of SPIFFE. SPIFFE (Secure Production Identity Framework For Everyone) is an open standard for giving a software workload — a container, a service, or an AI agent — a verifiable identity in the form of a short-lived X.509 certificate. SPIRE (the SPIFFE Runtime Environment) is the software that hands out those certificates and rotates them automatically, but only after it has proven what the workload actually is. Both are graduated projects at the Cloud Native Computing Foundation, the top maturity tier, so this is production infrastructure and not a lab experiment.

The reason this matters right now: AI agents are the first genuinely new identity category since IoT, and nobody wants an autonomous process authenticating with a static API key copied into an environment variable. SPIFFE is how you give that agent a real, cryptographic, revocable identity.

SPIFFE in One Sentence, for PKI People

A SPIFFE identity document is a certificate. The workload's name lives in the URI Subject Alternative Name. The trust domain is your trust anchor. Automatic issuance and one-hour rotation replace the manual enrollment and long-lived keys you are used to fighting with. That is the whole idea; everything below is detail.

One correction worth making up front: the SPIFFE ID is not stored in a custom OID. It goes in the URI Subject Alternative Name of the certificate — exactly where a DNS SAN goes in a web server cert, just with a spiffe:// URI instead of a DNS name.

Watch the Video

What Is a SPIFFE ID?

A SPIFFE ID is a URI that names one workload. The format is spiffe://<trust-domain>/<workload-path>, for example spiffe://example.org/ns/default/sa/payments. Read that the way you would read a certificate subject.

Trust Domain

example.org

The security boundary and root of trust, backed by a signing CA. The equivalent of your CA's common name or org unit — the thing your authorization policy trusts.

Workload Path

/ns/default/sa/payments

Whatever hierarchy you choose. Here it encodes a Kubernetes namespace and service account, but the path is yours to design.

The important property is that the SPIFFE ID is the thing your authorization policy hooks onto. Instead of "allow anything holding this shared secret," you write "allow spiffe://example.org/ns/default/sa/payments," and that statement is backed by a certificate you can cryptographically verify.

What Is an SVID?

An SVID (SPIFFE Verifiable Identity Document) is the credential a workload presents to prove it owns its SPIFFE ID. There are two encodings:

X.509-SVIDJWT-SVID
FormShort-lived X.509 certificate + private keySigned JWT
SPIFFE ID lives inURI SAN (exactly one URI entry)sub claim
Best formTLS between workloadsL7 hops through proxies/gateways
Trade-offRequires a TLS pathBearer token — replayable if leaked

The X.509-SVID is the one that makes this a certificate story, and it is the default you should reach for. Per the SPIFFE X.509-SVID specification, the certificate carries the SPIFFE ID in a single URI SAN and is meant to be short-lived. Dump one and it looks like any other leaf certificate:

bash
$ openssl x509 -in svid.pem -noout -text | grep -A1 "Subject Alternative Name"
    X509v3 Subject Alternative Name:
        URI:spiffe://example.org/ns/default/sa/payments

No magic. It is a normal X.509 cert whose identity happens to be a spiffe:// URI instead of a DNS name, signed by a CA your workloads trust. The trust bundle — the set of CA root certificates a workload should trust — is the SPIFFE equivalent of the root store you already manage.

What Is SPIRE, and What Does It Actually Add?

SPIFFE is the specification. SPIRE is the reference implementation — the running system that issues SVIDs. If SPIFFE is the "what," SPIRE is the "how." The current stable release is v1.15.1 (May 2026).

SPIRE Server

The certificate authority and registrar. Holds the signing key for the trust domain, maintains registration entries (which selectors map to which SPIFFE ID), and signs SVIDs.

SPIRE Agent

Runs on every node. Exposes the SPIFFE Workload API over a local Unix domain socket — a workload asks for its identity over a socket rather than being handed a key at deploy time.

What SPIRE adds: attestation

Before SPIRE issues an SVID it answers two questions:

1
Node attestation

Is this really the machine it claims to be? Proven via a cloud instance identity document, a Kubernetes projected token, a TPM, a join token, etc.

2
Workload attestation

Is the process asking for this identity really the workload it claims to be? The agent inspects verifiable properties of the calling process — its Kubernetes namespace and service account, its Unix UID, its binary path — expressed as selectors.

Only when the selectors on a request match a registration entry does the workload get its SVID. Nothing secret is baked into the workload image or config.

A registration entry is created like this:

bash
spire-server entry create \
  -spiffeID spiffe://example.org/ns/default/sa/payments \
  -parentID spiffe://example.org/spire/agent/k8s_psat/node-01 \
  -selector k8s:ns:default \
  -selector k8s:sa:payments

And a workload fetches its identity with:

bash
spire-agent api fetch x509 -socketPath /tmp/spire-agent/public/api.sock

SPIRE then rotates that SVID automatically — its default X.509-SVID lifetime is one hour — so the workload always holds a fresh, short-lived credential without anyone running a renewal script. If that "short-lived and automatically rotated" model sounds familiar, it is the same direction the public web PKI has been moving with 90-day and now 47-day certificates. SPIFFE simply applies it to internal workloads and turns the dial down to an hour.

SPIFFE vs the Things You Already Run

You knowSPIFFE equivalentWhat changes
CN / DNS SAN in a web certSPIFFE ID in the URI SANIdentity is a workload, not a hostname
Long-lived API key or shared secretX.509-SVIDCryptographic, short-lived, non-replayable, revocable by expiry
Internal CA + manual enrollmentSPIRE Server + attestationThe CA proves what a workload is before issuing
Root store / CA bundleTrust bundleSame concept, distributed by the Workload API
Renewal cron jobAutomatic rotationHandled by the SPIRE agent, ~hourly

SPIFFE for AI Agents and Non-Human Identity

Here is why the workload-identity world and the AI-security world collided. An AI agent is a workload — but a non-deterministic one. A traditional container does the same thing every time; an agent "walks around" your environment more like a person, making calls you did not script in advance. That makes its identity more important, not less, because your controls now have to answer a live question: is this agent the one I authorized, or a rogue or injected process pretending to be it?

Static API keys answer badly

  • • Copyable, long-lived
  • • Invisible once leaked
  • • No proof of who holds it

SPIFFE identity answers well

  • • Short-lived X.509-SVID
  • • Tied to the attested workload
  • • Cryptographically verifiable

When agent A calls agent B, B checks A's SVID before doing anything — the same mTLS verification you would do between two microservices, now between two autonomous actors. If the SVID does not verify against the trust domain, the caller is not who it claims to be, and the call is refused.

What SPIFFE does not do: authorize

Be precise about the boundary, because it is where teams get overconfident. SPIFFE proves who an agent is; it does not decide what that agent may do, or on whose behalf. When an agent acts for a user, you still need an authorization and delegation layer on top of the SVID — scoped, policy-enforced permissions, ideally issued just-in-time. A verifiable identity is the foundation that layer stands on, not a replacement for it. Treat SPIFFE as authentication and keep authorization as a separate, deliberate control.

What the July 2026 Hugging Face Breach Shows

Hugging Face disclosed that an autonomous AI agent breached its internal network over a single weekend. A malicious dataset triggered remote code execution on a data-processing worker; from that single foothold the agent escalated to node-level access, harvested cloud and cluster credentials, and used them to move laterally into several internal clusters — executing thousands of automated actions with none of the fatigue that slows a human intruder.

Would SPIFFE and SPIRE have prevented it? Honestly, no — not the break-in. The initial access was a code-execution flaw in dataset processing, and no identity system stops that. But identity is what turned one compromised worker into a network-wide breach, and that is precisely the part SPIFFE addresses.

With short-lived, attested SVIDs there is no standing cloud or cluster credential sitting on the worker to harvest; a workload receives a one-hour identity from the Workload API instead of a static key in a file or environment variable. An identity bound to an attested workload cannot be lifted and replayed from somewhere else, and it expires before the weekend is out.

The clearest way to see the identity fix is by analogy to cloud IAM. A SPIFFE ID is the workload equivalent of an AWS IAM role principal — the identity you attach least-privilege policy to. Had that compromised worker carried a narrowly scoped identity — process this dataset, reach this one bucket — rather than broad harvestable credentials, the escalation attempts would have returned access denied: not blocked because the agent could not authenticate, but because that identity was never authorized to read cluster secrets or reach other clusters.

As one identity analysis of the breach put it, the agent "didn't defeat an identity architecture. It found a static credential it could harvest and a network it could traverse." The honest takeaway is containment, not a silver bullet: short-lived attested identities plus least-privilege authorization remove the harvestable credential and shrink the blast radius. SPIFFE is one layer of that defense in depth, not the whole of it.

When You Need SPIFFE and SPIRE (and When You Do Not)

SPIFFE and SPIRE earn their keep when you have many workloads that need to authenticate to each other across trust boundaries. Concrete cases where it fits:

  • Service-mesh and microservice mTLS

    Every service proves its identity with an SVID instead of a shared secret or an assumption based on network location.

  • Multi-cloud and hybrid workload identity

    One trust domain spans AWS, GCP, Azure, and on-prem, so a workload's identity travels with it instead of being re-issued per platform.

  • Kubernetes workload identity

    Pods get an attested identity tied to their namespace and service account, not a secret mounted into the container.

  • Replacing long-lived service credentials

    Database, message-bus, and internal-API access keyed to a short-lived SVID rather than a static API key or password sitting in config.

  • AI-agent fleets

    Each agent, and each service it calls, carries a verifiable, short-lived identity, so authorization is anchored to who the agent is.

Where it is overkill

A handful of static servers with certificates that change twice a year. A conventional internal CA is fine there. The dividing line is dynamism and scale — the more ephemeral and numerous your workloads, the more the automatic-attestation-and-rotation model pays off, and the more untenable scattering long-lived secrets becomes.

How This Connects to the Public-Certificate mTLS Sunset

If you already run mutual TLS with certificates from a public CA, you are on a clock. Public CAs are removing the clientAuth extended key usage from TLS certificates through 2027, which breaks public-cert mTLS at renewal — silently, because existing certs keep working until they expire.

The fix is to move client and workload authentication onto a private trust path, and SPIFFE/SPIRE is one of the cleanest private paths available: a private trust domain, short-lived X.509-SVIDs, and automatic rotation, purpose-built for workload-to-workload authentication.

If you are inventorying where you rely on client-authentication certificates today, that inventory is also your migration map to workload identity.

Frequently Asked Questions

Is SPIFFE a certificate?

An X.509-SVID is a standard X.509 certificate whose identity is a spiffe:// URI in the URI SAN. SPIFFE also defines a JWT form (JWT-SVID) for cases where a certificate path is impractical, but the X.509 form is the default.

Is SPIFFE only for Kubernetes?

No. SPIFFE is platform-agnostic, and SPIRE attests workloads on bare metal, VMs, and multiple clouds as well as Kubernetes. Kubernetes is common because its namespaces and service accounts make clean selectors, but nothing about the standard requires it.

Is the SPIFFE ID stored in an OID?

No. It is carried in the URI Subject Alternative Name of the X.509-SVID — exactly one URI SAN entry — not in a custom object identifier.

Do I need SPIRE to use SPIFFE?

No. SPIFFE is a specification; SPIRE is the most widely used implementation of it, but other SPIFFE-compliant issuers and service meshes exist. If you want attestation-based issuance and automatic rotation out of the box, SPIRE is the usual starting point.

Does SPIFFE stop a compromised AI agent?

It contains one. SPIFFE gives an agent a short-lived, attested identity, so a stolen credential expires quickly and cannot be replayed from another machine — which limits lateral movement, as the July 2026 Hugging Face breach illustrated. It does not stop the initial compromise or replace the authorization layer that governs what an authenticated agent is allowed to do.

How is a SPIFFE SVID different from an API key?

An API key is a long-lived bearer secret: whoever holds it is trusted, and a leak is invisible and durable. An X.509-SVID is a short-lived certificate tied to an attested workload, verified cryptographically, and expired (typically within an hour) rather than trusted indefinitely.

Do I need a public domain, and is SPIRE a public CA?

No on both counts. The trust domain in a SPIFFE ID (the example.org in spiffe://example.org/...) is just a naming label for your private trust root — you do not have to own it as a registered public domain, and SPIRE performs no public DNS or domain validation the way a public CA does. SPIRE runs its own private CA and signs the SVIDs itself, and those certificates are trusted only by workloads that carry your trust bundle, not by browsers or the public web PKI. You can optionally chain SPIRE's issuing CA to an upstream CA you already run — disk, HashiCorp Vault, AWS Private CA, or cert-manager — but it stays private PKI, never a public CA.

If SVIDs aren't publicly trusted, how does mTLS work?

Both workloads are configured with the same trust bundle (your SPIRE root), so they can verify each other without any public CA. In a mutual TLS handshake each side presents its X.509-SVID and checks that the other's SVID chains to the trust bundle and carries an allowed SPIFFE ID. Because SPIRE issues each SVID with both the serverAuth and clientAuth extended key usages, the same identity can act as either the client or the server on a connection. That private, both-EKU issuance is also why SPIFFE mTLS is unaffected by the public clientAuth EKU sunset arriving through 2027 — no external CA's policy change can break it.

Related Resources