Skip to content
Agent Identity

IETF · February 2024

HTTP Message Signatures

RFC 9421

A. Backman, J. Richer, M. Sporny

RFCStableAuthenticationFoundationField guide

This is the cryptographic primitive that lets an agent prove 'this request came from my key' without a bearer secret in the Authorization header.

At a glance

Problem
HTTP requests and responses need application-level integrity and authentication that survives some intermediaries, without reinventing ad-hoc HMAC headers.
Identity / authn / authz
Authentication and integrity of the HTTP message. Authorization is left to the application (AAuth tokens, OAuth, etc.).

Actors

  • Signer (agent, client, or server)
  • Verifier

01

The gap for agents

HTTP requests need application-level integrity that survives some intermediaries, without ad-hoc HMAC headers. RFC 9421 is the cryptographic primitive that lets an agent prove 'this request came from my key' without a bearer secret in Authorization.

AAuth profiles this. WIMSE also has an HTTP signature method alongside WPT. DPoP is a different proof (a JWT in a header), not 9421.

02

Actors and trust boundaries

Signer and verifier share a key-discovery story (Signature-Key, WIT, static config). Intermediaries that add unsigned headers are fine; intermediaries that change covered components break the signature. Do not cover hop-by-hop headers you cannot control.

03

Mechanics

Signer covers chosen components (@method, @authority, @path, selected headers, content-digest, created, …) in Signature-Input and produces Signature. Verifier reconstitutes the signature base and checks against a known key. Require coverage of method, authority, path, and the key-identifying header (signature-key or equivalent).

Signature-Input / Signaturefrom spec
Quoted RFC 9421 headers that carry the covered components and the signature.
@method / @authority / @pathfrom spec
Quoted derived components. AAuth and any agent profile should cover these.

04

Step-by-step flows

Flow 1

Sign a request

  1. 1

    Choose components (minimum method, authority, path, key header).

  2. 2

    Build Signature-Input with created and a nonce or keyid as required by the profile.

  3. 3

    Sign the signature base; send Signature plus key discovery (Signature-Key or WIT).

  4. 4

    Verifier rebuilds the base, fetches the key, checks alg, created window, and signature.

05

Identity vs authentication vs authorization

Authentication and integrity of the HTTP message. Authorization is left to the application (AAuth tokens, OAuth, local policy).

06

How it composes

  • HTTP Signature Keys

    Key distribution companion.

  • AAuth

    Profiles 9421 as the only API-call PoP.

  • WIMSE WPT

    Alternative application-layer PoP using a JWT in Authorization.

  • DPoP

    Different PoP; do not assume a DPoP proof satisfies a 9421 verifier.

07

What bites agent implementers

  • Under-covering

    If you do not cover the path, an attacker rewrites /read to /admin. If you do not cover signature-key, they swap identity.

  • Clock / created

    Replay windows depend on created and verifier policy. Pair with jti-like uniqueness if the profile provides it.

08

Stability — what you can ship

RFC 9421, February 2024, A. Backman, J. Richer, M. Sporny. Stable. https://www.rfc-editor.org/rfc/rfc9421.html

Catalog claims (short form)

Signature-Input / Signature
The two headers that carry the signature base and the signature.

Implementer notes

AAuth profiles RFC 9421 rather than inventing a new signature scheme. WIMSE also has an HTTP signature method alongside WPT. Require coverage of method, authority, path, and the key-identifying header.

Relationship to others

Primary sources

  • RFC 9421https://www.rfc-editor.org/rfc/rfc9421.html