HTTP D. Hardt Internet-Draft Hellō Intended status: Standards Track T. Meunier Expires: 6 February 2027 Cloudflare 5 August 2026 HTTP Signature Keys draft-hardt-httpbis-signature-key-08 Abstract This document defines five HTTP header fields for use with HTTP Message Signatures as defined in RFC 9421. The Signature-Key request header distributes public keys used to verify signatures, with eight initial key distribution schemes: pseudonymous inline keys (hwk), self-issued key delegation via JWK Thumbprint JWTs (jkt-jwt), identified signers with JWKS URI discovery (jwks_uri), direct JWKS fetch (jwks), JWT-based delegation (jwt), self-issued JWTs (self- jwt), X.509 certificate chains (x509), and references to previously cached assertions (cached). The Accept-Signature-Scheme and Accept- Signature-Alg response headers state the schemes and algorithms a server accepts, so a client can select both before it signs. The Signature-Error response header provides structured error information when signature verification fails, and the Signature-Key-Cache response header issues a cache identifier by which a caller can reference a previously presented assertion instead of resending it. Together, these mechanisms enable flexible trust models ranging from privacy-preserving pseudonymous verification to horizontally-scalable delegated authentication and PKI-based identity chains. Discussion Venues _Note: This section is to be removed before publishing as an RFC._ Source for this draft and an issue tracker can be found at https://github.com/dickhardt/signature-key (https://github.com/dickhardt/signature-key). Status of This Memo This Internet-Draft is submitted in full conformance with the provisions of BCP 78 and BCP 79. Internet-Drafts are working documents of the Internet Engineering Task Force (IETF). Note that other groups may also distribute working documents as Internet-Drafts. The list of current Internet- Drafts is at https://datatracker.ietf.org/drafts/current/. Hardt & Meunier Expires 6 February 2027 [Page 1] Internet-Draft Signature-Keys August 2026 Internet-Drafts are draft documents valid for a maximum of six months and may be updated, replaced, or obsoleted by other documents at any time. It is inappropriate to use Internet-Drafts as reference material or to cite them other than as "work in progress." This Internet-Draft will expire on 6 February 2027. Copyright Notice Copyright (c) 2026 IETF Trust and the persons identified as the document authors. All rights reserved. This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (https://trustee.ietf.org/ license-info) in effect on the date of publication of this document. Please review these documents carefully, as they describe your rights and restrictions with respect to this document. Code Components extracted from this document must include Revised BSD License text as described in Section 4.e of the Trust Legal Provisions and are provided without warranty as described in the Revised BSD License. Table of Contents 1. Conventions and Definitions . . . . . . . . . . . . . . . . . 4 2. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 4 3. Signature-Key HTTP Request Header . . . . . . . . . . . . . . 7 3.1. Label Consistency . . . . . . . . . . . . . . . . . . . . 8 3.2. Multiple Signatures . . . . . . . . . . . . . . . . . . . 8 3.3. Algorithm Determination . . . . . . . . . . . . . . . . . 9 3.4. Header Web Key (hwk) . . . . . . . . . . . . . . . . . . 12 3.5. JKT JWT Self-Issued Key Delegation (jkt-jwt) . . . . . . 13 3.6. JWKS URI Discovery (jwks_uri) . . . . . . . . . . . . . . 18 3.7. Direct JWKS (jwks) . . . . . . . . . . . . . . . . . . . 19 3.8. JWT Confirmation Key (jwt) . . . . . . . . . . . . . . . 20 3.9. Self-Issued JWT (self-jwt) . . . . . . . . . . . . . . . 22 3.10. X.509 Certificates (x509) . . . . . . . . . . . . . . . . 25 3.11. Cached Assertion (cached) . . . . . . . . . . . . . . . . 26 4. Accept-Signature-Scheme and Accept-Signature-Alg Response Headers . . . . . . . . . . . . . . . . . . . . . . . . . 27 4.1. Accept-Signature-Scheme . . . . . . . . . . . . . . . . . 28 4.2. Accept-Signature-Alg . . . . . . . . . . . . . . . . . . 28 4.3. Relationship to Accept-Signature . . . . . . . . . . . . 29 4.4. Sending on Errors and on Challenges . . . . . . . . . . . 30 4.5. Response Status Codes . . . . . . . . . . . . . . . . . . 30 4.6. Incremental Adoption . . . . . . . . . . . . . . . . . . 31 4.7. Coexistence with WWW-Authenticate . . . . . . . . . . . . 32 4.8. Examples . . . . . . . . . . . . . . . . . . . . . . . . 33 4.9. Client Processing . . . . . . . . . . . . . . . . . . . . 33 Hardt & Meunier Expires 6 February 2027 [Page 2] Internet-Draft Signature-Keys August 2026 5. Signature-Error HTTP Response Header . . . . . . . . . . . . 34 5.1. Header Structure . . . . . . . . . . . . . . . . . . . . 34 5.2. Response Body . . . . . . . . . . . . . . . . . . . . . . 35 5.3. Access Denied . . . . . . . . . . . . . . . . . . . . . . 35 5.4. Error Codes . . . . . . . . . . . . . . . . . . . . . . . 35 5.4.1. unsupported_algorithm . . . . . . . . . . . . . . . . 35 5.4.2. unsupported_scheme . . . . . . . . . . . . . . . . . 36 5.4.3. cache_miss . . . . . . . . . . . . . . . . . . . . . 36 5.4.4. invalid_signature . . . . . . . . . . . . . . . . . . 36 5.4.5. invalid_input . . . . . . . . . . . . . . . . . . . . 37 5.4.6. invalid_request . . . . . . . . . . . . . . . . . . . 37 5.4.7. invalid_key . . . . . . . . . . . . . . . . . . . . . 37 5.4.8. unknown_key . . . . . . . . . . . . . . . . . . . . . 37 5.4.9. issuer_missing . . . . . . . . . . . . . . . . . . . 37 5.4.10. issuer_mismatch . . . . . . . . . . . . . . . . . . . 38 5.4.11. invalid_jwt . . . . . . . . . . . . . . . . . . . . . 38 5.4.12. expired_jwt . . . . . . . . . . . . . . . . . . . . . 38 6. Signature-Key-Cache Response Header . . . . . . . . . . . . . 38 6.1. Presenting and Resolving a Cached Assertion . . . . . . . 40 6.2. Degradation and Interoperability . . . . . . . . . . . . 40 7. Security Considerations . . . . . . . . . . . . . . . . . . . 41 7.1. Key Validation . . . . . . . . . . . . . . . . . . . . . 41 7.2. Caching and Performance . . . . . . . . . . . . . . . . . 41 7.3. Scheme-Specific Risks . . . . . . . . . . . . . . . . . . 42 7.4. Algorithm Selection . . . . . . . . . . . . . . . . . . . 44 7.5. Symmetric Algorithms . . . . . . . . . . . . . . . . . . 45 7.6. Cache Identifiers . . . . . . . . . . . . . . . . . . . . 45 7.7. Post-Quantum Key and Signature Sizes . . . . . . . . . . 47 7.8. Signature-Key Integrity . . . . . . . . . . . . . . . . . 47 8. Privacy Considerations . . . . . . . . . . . . . . . . . . . 48 8.1. Pseudonymity vs. Identity . . . . . . . . . . . . . . . . 48 8.2. Key Discovery Tracking . . . . . . . . . . . . . . . . . 48 8.3. JWT Contents . . . . . . . . . . . . . . . . . . . . . . 48 9. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 49 9.1. HTTP Field Name Registration . . . . . . . . . . . . . . 49 9.2. Signature-Key Scheme Registry . . . . . . . . . . . . . . 50 9.2.1. Registration Procedure . . . . . . . . . . . . . . . 50 9.2.2. Initial Registry Contents . . . . . . . . . . . . . . 50 9.2.3. Registration Template . . . . . . . . . . . . . . . . 51 9.3. URN Sub-namespace Registration . . . . . . . . . . . . . 51 9.4. Signature Error Code Registry . . . . . . . . . . . . . . 51 9.4.1. Initial Registry Contents . . . . . . . . . . . . . . 52 9.4.2. Registration Template . . . . . . . . . . . . . . . . 53 9.5. Designated Expert Instructions . . . . . . . . . . . . . 53 10. Document History . . . . . . . . . . . . . . . . . . . . . . 54 11. Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . 62 12. References . . . . . . . . . . . . . . . . . . . . . . . . . 62 12.1. Normative References . . . . . . . . . . . . . . . . . . 62 Hardt & Meunier Expires 6 February 2027 [Page 3] Internet-Draft Signature-Keys August 2026 12.2. Informative References . . . . . . . . . . . . . . . . . 63 Appendix A. Design Rationale . . . . . . . . . . . . . . . . . . 65 A.1. Why jwks_uri Instead of Inline JWKS? . . . . . . . . . . 65 A.2. Why Both jwks and jwks_uri? . . . . . . . . . . . . . . . 66 A.3. Why a Separate Header? . . . . . . . . . . . . . . . . . 66 A.4. Why Schemes Instead of Just a Key and Key ID? . . . . . . 67 A.5. Why a Scheme Token Instead of a Header per Scheme? . . . 67 A.6. Why Accept-Signature-Scheme and Accept-Signature-Alg Are Separate Headers . . . . . . . . . . . . . . . . . . . . 69 A.7. Layered Cryptographic Agility . . . . . . . . . . . . . . 71 A.8. Why the Verifier Issues the Cache Identifier . . . . . . 72 A.9. Precedents for Assertion Caching . . . . . . . . . . . . 73 A.10. Why Strings Instead of Byte Sequences for hwk? . . . . . 74 A.11. Why alg Is Required on Every Conveyed Key . . . . . . . . 74 Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 75 1. Conventions and Definitions {::boilerplate bcp14-tagged} 2. Introduction HTTP Message Signatures [RFC9421] provides a powerful mechanism for creating and verifying digital signatures over HTTP messages. To verify a signature, the verifier needs the signer's public key. While RFC 9421 defines signature creation and verification procedures, it intentionally leaves key distribution to application protocols, recognizing that different deployments have different trust requirements. Where the signer and verifier have no prior relationship, that gap is usually filled by out-of-band pre-registration or by an application- specific token. This document addresses the cases those two options do not cover. *A verifier may have no prior relationship with the signer.* Pre- registration assumes the signer is known before the request. Agents, first-contact clients, and cross-domain callers frequently are not. When the first request is also the first contact, there is no registration step in which to have exchanged a key. The key, or a means to obtain it, has to travel with the request. *The key material and its trust model are separate questions.* "Which key signed this" and "why should the verifier trust that key" are distinct. A raw inline key answers the first and defers the second to the verifier's policy. A key discovered from an origin ties the key to that origin. A delegated key carries an assertion from a third party. A certificate chain carries a PKI trust path. These Hardt & Meunier Expires 6 February 2027 [Page 4] Internet-Draft Signature-Keys August 2026 are different trust models over the same signature primitive, and a mechanism that hard-codes one of them cannot serve the others. This document treats the trust model as a scheme dimension rather than a fixed choice. *Key conveyance must be covered by the signature it introduces.* If the keying material or its identifier travels alongside the signature but is not itself signed over, an intermediary can substitute a different key or identifier and the signature still verifies against the substituted key. Conveying the key in a covered component closes this. A design that carries the key outside the signature's covered components reopens it. Section 7.8 describes the scheme-substitution and identity-substitution attacks this prevents. *The verifier must be able to state what it will accept.* A signer that guesses the wrong key distribution scheme, or the wrong algorithm, learns nothing useful from a bare verification failure. Without a way for the verifier to say what it requires and what it supports, the extension point cannot be exercised or negotiated, and it ossifies. This document defines: * *Signature-Key* (Section 3) — a request header that distributes public keys for HTTP Message Signature verification. The header supports eight schemes, each designed for different trust models and operational requirements: 1. *Header Web Key (hwk)* - Self-contained public keys for pseudonymous verification 2. *JKT JWT (jkt-jwt)* - Self-issued key delegation via JWK Thumbprint JWTs ("jacket jot") 3. *JWKS URI (jwks_uri)* - Identified signers with key discovery via metadata 4. *Direct JWKS (jwks)* - Keys fetched directly from an HTTPS URL that is also the signer identity 5. *JWT (jwt)* - Delegated keys embedded in signed JWTs for horizontal scale 6. *Self-Issued JWT (self-jwt)* - Self-signed JWTs where the signer and issuer are the same party 7. *X.509 (x509)* - Certificate-based verification with PKI trust chains 8. *Cached Assertion (cached)* - A reference to an assertion the verifier has already cached Additional schemes may be defined through the IANA registry established by this document. Hardt & Meunier Expires 6 February 2027 [Page 5] Internet-Draft Signature-Keys August 2026 * *Accept-Signature-Scheme* and *Accept-Signature-Alg* (Section 4) — response headers stating the Signature-Key schemes and the signature algorithms the server accepts. Both are Lists, so a server states its full accepted set and a client selects a scheme and an algorithm before signing. * *Signature-Error* (Section 5) — a response header that provides structured error information when signature verification fails, enabling clients to diagnose and correct signing issues. * *Signature-Key-Cache* (Section 6) — a response header by which a verifier issues the caller an opaque cache identifier for an assertion it has cached, so that later requests can reference the assertion instead of resending it. Three properties follow from the gaps above and are held as invariants throughout this document: 1. Keying material or its identifier is conveyed in the Signature- Key header, which is a covered component (Section 7.8). The signature protects the key or identifier that introduces it. 2. The trust model is a scheme, not a fixed choice. A single header (Section 3) carries any of an inline key, an origin-discovered key, a delegated key, or a certificate chain, distinguished by a scheme token. The header is one namespace for key conveyance; the trust model varies within it. 3. Unknown schemes and algorithms have defined, mandatory feedback. A verifier that does not implement a presented scheme returns unsupported_scheme with the set it supports (Section 5.4.2). A verifier requires fully-specified algorithms and rejects underspecified ones (Section 3.3). The extension point is exercised on ordinary traffic rather than only at the moment a new value is first deployed, per the guidance of [RFC9170]. The Signature-Key header works in conjunction with the Signature- Input and Signature headers defined in RFC 9421, using matching labels to correlate signature metadata with keying material. The mechanisms in this document were designed as general-purpose building blocks and are used by other specifications. In the AAuth protocol [I-D.hardt-oauth-aauth-protocol], all parties communicate using Signature-Key to distribute the keys that verify their signed requests. Email Verification [I-D.hardt-email-verification] uses the hwk scheme to convey the browser's public key so the issuer can bind it into the verification token it issues. Additional protocols can adopt these mechanisms without further coordination. Hardt & Meunier Expires 6 February 2027 [Page 6] Internet-Draft Signature-Keys August 2026 3. Signature-Key HTTP Request Header The Signature-Key header provides the public key or key reference needed to verify an HTTP Message Signature. It is a Structured Field Dictionary [RFC8941] keyed by signature label, where each member describes how to obtain the verification key for the corresponding signature. *Format:* Signature-Key: