HTTP D. Hardt Internet-Draft Hellō Intended status: Standards Track T. Meunier Expires: 11 October 2026 Cloudflare 9 April 2026 HTTP Signature Keys draft-hardt-httpbis-signature-key-04 Abstract This document defines two HTTP header fields and one Accept-Signature parameter for use with HTTP Message Signatures as defined in RFC 9421. The Signature-Key request header distributes public keys used to verify signatures, with five 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), JWT-based delegation (jwt), and X.509 certificate chains (x509). The sigkey parameter extends Accept-Signature (RFC 9421 Section 5) to indicate the type of Signature-Key the server requires. The Signature-Error response header provides structured error information when signature verification fails. 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 11 October 2026 [Page 1] Internet-Draft Signature-Keys April 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 11 October 2026. 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 . . . . . . . . . . . . . . 5 3.1. Label Consistency . . . . . . . . . . . . . . . . . . . . 6 3.2. Multiple Signatures . . . . . . . . . . . . . . . . . . . 6 3.3. Header Web Key (hwk) . . . . . . . . . . . . . . . . . . 7 3.4. JKT JWT Self-Issued Key Delegation (jkt-jwt) . . . . . . 8 3.5. JWKS URI Discovery (jwks_uri) . . . . . . . . . . . . . . 11 3.6. JWT Confirmation Key (jwt) . . . . . . . . . . . . . . . 12 3.7. X.509 Certificates (x509) . . . . . . . . . . . . . . . . 14 4. Accept-Signature sigkey Parameter . . . . . . . . . . . . . . 15 4.1. Parameter Definition . . . . . . . . . . . . . . . . . . 15 4.2. Label Binding . . . . . . . . . . . . . . . . . . . . . . 16 4.3. Response Status Codes . . . . . . . . . . . . . . . . . . 16 4.4. sigkey Semantics . . . . . . . . . . . . . . . . . . . . 17 4.4.1. jkt . . . . . . . . . . . . . . . . . . . . . . . . . 17 4.4.2. uri . . . . . . . . . . . . . . . . . . . . . . . . . 17 4.4.3. x509 . . . . . . . . . . . . . . . . . . . . . . . . 18 4.5. Incremental Adoption . . . . . . . . . . . . . . . . . . 18 4.6. Coexistence with WWW-Authenticate . . . . . . . . . . . . 19 4.7. Examples . . . . . . . . . . . . . . . . . . . . . . . . 19 4.8. Client Processing . . . . . . . . . . . . . . . . . . . . 20 5. Signature-Error HTTP Response Header . . . . . . . . . . . . 20 5.1. Header Structure . . . . . . . . . . . . . . . . . . . . 20 5.2. Response Body . . . . . . . . . . . . . . . . . . . . . . 21 Hardt & Meunier Expires 11 October 2026 [Page 2] Internet-Draft Signature-Keys April 2026 5.3. Access Denied . . . . . . . . . . . . . . . . . . . . . . 21 5.4. Error Codes . . . . . . . . . . . . . . . . . . . . . . . 21 5.4.1. unsupported_algorithm . . . . . . . . . . . . . . . . 21 5.4.2. invalid_signature . . . . . . . . . . . . . . . . . . 22 5.4.3. invalid_input . . . . . . . . . . . . . . . . . . . . 22 5.4.4. invalid_request . . . . . . . . . . . . . . . . . . . 22 5.4.5. invalid_key . . . . . . . . . . . . . . . . . . . . . 22 5.4.6. unknown_key . . . . . . . . . . . . . . . . . . . . . 22 5.4.7. invalid_jwt . . . . . . . . . . . . . . . . . . . . . 23 5.4.8. expired_jwt . . . . . . . . . . . . . . . . . . . . . 23 6. Security Considerations . . . . . . . . . . . . . . . . . . . 23 6.1. Key Validation . . . . . . . . . . . . . . . . . . . . . 23 6.2. Caching and Performance . . . . . . . . . . . . . . . . . 23 6.3. Scheme-Specific Risks . . . . . . . . . . . . . . . . . . 24 6.4. Algorithm Selection . . . . . . . . . . . . . . . . . . . 25 6.5. Signature-Key Integrity . . . . . . . . . . . . . . . . . 25 7. Privacy Considerations . . . . . . . . . . . . . . . . . . . 25 7.1. Pseudonymity vs. Identity . . . . . . . . . . . . . . . . 26 7.2. Key Discovery Tracking . . . . . . . . . . . . . . . . . 26 7.3. JWT Contents . . . . . . . . . . . . . . . . . . . . . . 26 8. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 27 8.1. HTTP Field Name Registration . . . . . . . . . . . . . . 27 8.2. Signature-Key Scheme Registry . . . . . . . . . . . . . . 27 8.2.1. Registration Procedure . . . . . . . . . . . . . . . 27 8.2.2. Initial Registry Contents . . . . . . . . . . . . . . 28 8.2.3. Registration Template . . . . . . . . . . . . . . . . 28 8.3. HTTP Signature Metadata Parameters . . . . . . . . . . . 28 8.4. URN Sub-namespace Registration . . . . . . . . . . . . . 29 8.5. Signature Error Code Registry . . . . . . . . . . . . . . 29 8.5.1. Initial Registry Contents . . . . . . . . . . . . . . 29 9. References . . . . . . . . . . . . . . . . . . . . . . . . . 30 9.1. Normative References . . . . . . . . . . . . . . . . . . 30 9.2. Informative References . . . . . . . . . . . . . . . . . 31 Appendix A. Document History . . . . . . . . . . . . . . . . . . 32 A.1. draft-hardt-httpbis-signature-key-04 . . . . . . . . . . 32 A.2. draft-hardt-httpbis-signature-key-03 . . . . . . . . . . 32 A.3. draft-hardt-httpbis-signature-key-02 . . . . . . . . . . 32 A.4. draft-hardt-httpbis-signature-key-01 . . . . . . . . . . 32 Appendix B. Design Rationale . . . . . . . . . . . . . . . . . . 33 B.1. Why jwks_uri Instead of Inline JWKS? . . . . . . . . . . 33 B.2. Why a Separate Header? . . . . . . . . . . . . . . . . . 33 B.3. Why Schemes Instead of Just a Key and Key ID? . . . . . . 34 B.4. Why Strings Instead of Byte Sequences for hwk? . . . . . 35 Appendix C. Acknowledgments . . . . . . . . . . . . . . . . . . 35 Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 35 Hardt & Meunier Expires 11 October 2026 [Page 3] Internet-Draft Signature-Keys April 2026 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. This document defines: * *Signature-Key* (Signature-Key HTTP Request Header (#signature- key-http-request-header)) — a request header that distributes public keys for HTTP Message Signature verification. The header supports five 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. *JWT (jwt)* - Delegated keys embedded in signed JWTs for horizontal scale 5. *X.509 (x509)* - Certificate-based verification with PKI trust chains Additional schemes may be defined through the IANA registry established by this document. * *sigkey* (Accept-Signature sigkey Parameter (#accept-signature- sigkey-parameter)) — a parameter for the Accept-Signature header ([RFC9421], Section 5) that indicates the type of Signature-Key the server requires. This extends RFC 9421's existing mechanism for requesting signatures rather than defining a new header. * *Signature-Error* (Signature-Error HTTP Response Header (#signature-error-http-response-header)) — a response header that provides structured error information when signature verification fails, enabling clients to diagnose and correct signing issues. Hardt & Meunier Expires 11 October 2026 [Page 4] Internet-Draft Signature-Keys April 2026 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. 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: