draft-ietf-httpbis-message-signatures-00.txt | draft-ietf-httpbis-message-signatures-01.txt | |||
---|---|---|---|---|
HTTPbis Working Group A. Backman, Ed. | HTTP A. Backman, Ed. | |||
Internet-Draft Amazon | Internet-Draft Amazon | |||
Intended status: Standards Track J. Richer | Intended status: Standards Track J. Richer | |||
Expires: 12 October 2020 Bespoke Engineering | Expires: 21 May 2021 Bespoke Engineering | |||
M. Sporny | M. Sporny | |||
Digital Bazaar | Digital Bazaar | |||
10 April 2020 | 17 November 2020 | |||
Signing HTTP Messages | Signing HTTP Messages | |||
draft-ietf-httpbis-message-signatures-00 | draft-ietf-httpbis-message-signatures-01 | |||
Abstract | Abstract | |||
This document describes a mechanism for creating, encoding, and | This document describes a mechanism for creating, encoding, and | |||
verifying digital signatures or message authentication codes over | verifying digital signatures or message authentication codes over | |||
content within an HTTP message. This mechanism supports use cases | content within an HTTP message. This mechanism supports use cases | |||
where the full HTTP message may not be known to the signer, and where | where the full HTTP message may not be known to the signer, and where | |||
the message may be transformed (e.g., by intermediaries) before | the message may be transformed (e.g., by intermediaries) before | |||
reaching the verifier. | reaching the verifier. | |||
Note | Note to Readers | |||
This draft is based on draft-cavage-http-signatures-12. The | _RFC EDITOR: please remove this section before publication_ | |||
community (https://github.com/w3c-dvcg/http-signatures/ | ||||
issues?page=2&q=is%3Aissue+is%3Aopen) and the authors have identified | ||||
several issues with the current text. Additionally, the authors have | ||||
identified a number of features that are required in order to support | ||||
additional use cases. In order to preserve continuity with the | ||||
effort that has been put into draft-cavage-http-signatures-12, this | ||||
draft maintains normative compatibility with it, and thus does not | ||||
address these issues or include these features, as doing so requires | ||||
making backwards-incompatible changes to normative requirements. | ||||
While such changes are inevitable, the editor recommends that they be | ||||
driven by working group discussion following adoption of the draft | ||||
(see Topics for Working Group Discussion). The editor requests that | ||||
the working group recognize the intent of this initial draft and this | ||||
recommendation when considering adoption of this draft. | ||||
This note is to be removed before publishing as an RFC. | This work was originally based on draft-cavage-http-signatures-12, | |||
but has since diverged from it, to reflect discussion since adoption | ||||
by the HTTP Working Group. In particular, it addresses issues that | ||||
have been identified, and adds features to support new use cases. It | ||||
is a work-in-progress and not yet suitable for deployment. | ||||
Status of This Memo | Status of This Memo | |||
This Internet-Draft is submitted in full conformance with the | This Internet-Draft is submitted in full conformance with the | |||
provisions of BCP 78 and BCP 79. | provisions of BCP 78 and BCP 79. | |||
Internet-Drafts are working documents of the Internet Engineering | Internet-Drafts are working documents of the Internet Engineering | |||
Task Force (IETF). Note that other groups may also distribute | Task Force (IETF). Note that other groups may also distribute | |||
working documents as Internet-Drafts. The list of current Internet- | working documents as Internet-Drafts. The list of current Internet- | |||
Drafts is at https://datatracker.ietf.org/drafts/current/. | Drafts is at https://datatracker.ietf.org/drafts/current/. | |||
Internet-Drafts are draft documents valid for a maximum of six months | Internet-Drafts are draft documents valid for a maximum of six months | |||
and may be updated, replaced, or obsoleted by other documents at any | and may be updated, replaced, or obsoleted by other documents at any | |||
time. It is inappropriate to use Internet-Drafts as reference | time. It is inappropriate to use Internet-Drafts as reference | |||
material or to cite them other than as "work in progress." | material or to cite them other than as "work in progress." | |||
This Internet-Draft will expire on 12 October 2020. | This Internet-Draft will expire on 21 May 2021. | |||
Copyright Notice | Copyright Notice | |||
Copyright (c) 2020 IETF Trust and the persons identified as the | Copyright (c) 2020 IETF Trust and the persons identified as the | |||
document authors. All rights reserved. | document authors. All rights reserved. | |||
This document is subject to BCP 78 and the IETF Trust's Legal | This document is subject to BCP 78 and the IETF Trust's Legal | |||
Provisions Relating to IETF Documents (https://trustee.ietf.org/ | Provisions Relating to IETF Documents (https://trustee.ietf.org/ | |||
license-info) in effect on the date of publication of this document. | license-info) in effect on the date of publication of this document. | |||
Please review these documents carefully, as they describe your rights | Please review these documents carefully, as they describe your rights | |||
and restrictions with respect to this document. Code Components | and restrictions with respect to this document. Code Components | |||
extracted from this document must include Simplified BSD License text | extracted from this document must include Simplified BSD License text | |||
as described in Section 4.e of the Trust Legal Provisions and are | as described in Section 4.e of the Trust Legal Provisions and are | |||
provided without warranty as described in the Simplified BSD License. | provided without warranty as described in the Simplified BSD License. | |||
Table of Contents | Table of Contents | |||
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 3 | 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 4 | |||
1.1. Requirements Discussion . . . . . . . . . . . . . . . . . 4 | 1.1. Requirements Discussion . . . . . . . . . . . . . . . . . 5 | |||
1.2. HTTP Message Transformations . . . . . . . . . . . . . . 5 | 1.2. HTTP Message Transformations . . . . . . . . . . . . . . 5 | |||
1.3. Safe Transformations . . . . . . . . . . . . . . . . . . 5 | 1.3. Safe Transformations . . . . . . . . . . . . . . . . . . 6 | |||
1.4. Conventions and Terminology . . . . . . . . . . . . . . . 6 | 1.4. Conventions and Terminology . . . . . . . . . . . . . . . 7 | |||
2. Identifying and Canonicalizing Content . . . . . . . . . . . 7 | 2. Identifying and Canonicalizing Content . . . . . . . . . . . 8 | |||
2.1. HTTP Header Fields . . . . . . . . . . . . . . . . . . . 7 | 2.1. HTTP Header Fields . . . . . . . . . . . . . . . . . . . 8 | |||
2.2. Signature Creation Time . . . . . . . . . . . . . . . . . 8 | 2.1.1. Canonicalization Examples . . . . . . . . . . . . . . 9 | |||
2.3. Signature Expiration Time . . . . . . . . . . . . . . . . 9 | 2.2. Dictionary Structured Field Members . . . . . . . . . . . 9 | |||
2.4. Target Endpoint . . . . . . . . . . . . . . . . . . . . . 9 | 2.2.1. Canonicalization Examples . . . . . . . . . . . . . . 10 | |||
3. HTTP Message Signatures . . . . . . . . . . . . . . . . . . . 10 | 2.3. List Prefixes . . . . . . . . . . . . . . . . . . . . . . 10 | |||
3.1. Signature Metadata . . . . . . . . . . . . . . . . . . . 10 | 2.3.1. Canonicalization Examples . . . . . . . . . . . . . . 10 | |||
3.2. Creating a Signature . . . . . . . . . . . . . . . . . . 11 | 2.4. Signature Creation Time . . . . . . . . . . . . . . . . . 11 | |||
3.2.1. Choose and Set Signature Metadata Properties . . . . 11 | 2.5. Signature Expiration Time . . . . . . . . . . . . . . . . 11 | |||
3.2.2. Create the Signature Input . . . . . . . . . . . . . 13 | 2.6. Target Endpoint . . . . . . . . . . . . . . . . . . . . . 11 | |||
3.2.3. Sign the Signature Input . . . . . . . . . . . . . . 14 | 2.6.1. Canonicalization Examples . . . . . . . . . . . . . . 12 | |||
3.3. Verifying a Signature . . . . . . . . . . . . . . . . . . 14 | 3. HTTP Message Signatures . . . . . . . . . . . . . . . . . . . 12 | |||
3.3.1. Enforcing Application Requirements . . . . . . . . . 15 | 3.1. Signature Metadata . . . . . . . . . . . . . . . . . . . 13 | |||
4. The 'Signature' HTTP Header . . . . . . . . . . . . . . . . . 15 | 3.2. Creating a Signature . . . . . . . . . . . . . . . . . . 13 | |||
4.1. Signature Header Parameters . . . . . . . . . . . . . . . 16 | 3.2.1. Choose and Set Signature Metadata Properties . . . . 14 | |||
4.2. Example . . . . . . . . . . . . . . . . . . . . . . . . . 17 | 3.2.2. Create the Signature Input . . . . . . . . . . . . . 16 | |||
5. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 17 | 3.2.3. Sign the Signature Input . . . . . . . . . . . . . . 17 | |||
5.1. HTTP Signature Algorithms Registry . . . . . . . . . . . 17 | 3.3. Verifying a Signature . . . . . . . . . . . . . . . . . . 17 | |||
5.1.1. Registration Template . . . . . . . . . . . . . . . . 17 | 3.3.1. Enforcing Application Requirements . . . . . . . . . 18 | |||
5.1.2. Initial Contents . . . . . . . . . . . . . . . . . . 18 | 4. Including a Message Signature in a Message . . . . . . . . . 19 | |||
5.2. HTTP Signature Parameters Registry . . . . . . . . . . . 20 | 4.1. The 'Signature-Input' HTTP Header . . . . . . . . . . . . 19 | |||
5.2.1. Registration Template . . . . . . . . . . . . . . . . 20 | 4.1.1. Metadata Parameters . . . . . . . . . . . . . . . . . 19 | |||
5.2.2. Initial Contents . . . . . . . . . . . . . . . . . . 20 | 4.2. The 'Signature' HTTP Header . . . . . . . . . . . . . . . 20 | |||
6. Security Considerations . . . . . . . . . . . . . . . . . . . 21 | 4.3. Examples . . . . . . . . . . . . . . . . . . . . . . . . 20 | |||
7. References . . . . . . . . . . . . . . . . . . . . . . . . . 21 | 5. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 21 | |||
7.1. Normative References . . . . . . . . . . . . . . . . . . 21 | 5.1. HTTP Signature Algorithms Registry . . . . . . . . . . . 21 | |||
7.2. Informative References . . . . . . . . . . . . . . . . . 22 | 5.1.1. Registration Template . . . . . . . . . . . . . . . . 21 | |||
Appendix A. Examples . . . . . . . . . . . . . . . . . . . . . . 23 | 5.1.2. Initial Contents . . . . . . . . . . . . . . . . . . 22 | |||
A.1. Example Keys . . . . . . . . . . . . . . . . . . . . . . 23 | 5.2. HTTP Signature Metadata Parameters Registry . . . . . . . 24 | |||
A.1.1. "rsa-test" . . . . . . . . . . . . . . . . . . . . . 23 | 5.2.1. Registration Template . . . . . . . . . . . . . . . . 24 | |||
A.2. Example "keyId" Values . . . . . . . . . . . . . . . . . 24 | 5.2.2. Initial Contents . . . . . . . . . . . . . . . . . . 24 | |||
A.3. Test Cases . . . . . . . . . . . . . . . . . . . . . . . 25 | 6. Security Considerations . . . . . . . . . . . . . . . . . . . 25 | |||
A.3.1. Signature Generation . . . . . . . . . . . . . . . . 25 | 7. References . . . . . . . . . . . . . . . . . . . . . . . . . 25 | |||
A.3.2. Signature Verification . . . . . . . . . . . . . . . 27 | 7.1. Normative References . . . . . . . . . . . . . . . . . . 25 | |||
Appendix B. Topics for Working Group Discussion . . . . . . . . 30 | 7.2. Informative References . . . . . . . . . . . . . . . . . 26 | |||
Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . . 36 | Appendix A. Examples . . . . . . . . . . . . . . . . . . . . . . 27 | |||
Document History . . . . . . . . . . . . . . . . . . . . . . . . 37 | A.1. Example Keys . . . . . . . . . . . . . . . . . . . . . . 27 | |||
Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 38 | A.1.1. Example Key RSA test . . . . . . . . . . . . . . . . 27 | |||
A.2. Example keyId Values . . . . . . . . . . . . . . . . . . 28 | ||||
A.3. Test Cases . . . . . . . . . . . . . . . . . . . . . . . 29 | ||||
A.3.1. Signature Generation . . . . . . . . . . . . . . . . 29 | ||||
A.3.2. Signature Verification . . . . . . . . . . . . . . . 32 | ||||
Appendix B. Topics for Working Group Discussion . . . . . . . . 34 | ||||
B.1. Issues . . . . . . . . . . . . . . . . . . . . . . . . . 34 | ||||
B.1.1. Confusing guidance on algorithm and key | ||||
identification . . . . . . . . . . . . . . . . . . . 35 | ||||
B.1.2. Lack of definition of keyId hurts interoperability . 35 | ||||
B.1.3. Algorithm Registry duplicates work of JWA . . . . . . 35 | ||||
B.1.4. Algorithm Registry should not be initialized with | ||||
deprecated entries . . . . . . . . . . . . . . . . . 36 | ||||
B.1.5. No percent-encoding normalization of path/query . . . 36 | ||||
B.1.6. Misleading name for headers parameter . . . . . . . . 36 | ||||
B.1.7. Changes to whitespace in header field values break | ||||
verification . . . . . . . . . . . . . . . . . . . . 36 | ||||
B.1.8. Multiple Set-Cookie headers are not well supported . 36 | ||||
B.1.9. Covered Content list is not signed . . . . . . . . . 37 | ||||
B.1.10. Algorithm is not signed . . . . . . . . . . . . . . . 37 | ||||
B.1.11. Verification key identifier is not signed . . . . . . 37 | ||||
B.1.12. Max values, precision for Integer String and Decimal | ||||
String not defined . . . . . . . . . . . . . . . . . 37 | ||||
B.1.13. keyId parameter value could break list syntax . . . . 37 | ||||
B.1.14. Creation Time and Expiration Time do not allow for | ||||
clock skew . . . . . . . . . . . . . . . . . . . . . 37 | ||||
B.1.15. Should require lowercased header field names as | ||||
identifiers . . . . . . . . . . . . . . . . . . . . . 37 | ||||
B.1.16. Reconcile Date header and Creation Time . . . . . . . 38 | ||||
B.1.17. Remove algorithm-specific rules for content | ||||
identifiers . . . . . . . . . . . . . . . . . . . . . 38 | ||||
B.1.18. Add guidance for signing compressed headers . . . . . 38 | ||||
B.1.19. Transformations to Via header field value break | ||||
verification . . . . . . . . . . . . . . . . . . . . 38 | ||||
B.1.20. Case changes to case-insensitive header field values | ||||
break verification . . . . . . . . . . . . . . . . . 38 | ||||
B.1.21. Need more examples for Signature header . . . . . . . 38 | ||||
B.1.22. Expiration not needed . . . . . . . . . . . . . . . . 39 | ||||
B.2. Features . . . . . . . . . . . . . . . . . . . . . . . . 39 | ||||
B.2.1. Define more content identifiers . . . . . . . . . . . 39 | ||||
B.2.2. Multiple signature support . . . . . . . . . . . . . 39 | ||||
B.2.3. Support for incremental signing of header field value | ||||
list items . . . . . . . . . . . . . . . . . . . . . 40 | ||||
B.2.4. Support expected authority changes . . . . . . . . . 40 | ||||
B.2.5. Support for signing specific cookies . . . . . . . . 40 | ||||
Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . . 41 | ||||
Document History . . . . . . . . . . . . . . . . . . . . . . . . 41 | ||||
Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 43 | ||||
1. Introduction | 1. Introduction | |||
Message integrity and authenticity are important security properties | Message integrity and authenticity are important security properties | |||
that are critical to the secure operation of many [HTTP] | that are critical to the secure operation of many HTTP applications. | |||
applications. Application developers typically rely on the transport | Application developers typically rely on the transport layer to | |||
layer to provide these properties, by operating their application | provide these properties, by operating their application over [TLS]. | |||
over TLS [RFC8446]. However, TLS only guarantees these properties | However, TLS only guarantees these properties over a single TLS | |||
over a single TLS connection, and the path between client and | connection, and the path between client and application may be | |||
application may be composed of multiple independent TLS connections | composed of multiple independent TLS connections (for example, if the | |||
(for example, if the application is hosted behind a TLS-terminating | application is hosted behind a TLS-terminating gateway or if the | |||
gateway or if the client is behind a TLS Inspection appliance). In | client is behind a TLS Inspection appliance). In such cases, TLS | |||
such cases, TLS cannot guarantee end-to-end message integrity or | cannot guarantee end-to-end message integrity or authenticity between | |||
authenticity between the client and application. Additionally, some | the client and application. Additionally, some operating | |||
operating environments present obstacles that make it impractical to | environments present obstacles that make it impractical to use TLS, | |||
use TLS, or to use features necessary to provide message | or to use features necessary to provide message authenticity. | |||
authenticity. Furthermore, some applications require the binding of | Furthermore, some applications require the binding of an application- | |||
an application-level key to the HTTP message, separate from any TLS | level key to the HTTP message, separate from any TLS certificates in | |||
certificates in use. Consequently, while TLS can meet message | use. Consequently, while TLS can meet message integrity and | |||
integrity and authenticity needs for many HTTP-based applications, it | authenticity needs for many HTTP-based applications, it is not a | |||
is not a universal solution. | universal solution. | |||
This document defines a mechanism for providing end-to-end integrity | This document defines a mechanism for providing end-to-end integrity | |||
and authenticity for content within an HTTP message. The mechanism | and authenticity for content within an HTTP message. The mechanism | |||
allows applications to create digital signatures or message | allows applications to create digital signatures or message | |||
authentication codes (MACs) over only that content within the message | authentication codes (MACs) over only that content within the message | |||
that is meaningful and appropriate for the application. Strict | that is meaningful and appropriate for the application. Strict | |||
canonicalization rules ensure that the verifier can verify the | canonicalization rules ensure that the verifier can verify the | |||
signature even if the message has been transformed in any of the many | signature even if the message has been transformed in any of the many | |||
ways permitted by HTTP. | ways permitted by HTTP. | |||
skipping to change at page 4, line 38 ¶ | skipping to change at page 5, line 29 ¶ | |||
and verifier to have the exact same signed content. Since the raw | and verifier to have the exact same signed content. Since the raw | |||
bytes of the message cannot be relied upon as signed content, the | bytes of the message cannot be relied upon as signed content, the | |||
signer and verifier must derive the signed content from their | signer and verifier must derive the signed content from their | |||
respective versions of the message, via a mechanism that is resilient | respective versions of the message, via a mechanism that is resilient | |||
to safe changes that do not alter the meaning of the message. | to safe changes that do not alter the meaning of the message. | |||
For a variety of reasons, it is impractical to strictly define what | For a variety of reasons, it is impractical to strictly define what | |||
constitutes a safe change versus an unsafe one. Applications use | constitutes a safe change versus an unsafe one. Applications use | |||
HTTP in a wide variety of ways, and may disagree on whether a | HTTP in a wide variety of ways, and may disagree on whether a | |||
particular piece of information in a message (e.g., the body, or the | particular piece of information in a message (e.g., the body, or the | |||
Date header field) is relevant. Thus a general purpose solution must | "Date" header field) is relevant. Thus a general purpose solution | |||
provide signers with some degree of control over which message | must provide signers with some degree of control over which message | |||
content is signed. | content is signed. | |||
HTTP applications may be running in environments that do not provide | HTTP applications may be running in environments that do not provide | |||
complete access to or control over HTTP messages (such as a web | complete access to or control over HTTP messages (such as a web | |||
browser's JavaScript environment), or may be using libraries that | browser's JavaScript environment), or may be using libraries that | |||
abstract away the details of the protocol (such as the Java | abstract away the details of the protocol (such as the Java | |||
HTTPClient library (https://openjdk.java.net/groups/net/httpclient/ | HTTPClient library (https://openjdk.java.net/groups/net/httpclient/ | |||
intro.html)). These applications need to be able to generate and | intro.html)). These applications need to be able to generate and | |||
verify signatures despite incomplete knowledge of the HTTP message. | verify signatures despite incomplete knowledge of the HTTP message. | |||
1.2. HTTP Message Transformations | 1.2. HTTP Message Transformations | |||
As mentioned earlier, HTTP explicitly permits and in some cases | As mentioned earlier, HTTP explicitly permits and in some cases | |||
requires implementations to transform messages in a variety of ways. | requires implementations to transform messages in a variety of ways. | |||
Implementations are required to tolerate many of these | Implementations are required to tolerate many of these | |||
transformations. What follows is a non-normative and non-exhaustive | transformations. What follows is a non-normative and non-exhaustive | |||
list of transformations that may occur under HTTP, provided as | list of transformations that may occur under HTTP, provided as | |||
context: | context: | |||
* Re-ordering of header fields with different header field names | * Re-ordering of header fields with different header field names | |||
([HTTP], Section 3.2.2). | ([MESSAGING], Section 3.2.2). | |||
* Combination of header fields with the same field name ([HTTP], | * Combination of header fields with the same field name | |||
Section 3.2.2). | ([MESSAGING], Section 3.2.2). | |||
* Removal of header fields listed in the "Connection" header field | * Removal of header fields listed in the "Connection" header field | |||
([HTTP], Section 6.1). | ([MESSAGING], Section 6.1). | |||
* Addition of header fields that indicate control options ([HTTP], | * Addition of header fields that indicate control options | |||
Section 6.1). | ([MESSAGING], Section 6.1). | |||
* Addition or removal of a transfer coding ([HTTP], Section 5.7.2). | * Addition or removal of a transfer coding ([MESSAGING], | |||
Section 5.7.2). | ||||
* Addition of header fields such as "Via" ([HTTP], Section 5.7.1) | * Addition of header fields such as "Via" ([MESSAGING], | |||
and "Forwarded" ([RFC7239], Section 4). | Section 5.7.1) and "Forwarded" ([RFC7239], Section 4). | |||
1.3. Safe Transformations | 1.3. Safe Transformations | |||
Based on the definition of HTTP and the requirements described above, | Based on the definition of HTTP and the requirements described above, | |||
we can identify certain types of transformations that should not | we can identify certain types of transformations that should not | |||
prevent signature verification, even when performed on content | prevent signature verification, even when performed on content | |||
covered by the signature. The following list describes those | covered by the signature. The following list describes those | |||
transformations: | transformations: | |||
* Combination of header fields with the same field name. | * Combination of header fields with the same field name. | |||
* Reordering of header fields with different names. | * Reordering of header fields with different names. | |||
* Conversion between HTTP/1.x and HTTP/2, or vice-versa. | * Conversion between different versions of the HTTP protocol (e.g., | |||
HTTP/1.x to HTTP/2, or vice-versa). | ||||
* Changes in casing (e.g., "Origin" to "origin") of any case- | * Changes in casing (e.g., "Origin" to "origin") of any case- | |||
insensitive content such as header field names, request URI | insensitive content such as header field names, request URI | |||
scheme, or host. | scheme, or host. | |||
* Addition or removal of leading or trailing whitespace to a header | * Addition or removal of leading or trailing whitespace to a header | |||
field value. | field value. | |||
* Addition or removal of "obs-fold"s. | * Addition or removal of "obs-folds". | |||
* Changes to the request-target and Host header field that when | * Changes to the "request-target" and "Host" header field that when | |||
applied together do not result in a change to the message's | applied together do not result in a change to the message's | |||
effective request URI, as defined in Section 5.5 of [HTTP]. | effective request URI, as defined in Section 5.5 of [MESSAGING]. | |||
Additionally, all changes to content not covered by the signature are | Additionally, all changes to content not covered by the signature are | |||
considered safe. | considered safe. | |||
1.4. Conventions and Terminology | 1.4. Conventions and Terminology | |||
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | |||
"SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | |||
"OPTIONAL" in this document are to be interpreted as described in | "OPTIONAL" in this document are to be interpreted as described in | |||
BCP14 [RFC2119] [RFC8174] when, and only when, they appear in all | BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all | |||
capitals, as shown here. | capitals, as shown here. | |||
The terms "HTTP message", "HTTP method", "HTTP request", "HTTP | The terms "HTTP message", "HTTP request", "HTTP response", "absolute- | |||
response", "absolute-form", "absolute-path", "effective request URI", | form", "absolute-path", "effective request URI", "gateway", "header | |||
"gateway", "header field", "intermediary", "request-target", | field", "intermediary", "request-target", "sender", and "recipient" | |||
"sender", and "recipient" are used as defined in [HTTP]. | are used as defined in [MESSAGING]. | |||
The term "method" is to be interpreted as defined in Section 4 of | ||||
[SEMANTICS]. | ||||
For brevity, the term "signature" on its own is used in this document | For brevity, the term "signature" on its own is used in this document | |||
to refer to both digital signatures and keyed MACs. Similarly, the | to refer to both digital signatures and keyed MACs. Similarly, the | |||
verb "sign" refers to the generation of either a digital signature or | verb "sign" refers to the generation of either a digital signature or | |||
keyed MAC over a given input string. The qualified term "digital | keyed MAC over a given input string. The qualified term "digital | |||
signature" refers specifically to the output of an asymmetric | signature" refers specifically to the output of an asymmetric | |||
cryptographic signing operation. | cryptographic signing operation. | |||
In addition to those listed above, this document uses the following | In addition to those listed above, this document uses the following | |||
terms: | terms: | |||
Decimal String | Decimal String | |||
An Integer String optionally concatenated with a period ""."" | ||||
An Integer String optionally concatenated with a period "." | ||||
followed by a second Integer String, representing a positive real | followed by a second Integer String, representing a positive real | |||
number expressed in base 10. The first Integer String represents | number expressed in base 10. The first Integer String represents | |||
the integral portion of the number, while the optional second | the integral portion of the number, while the optional second | |||
Integer String represents the fractional portion of the number. [[ | Integer String represents the fractional portion of the number. | |||
Editor's note: There's got to be a definition for this that we can | (( Editor's note: There's got to be a definition for this that we | |||
reference. ]] | can reference. )) | |||
Integer String | Integer String | |||
A US-ASCII string of one or more digits ""0-9"", representing a | ||||
positive integer in base 10. [[ Editor's note: There's got to be a | A US-ASCII string of one or more digits "0-9", representing a | |||
definition for this that we can reference. ]] | positive integer in base 10. (( Editor's note: There's got to be a | |||
definition for this that we can reference. )) | ||||
Signer | Signer | |||
The entity that is generating or has generated an HTTP Message | The entity that is generating or has generated an HTTP Message | |||
Signature. | Signature. | |||
Verifier | Verifier | |||
An entity that is verifying or has verified an HTTP Message | An entity that is verifying or has verified an HTTP Message | |||
Signature against an HTTP Message. Note that an HTTP Message | Signature against an HTTP Message. Note that an HTTP Message | |||
Signature may be verified multiple times, potentially by different | Signature may be verified multiple times, potentially by different | |||
entities. | entities. | |||
This document contains non-normative examples of partial and complete | This document contains non-normative examples of partial and complete | |||
skipping to change at page 7, line 14 ¶ | skipping to change at page 8, line 12 ¶ | |||
Verifier | Verifier | |||
An entity that is verifying or has verified an HTTP Message | An entity that is verifying or has verified an HTTP Message | |||
Signature against an HTTP Message. Note that an HTTP Message | Signature against an HTTP Message. Note that an HTTP Message | |||
Signature may be verified multiple times, potentially by different | Signature may be verified multiple times, potentially by different | |||
entities. | entities. | |||
This document contains non-normative examples of partial and complete | This document contains non-normative examples of partial and complete | |||
HTTP messages. To improve readability, header fields may be split | HTTP messages. To improve readability, header fields may be split | |||
into multiple lines, using the "obs-fold" syntax. This syntax is | into multiple lines, using the "obs-fold" syntax. This syntax is | |||
deprecated in [HTTP], and senders MUST NOT generate messages that | deprecated in [MESSAGING], and senders MUST NOT generate messages | |||
include it. | that include it. | |||
2. Identifying and Canonicalizing Content | 2. Identifying and Canonicalizing Content | |||
In order to allow signers and verifiers to establish which content is | In order to allow signers and verifiers to establish which content is | |||
covered by a signature, this document defines content identifiers for | covered by a signature, this document defines content identifiers for | |||
signature metadata and discrete pieces of message content that may be | signature metadata and discrete pieces of message content that may be | |||
covered by an HTTP Message Signature. | covered by an HTTP Message Signature. | |||
Some content within HTTP messages may undergo transformations that | Some content within HTTP messages may undergo transformations that | |||
change the bitwise value without altering meaning of the content (for | change the bitwise value without altering meaning of the content (for | |||
skipping to change at page 7, line 38 ¶ | skipping to change at page 8, line 36 ¶ | |||
to ensure that a signature can be verified despite such innocuous | to ensure that a signature can be verified despite such innocuous | |||
transformations. This document defines rules for each content | transformations. This document defines rules for each content | |||
identifier that transform the identifier's associated content into | identifier that transform the identifier's associated content into | |||
such a canonical form. | such a canonical form. | |||
The following sections define content identifiers, their associated | The following sections define content identifiers, their associated | |||
content, and their canonicalization rules. | content, and their canonicalization rules. | |||
2.1. HTTP Header Fields | 2.1. HTTP Header Fields | |||
An HTTP header field value is identified by its header field name. | An HTTP header field is identified by its header field name. While | |||
While HTTP header field names are case-insensitive, implementations | HTTP header field names are case-insensitive, implementations MUST | |||
SHOULD use lowercased field names (e.g., "content-type", "date", | use lowercased field names (e.g., "content-type", "date", "etag") | |||
"etag") when using them as content identifiers. | when using them as content identifiers. | |||
An HTTP header field value is canonicalized as follows: | An HTTP header field value is canonicalized as follows: | |||
1. Create an ordered list of the field values of each instance of | 1. Create an ordered list of the field values of each instance of | |||
the header field in the message, in the order that they occur (or | the header field in the message, in the order that they occur (or | |||
will occur) in the message. | will occur) in the message. | |||
2. Strip leading and trailing whitespace from each item in the list. | 2. Strip leading and trailing whitespace from each item in the list. | |||
3. Concatenate the list items together, with a comma "","" and space | 3. Concatenate the list items together, with a comma "," and space " | |||
"" "" between each item. The resulting string is the | " between each item. The resulting string is the canonicalized | |||
canonicalized value. | value. | |||
2.1.1. Canonicalization Examples | 2.1.1. Canonicalization Examples | |||
This section contains non-normative examples of canonicalized values | This section contains non-normative examples of canonicalized values | |||
for header fields, given the following example HTTP message: | for header fields, given the following example HTTP message: | |||
HTTP/1.1 200 OK | HTTP/1.1 200 OK | |||
Server: www.example.com | Server: www.example.com | |||
Date: Tue, 07 Jun 2014 20:51:35 GMT | Date: Tue, 07 Jun 2014 20:51:35 GMT | |||
X-OWS-Header: Leading and trailing whitespace. | X-OWS-Header: Leading and trailing whitespace. | |||
X-Obs-Fold-Header: Obsolete | X-Obs-Fold-Header: Obsolete | |||
line folding. | line folding. | |||
X-Empty-Header: | X-Empty-Header: | |||
Cache-Control: max-age=60 | Cache-Control: max-age=60 | |||
Cache-Control: must-revalidate | Cache-Control: must-revalidate | |||
The following table shows example canonicalized values for header | The following table shows example canonicalized values for header | |||
fields, given that message: | fields, given that message: | |||
+---------------------+------------------------------------+ | +===================+==================================+ | |||
| Header Field | Canonicalized Value | | | Header Field | Canonicalized Value | | |||
+=====================+====================================+ | +===================+==================================+ | |||
| "cache-control" | "max-age=60, must-revalidate" | | | cache-control | max-age=60, must-revalidate | | |||
+---------------------+------------------------------------+ | +-------------------+----------------------------------+ | |||
| "date" | "Tue, 07 Jun 2014 20:51:35 GMT" | | | date | Tue, 07 Jun 2014 20:51:35 GMT | | |||
+---------------------+------------------------------------+ | +-------------------+----------------------------------+ | |||
| "server" | "www.example.com" | | | server | www.example.com | | |||
+---------------------+------------------------------------+ | +-------------------+----------------------------------+ | |||
| "x-empty-header" | "" | | | x-empty-header | | | |||
+---------------------+------------------------------------+ | +-------------------+----------------------------------+ | |||
| "x-obs-fold-header" | "Obsolete line folding." | | | x-obs-fold-header | Obsolete line folding. | | |||
+---------------------+------------------------------------+ | +-------------------+----------------------------------+ | |||
| "x-ows-header" | "Leading and trailing whitespace." | | | x-ows-header | Leading and trailing whitespace. | | |||
+---------------------+------------------------------------+ | +-------------------+----------------------------------+ | |||
Table 1: Non-normative examples of header field | Table 1: Non-normative examples of header field | |||
canonicalization. | canonicalization. | |||
2.2. Signature Creation Time | 2.2. Dictionary Structured Field Members | |||
An individual member in the value of a Dictionary Structured Field is | ||||
identified by the lowercased field name, followed by a semicolon | ||||
"":"", followed by the member name. An individual member in the | ||||
value of a Dictionary Structured Field is canonicalized by applying | ||||
the serialization algorithm described in Section 4.1.2 of | ||||
[StructuredFields] on a Dictionary containing only that member. | ||||
2.2.1. Canonicalization Examples | ||||
This section contains non-normative examples of canonicalized values | ||||
for Dictionary Structured Field Members given the following example | ||||
header field, whose value is assumed to be a Dictionary: | ||||
X-Dictionary: a=1, b=2;x=1;y=2, c=(a, b, c) | ||||
The following table shows example canonicalized values for different | ||||
content identifiers, given that field: | ||||
+====================+=====================+ | ||||
| Content Identifier | Canonicalized Value | | ||||
+====================+=====================+ | ||||
| x-dictionary:a | 1 | | ||||
+--------------------+---------------------+ | ||||
| x-dictionary:b | 2;x=1;y=2 | | ||||
+--------------------+---------------------+ | ||||
| x-dictionary:c | (a, b, c) | | ||||
+--------------------+---------------------+ | ||||
Table 2: Non-normative examples of | ||||
Dictionary member canonicalization. | ||||
2.3. List Prefixes | ||||
A prefix of a List Structured Field consisting of the first N members | ||||
in the field's value (where N is an integer greater than 0 and less | ||||
than or equal to the number of members in the List) is identified by | ||||
the lowercased field name, followed by a semicolon "":"", followed by | ||||
N expressed as an Integer String. A list prefix is canonicalized by | ||||
applying the serialization algorithm described in Section 4.1.1 of | ||||
[StructuredFields] on a List containing only the first N members as | ||||
specified in the list prefix, in the order they appear in the | ||||
original List. | ||||
2.3.1. Canonicalization Examples | ||||
This section contains non-normative examples of canonicalized values | ||||
for list prefixes given the following example header fields, whose | ||||
values are assumed to be Dictionaries: | ||||
X-List-A: (a, b, c, d, e, f) | ||||
X-List-B: () | ||||
The following table shows example canonicalized values for different | ||||
content identifiers, given those fields: | ||||
+====================+=====================+ | ||||
| Content Identifier | Canonicalized Value | | ||||
+====================+=====================+ | ||||
| x-list-a:0 | () | | ||||
+--------------------+---------------------+ | ||||
| x-list-a:1 | (a) | | ||||
+--------------------+---------------------+ | ||||
| x-list-a:3 | (a, b, c) | | ||||
+--------------------+---------------------+ | ||||
| x-list-a:6 | (a, b, c, d, e, f) | | ||||
+--------------------+---------------------+ | ||||
| x-list-b:0 | () | | ||||
+--------------------+---------------------+ | ||||
Table 3: Non-normative examples of list | ||||
prefix canonicalization. | ||||
2.4. Signature Creation Time | ||||
The signature's Creation Time (Section 3.1) is identified by the | The signature's Creation Time (Section 3.1) is identified by the | |||
"(created)" identifier. | "*created" identifier. | |||
Its canonicalized value is an Integer String containing the | Its canonicalized value is an Integer String containing the | |||
signature's Creation Time expressed as the number of seconds since | signature's Creation Time expressed as the number of seconds since | |||
the Epoch, as defined in Section 4.16 | the Epoch, as defined in Section 4.16 | |||
(https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/ | (https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/ | |||
V1_chap04.html#tag_04_16) of [POSIX.1]. | V1_chap04.html#tag_04_16) of [POSIX.1]. | |||
| The use of seconds since the Epoch to canonicalize a timestamp | The use of seconds since the Epoch to canonicalize a timestamp | |||
| simplifies processing and avoids timezone management required | simplifies processing and avoids timezone management required by | |||
| by specifications such as [RFC3339]. | specifications such as [RFC3339]. | |||
2.3. Signature Expiration Time | 2.5. Signature Expiration Time | |||
The signature's Expiration Time (Section 3.1) is identified by the | The signature's Expiration Time (Section 3.1) is identified by the | |||
"(expired)" identifier. | "*expires" identifier. | |||
Its canonicalized value is a Decimal String containing the | Its canonicalized value is a Decimal String containing the | |||
signature's Expiration Time expressed as the number of seconds since | signature's Expiration Time expressed as the number of seconds since | |||
the Epoch, as defined in Section 4.16 | the Epoch, as defined in Section 4.16 | |||
(https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/ | (https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/ | |||
V1_chap04.html#tag_04_16) of [POSIX.1]. | V1_chap04.html#tag_04_16) of [POSIX.1]. | |||
2.4. Target Endpoint | 2.6. Target Endpoint | |||
The request target endpoint, consisting of the request method and the | The request target endpoint, consisting of the request method and the | |||
path and query of the effective request URI, is identified by the | path and query of the effective request URI, is identified by the | |||
"(request-target)" identifier. | "*request-target" identifier. | |||
Its value is canonicalized as follows: | Its value is canonicalized as follows: | |||
1. Take the lowercased HTTP method of the message. | 1. Take the lowercased HTTP method of the message. | |||
2. Append a space "" "". | 2. Append a space " ". | |||
3. Append the path and query of the request target of the message, | 3. Append the path and query of the request target of the message, | |||
formatted according to the rules defined for the ":path" pseudo- | formatted according to the rules defined for the :path pseudo- | |||
header in [HTTP2], Section 8.1.2.3. The resulting string is the | header in [HTTP2], Section 8.1.2.3. The resulting string is the | |||
canonicalized value. | canonicalized value. | |||
2.4.1. Canonicalization Examples | 2.6.1. Canonicalization Examples | |||
The following table contains non-normative example HTTP messages and | The following table contains non-normative example HTTP messages and | |||
their canonicalized "(request-target)" values. | their canonicalized "*request-target" values. | |||
+-------------------------+--------------------+ | +=========================+=================+ | |||
| HTTP Message | "(request-target)" | | |HTTP Message | *request-target | | |||
+=========================+====================+ | +=========================+=================+ | |||
| POST /?param=value HTTP/1.1| "post | | | POST /?param=value HTTP/1.1| post | | |||
| Host: www.example.com | /?param=value" | | | Host: www.example.com | /?param=value | | |||
+-------------------------+--------------------+ | +-------------------------+-----------------+ | |||
| POST /a/b HTTP/1.1 | "post /a/b" | | | POST /a/b HTTP/1.1 | post /a/b | | |||
| Host: www.example.com | | | | Host: www.example.com | | | |||
+-------------------------+--------------------+ | +-------------------------+-----------------+ | |||
| GET http://www.example.com/a/ HTTP/1.1| "get /a/" | | | GET http://www.example.com/a/ HTTP/1.1| get /a/ | | |||
+-------------------------+--------------------+ | +-------------------------+-----------------+ | |||
| GET http://www.example.com HTTP/1.1| "get /" | | | GET http://www.example.com HTTP/1.1| get / | | |||
+-------------------------+--------------------+ | +-------------------------+-----------------+ | |||
| CONNECT server.example.com:80 HTTP/1.1| "connect /" | | | CONNECT server.example.com:80 HTTP/1.1| connect / | | |||
| Host: server.example.com| | | | Host: server.example.com| | | |||
+-------------------------+--------------------+ | +-------------------------+-----------------+ | |||
| OPTIONS * HTTP/1.1 | "options *" | | | OPTIONS * HTTP/1.1 | options * | | |||
| Host: server.example.com| | | | Host: server.example.com| | | |||
+-------------------------+--------------------+ | +-------------------------+-----------------+ | |||
Table 2: Non-normative examples of "(request-target)" | Table 4: Non-normative examples of "*request-target" | |||
canonicalization. | canonicalization. | |||
3. HTTP Message Signatures | 3. HTTP Message Signatures | |||
An HTTP Message Signature is a signature over a string generated from | An HTTP Message Signature is a signature over a string generated from | |||
a subset of the content in an HTTP message and metadata about the | a subset of the content in an HTTP message and metadata about the | |||
signature itself. When successfully verified against an HTTP | signature itself. When successfully verified against an HTTP | |||
message, it provides cryptographic proof that with respect to the | message, it provides cryptographic proof that with respect to the | |||
subset of content that was signed, the message is semantically | subset of content that was signed, the message is semantically | |||
equivalent to the message for which the signature was generated. | equivalent to the message for which the signature was generated. | |||
skipping to change at page 10, line 44 ¶ | skipping to change at page 13, line 12 ¶ | |||
subset of content that was signed, the message is semantically | subset of content that was signed, the message is semantically | |||
equivalent to the message for which the signature was generated. | equivalent to the message for which the signature was generated. | |||
3.1. Signature Metadata | 3.1. Signature Metadata | |||
HTTP Message Signatures have metadata properties that provide | HTTP Message Signatures have metadata properties that provide | |||
information regarding the signature's generation and/or verification. | information regarding the signature's generation and/or verification. | |||
The following metadata properties are defined: | The following metadata properties are defined: | |||
Algorithm | Algorithm | |||
An HTTP Signature Algorithm defined in the HTTP Signature | An HTTP Signature Algorithm defined in the HTTP Signature | |||
Algorithms Registry defined in this document. It describes the | Algorithms Registry defined in this document. It describes the | |||
signing and verification algorithms for the signature. | signing and verification algorithms for the signature. | |||
Creation Time | Creation Time | |||
A timestamp representing the point in time that the signature was | A timestamp representing the point in time that the signature was | |||
generated. Sub-second precision is not supported. A signature's | generated. Sub-second precision is not supported. A signature's | |||
Creation Time MAY be undefined, indicating that it is unknown. | Creation Time MAY be undefined, indicating that it is unknown. | |||
Covered Content | Covered Content | |||
An ordered list of content identifiers (Section 2) that indicates | An ordered list of content identifiers (Section 2) that indicates | |||
the metadata and message content that is covered by the signature. | the metadata and message content that is covered by the signature. | |||
The order of identifiers in this list affects signature generation | The order of identifiers in this list affects signature generation | |||
and verification, and therefore MUST be preserved. | and verification, and therefore MUST be preserved. | |||
Expiration Time | Expiration Time | |||
A timestamp representing the point in time at which the signature | A timestamp representing the point in time at which the signature | |||
expires. An expired signature always fails verification. A | expires. An expired signature always fails verification. A | |||
signature's Expiration Time MAY be undefined, indicating that the | signature's Expiration Time MAY be undefined, indicating that the | |||
signature does not expire. | signature does not expire. | |||
Verification Key Material | Verification Key Material | |||
The key material required to verify the signature. | The key material required to verify the signature. | |||
3.2. Creating a Signature | 3.2. Creating a Signature | |||
In order to create a signature, a signer completes the following | In order to create a signature, a signer completes the following | |||
process: | process: | |||
1. Choose key material and algorithm, and set metadata properties | 1. Choose key material and algorithm, and set metadata properties | |||
(Section 3.2.1) | Section 3.2.1 | |||
2. Create the Signature Input (Section 3.2.2) | ||||
3. Sign the Signature Input (Section 3.2.3) | 2. Create the Signature Input Section 3.2.2 | |||
3. Sign the Signature Input Section 3.2.3 | ||||
The following sections describe each of these steps in detail. | The following sections describe each of these steps in detail. | |||
3.2.1. Choose and Set Signature Metadata Properties | 3.2.1. Choose and Set Signature Metadata Properties | |||
1. The signer chooses an HTTP Signature Algorithm from those | 1. The signer chooses an HTTP Signature Algorithm from those | |||
registered in the HTTP Signature Algorithms Registry defined by | registered in the HTTP Signature Algorithms Registry defined by | |||
this document, and sets the signature's Algorithm property to | this document, and sets the signature's Algorithm property to | |||
that value. The signer MUST NOT choose an algorithm marked | that value. The signer MUST NOT choose an algorithm marked | |||
"Deprecated". The mechanism by which the signer chooses an | "Deprecated". The mechanism by which the signer chooses an | |||
algorithm is out of scope for this document. | algorithm is out of scope for this document. | |||
skipping to change at page 12, line 15 ¶ | skipping to change at page 14, line 34 ¶ | |||
3. The signer sets the signature's Creation Time property to the | 3. The signer sets the signature's Creation Time property to the | |||
current time. | current time. | |||
4. The signer sets the signature's Expiration Time property to the | 4. The signer sets the signature's Expiration Time property to the | |||
time at which the signature is to expire, or to undefined if the | time at which the signature is to expire, or to undefined if the | |||
signature will not expire. | signature will not expire. | |||
5. The signer creates an ordered list of content identifiers | 5. The signer creates an ordered list of content identifiers | |||
representing the message content and signature metadata to be | representing the message content and signature metadata to be | |||
covered by the signature, and assigns this list as the | covered by the signature, and assigns this list as the | |||
signature's Covered Content. Each identifier MUST be one of | signature's Covered Content. | |||
those defined in Section 2. This list MUST NOT be empty, as this | ||||
would result in creating a signature over the empty string. | ||||
If the signature's Algorithm name does not start with "rsa", | * Each identifier MUST be one of those defined in Section 2. | |||
"hmac", or "ecdsa", signers SHOULD include "(created)" and | ||||
"(request-target)" in the list. | ||||
If the signature's Algorithm starts with "rsa", "hmac", or | * This list MUST NOT be empty, as this would result in creating | |||
"ecdsa", signers SHOULD include "date" and "(request-target)" in | a signature over the empty string. | |||
the list. | ||||
Further guidance on what to include in this list and in what | * If the signature's Algorithm name does not start with rsa, | |||
order is out of scope for this document. However, the list order | hmac, or ecdsa, signers SHOULD include "*created" and | |||
is significant and once established for a given signature it MUST | "*request-target" in the list. | |||
be preserved for that signature. | ||||
* If the signature's Algorithm starts with rsa, hmac, or ecdsa, | ||||
signers SHOULD include "date" and "*request-target" in the | ||||
list. | ||||
* Further guidance on what to include in this list and in what | ||||
order is out of scope for this document. However, the list | ||||
order is significant and once established for a given | ||||
signature it MUST be preserved for that signature. | ||||
For example, given the following HTTP message: | For example, given the following HTTP message: | |||
GET /foo HTTP/1.1 | GET /foo HTTP/1.1 | |||
Host: example.org | Host: example.org | |||
Date: Tue, 07 Jun 2014 20:51:35 GMT | Date: Sat, 07 Jun 2014 20:51:35 GMT | |||
X-Example: Example header | X-Example: Example header | |||
with some whitespace. | with some whitespace. | |||
X-EmptyHeader: | X-EmptyHeader: | |||
X-Dictionary: a=1, b=2 | ||||
X-List: (a, b, c, d) | ||||
Cache-Control: max-age=60 | Cache-Control: max-age=60 | |||
Cache-Control: must-revalidate | Cache-Control: must-revalidate | |||
The following table presents a non-normative example of metadata | The following table presents a non-normative example of metadata | |||
values that a signer may choose: | values that a signer may choose: | |||
+--------------+--------------------------------------------------+ | +==============+================================================+ | |||
| Property | Value | | | Property | Value | | |||
+==============+==================================================+ | +==============+================================================+ | |||
| Algorithm | "rsa-256" | | | Algorithm | hs2019 | | |||
+--------------+--------------------------------------------------+ | +--------------+------------------------------------------------+ | |||
| Covered | "(request-target)", "(created)", "host", "date", | | | Covered | "*request-target", "*created", "host", "date", | | |||
| Content | "cache-contol", "x-emptyheader", "x-example" | | | Content | "cache-contol", "x-emptyheader", "x-example", | | |||
+--------------+--------------------------------------------------+ | | | "x-dictionary:b", "x-dictionary:a", "x-list:3" | | |||
| Creation | Equal to the value specified in the Date header | | +--------------+------------------------------------------------+ | |||
| Time | field. | | | Creation | 1402174295 | | |||
+--------------+--------------------------------------------------+ | | Time | | | |||
| Expiration | Equal to the Creation Time plus five minutes. | | +--------------+------------------------------------------------+ | |||
| Time | | | | Expiration | 1402174595 | | |||
+--------------+--------------------------------------------------+ | | Time | | | |||
| Verification | The public key provided in Appendix A.1.1 and | | +--------------+------------------------------------------------+ | |||
| Key Material | identified by the "keyId" value "test-key-b". | | | Verification | The public key provided in Appendix A.1.1 and | | |||
+--------------+--------------------------------------------------+ | | Key Material | identified by the "keyId" value "test-key-a". | | |||
+--------------+------------------------------------------------+ | ||||
Table 3: Non-normative example metadata values | Table 5: Non-normative example metadata values | |||
3.2.2. Create the Signature Input | 3.2.2. Create the Signature Input | |||
The Signature Input is a US-ASCII string containing the content that | The Signature Input is a US-ASCII string containing the content that | |||
will be signed. To create it, the signer concatenates together | will be signed. To create it, the signer concatenates together | |||
entries for each identifier in the signature's Covered Content in the | entries for each identifier in the signature's Covered Content in the | |||
order it occurs in the list, with each entry separated by a newline | order it occurs in the list, with each entry separated by a newline | |||
""\n"". An identifier's entry is a US-ASCII string consisting of the | ""\n"". An identifier's entry is a US-ASCII string consisting of the | |||
lowercased identifier followed with a colon "":"", a space "" "", and | lowercased identifier followed with a colon "":"", a space "" "", and | |||
the identifier's canonicalized value (described below). | the identifier's canonicalized value (described below). | |||
If Covered Content contains "(created)" and the signature's Creation | If Covered Content contains "*created" and the signature's Creation | |||
Time is undefined or the signature's Algorithm name starts with | Time is undefined or the signature's Algorithm name starts with | |||
"rsa", "hmac", or "ecdsa" an implementation MUST produce an error. | "rsa", "hmac", or "ecdsa" an implementation MUST produce an error. | |||
If Covered Content contains "(expires)" and the signature does not | If Covered Content contains "*expires" and the signature does not | |||
have an Expiration Time or the signature's Algorithm name starts with | have an Expiration Time or the signature's Algorithm name starts with | |||
"rsa", "hmac", or "ecdsa" an implementation MUST produce an error. | "rsa", "hmac", or "ecdsa" an implementation MUST produce an error. | |||
If Covered Content contains an identifier for a header field that is | If Covered Content contains an identifier for a header field that is | |||
not present or malformed in the message, the implementation MUST | not present or malformed in the message, the implementation MUST | |||
produce an error. | produce an error. | |||
For the non-normative example Signature metadata in Table 3, the | If Covered Content contains an identifier for a Dictionary member | |||
that references a header field that is not present, is malformed in | ||||
the message, or is not a Dictionary Structured Field, the | ||||
implementation MUST produce an error. If the header field value does | ||||
not contain the specified member, the implementation MUST produce an | ||||
error. | ||||
If Covered Content contains an identifier for a List Prefix that | ||||
references a header field that is not present, is malformed in the | ||||
message, or is not a List Structured Field, the implementation MUST | ||||
produce an error. If the header field value contains fewer than the | ||||
specified number of members, the implementation MUST produce an | ||||
error. | ||||
For the non-normative example Signature metadata in Table 5, the | ||||
corresponding Signature Input is: | corresponding Signature Input is: | |||
(request-target): get /foo | *request-target: get /foo | |||
(created): 1402170695 | *created: 1402170695 | |||
host: example.org | host: example.org | |||
date: Tue, 07 Jun 2014 20:51:35 GMT | date: Tue, 07 Jun 2014 20:51:35 GMT | |||
cache-control: max-age=60, must-revalidate | cache-control: max-age=60, must-revalidate | |||
x-emptyheader: | x-emptyheader: | |||
x-example: Example header with some whitespace. | x-example: Example header with some whitespace. | |||
x-dictionary: b=2 | ||||
x-dictionary: a=1 | ||||
x-list: (a, b, c) | ||||
Figure 1: Non-normative example Signature Input | Figure 1: Non-normative example Signature Input | |||
3.2.3. Sign the Signature Input | 3.2.3. Sign the Signature Input | |||
The signer signs the Signature Input using the signing algorithm | The signer signs the Signature Input using the signing algorithm | |||
described by the signature's Algorithm property, and the key material | described by the signature's Algorithm property, and the key material | |||
chosen by the signer. The signer then encodes the result of that | chosen by the signer. The signer then encodes the result of that | |||
operation as a base 64-encoded string [RFC4648]. This string is the | operation as a base 64-encoded string [RFC4648]. This string is the | |||
signature value. | signature value. | |||
For the non-normative example Signature metadata in Section 3.2.1 and | For the non-normative example Signature metadata in Section 3.2.1 and | |||
Signature Input in Figure 1, the corresponding signature value is: | Signature Input in Figure 1, the corresponding signature value is: | |||
T1l3tWH2cSP31nfuvc3nVaHQ6IAu9YLEXg2pCeEOJETXnlWbgKtBTaXV6LNQWtf4O42V2 | K2qGT5srn2OGbOIDzQ6kYT+ruaycnDAAUpKv+ePFfD0RAxn/1BUeZx/Kdrq32DrfakQ6b | |||
DZwDZbmVZ8xW3TFW80RrfrY0+fyjD4OLN7/zV6L6d2v7uBpuWZ8QzKuHYFaRNVXgFBXN3 | PsvB9aqZqognNT6be4olHROIkeV879RrsrObury8L9SCEibeoHyqU/yCjphSmEdd7WD+z | |||
VJnsIOUjv20pqZMKO3phLCKX2/zQzJLCBQvF/5UKtnJiMp1ACNhG8LF0Q0FPWfe86YZBB | rchK57quskKwRefy2iEC5S2uAH0EPyOZKWlvbKmKu5q4CaB8X/I5/+HLZLGvDiezqi6/7 | |||
xqrQr5WfjMu0LOO52ZAxi9KTWSlceJ2U361gDb7S5Deub8MaDrjUEpluphQeo8xyvHBoN | p2Gngf5hwZ0lSdy39vyNMaaAT0tKo6nuVw0S1MVg1Q7MpWYZs0soHjttq0uLIA3DIbQfL | |||
Xsqeax/WaHyRYOgaW6krxEGVaBQAfA2czYZhEA05Tb38ahq/gwDQ1bagd9rGnCHtAg== | iIvK6/l0BdWTU7+2uQj7lBkQAsFZHoA96ZZgFquQrXRlmYOh+Hx5D9fJkXcXe5tmAg== | |||
Figure 2: Non-normative example signature value | Figure 2: Non-normative example signature value | |||
3.3. Verifying a Signature | 3.3. Verifying a Signature | |||
In order to verify a signature, a verifier MUST: | In order to verify a signature, a verifier MUST: | |||
1. Examine the signature's metadata to confirm that the signature | 1. Examine the signature's metadata to confirm that the signature | |||
meets the requirements described in this document, as well as any | meets the requirements described in this document, as well as any | |||
additional requirements defined by the application such as which | additional requirements defined by the application such as which | |||
skipping to change at page 15, line 37 ¶ | skipping to change at page 19, line 5 ¶ | |||
Application-specific requirements are expected and encouraged. When | Application-specific requirements are expected and encouraged. When | |||
an application defines additional requirements, it MUST enforce them | an application defines additional requirements, it MUST enforce them | |||
during the signature verification process, and signature verification | during the signature verification process, and signature verification | |||
MUST fail if the signature does not conform to the application's | MUST fail if the signature does not conform to the application's | |||
requirements. | requirements. | |||
Applications MUST enforce the requirements defined in this document. | Applications MUST enforce the requirements defined in this document. | |||
Regardless of use case, applications MUST NOT accept signatures that | Regardless of use case, applications MUST NOT accept signatures that | |||
do not conform to these requirements. | do not conform to these requirements. | |||
4. The 'Signature' HTTP Header | 4. Including a Message Signature in a Message | |||
The "Signature" HTTP header provides a mechanism to attach a | Message signatures can be included within an HTTP message via the | |||
signature to the HTTP message from which it was generated. The | "Signature-Input" and "Signature" HTTP header fields, both defined | |||
header field name is "Signature" and its value is a list of | within this specification. The "Signature" HTTP header field | |||
parameters and values, formatted according to the "signature" syntax | contains signature values, while the "Signature-Input" HTTP header | |||
defined below, using the extended Augmented Backus-Naur Form (ABNF) | field identifies the Covered Content and metadata that describe how | |||
notation used in [HTTP]. | each signature was generated. | |||
signature = #( sig-param ) | 4.1. The 'Signature-Input' HTTP Header | |||
sig-param = token BWS "=" BWS ( token / quoted-string ) | The "Signature-Input" HTTP header field is a Dictionary Structured | |||
Header [StructuredFields] containing the metadata for zero or more | ||||
message signatures generated from content within the HTTP message. | ||||
Each member describes a single message signature. The member's name | ||||
is an identifier that uniquely identifies the message signature | ||||
within the context of the HTTP message. The member's value is the | ||||
message signature's Covered Content, expressed as a List of Tokens. | ||||
Further signature metadata is expressed in parameters on the member | ||||
value, as described below. | ||||
Each "sig-param" is the name of a parameter defined in the | 4.1.1. Metadata Parameters | |||
Section 5.2 defined in this document. The initial contents of this | ||||
registry are described in Section 4.1. | ||||
4.1. Signature Header Parameters | The parameters on each "Signature-Input" member value contain | |||
metadata about the signature. Each parameter name MUST be a | ||||
parameter name registered in the IANA HTTP Signatures Metadata | ||||
Parameters Registry defined in Section 5.2 of this document. This | ||||
document defines the following parameters, and registers them as the | ||||
initial contents of the registry: | ||||
The Signature header's parameters contain the signature value itself | alg | |||
and the signature metadata properties required to verify the | ||||
signature. Unless otherwise specified, parameters MUST NOT occur | ||||
multiple times in one header, whether with the same or different | ||||
values. The following parameters are defined: | ||||
"algorithm" | RECOMMENDED. The "alg" parameter is a Token containing the name | |||
RECOMMENDED. The "algorithm" parameter contains the name of the | of the signature's Algorithm, as registered in the HTTP Signature | |||
signature's Algorithm, as registered in the HTTP Signature | ||||
Algorithms Registry defined by this document. Verifiers MUST | Algorithms Registry defined by this document. Verifiers MUST | |||
determine the signature's Algorithm from the "keyId" parameter | determine the signature's Algorithm from the "keyId" parameter | |||
rather than from "algorithm". If "algorithm" is provided and | rather than from "alg". If "alg" is provided and differs from or | |||
differs from or is incompatible with the algorithm or key material | is incompatible with the algorithm or key material identified by | |||
identified by "keyId" (for example, "algorithm" has a value of | "keyId" (for example, "alg" has a value of "rsa-sha256" but | |||
"rsa-sha256" but "keyId" identifies an EdDSA key), then | "keyId" identifies an EdDSA key), then implementations MUST | |||
implementations MUST produce an error. Implementers should note | produce an error. | |||
that previous versions of this specification determined the | ||||
signature's Algorithm using the "algorithm" parameter only, and | ||||
thus could be utilized by attackers to expose security | ||||
vulnerabilities. The default value for this parameter is | ||||
"hs2019". | ||||
"created" | created | |||
RECOMMENDED. The "created" parameter contains the signature's | ||||
Creation Time, expressed as the canonicalized value of the | RECOMMENDED. The "created" parameter is a Decimal containing the | |||
"(created)" content identifier, as defined in Section 2. If not | signature's Creation Time, expressed as the canonicalized value of | |||
specified, the signature's Creation Time is undefined. This | the "*created" content identifier, as defined in Section 2. If | |||
not specified, the signature's Creation Time is undefined. This | ||||
parameter is useful when signers are not capable of controlling | parameter is useful when signers are not capable of controlling | |||
the "Date" HTTP Header such as when operating in certain web | the Date HTTP Header such as when operating in certain web browser | |||
browser environments. | environments. | |||
"expires" | expires | |||
OPTIONAL. The "expires" parameter contains the signature's | ||||
Expiration Time, expressed as the canonicalized value of the | ||||
"(expires)" content identifier, as defined in Section 2. If the | ||||
signature does not have an Expiration Time, this parameter "MUST" | ||||
be omitted. If not specified, the signature's Expiration Time is | ||||
undefined. | ||||
"headers" | OPTIONAL. The "expires" parameter is a Decimal containing the | |||
OPTIONAL. The "headers" parameter contains the signature's | signature's Expiration Time, expressed as the canonicalized value | |||
Covered Content, expressed as a string containing a quoted list of | of the "*expires" content identifier, as defined in Section 2. If | |||
the identifiers in the list, in the order they occur in the list, | the signature does not have an Expiration Time, this parameter | |||
with a space "" "" between each identifier. If specified, | MUST be omitted. If not specified, the signature's Expiration | |||
identifiers for header fields SHOULD be lowercased and all others | Time is undefined. | |||
MUST be lowercased. The default value for this parameter is | ||||
"(created)". | ||||
"keyId" | keyId | |||
REQUIRED. The "keyId" parameter is a US-ASCII string whose value | ||||
can be used by a verifier to identify and/or obtain the | ||||
signature's "Verification Key Material". The format and semantics | ||||
of this value are out of scope for this document. | ||||
"signature" | REQUIRED. The "keyId" parameter is a String whose value can be | |||
REQUIRED. The "signature" parameter contains the signature value, | used by a verifier to identify and/or obtain the signature's | |||
as described in Section 3.2.3. | Verification Key Material. Further format and semantics of this | |||
value are out of scope for this document. | ||||
4.2. Example | 4.2. The 'Signature' HTTP Header | |||
The following is a non-normative example Signature header field | The "Signature" HTTP header field is a Dictionary Structured Header | |||
representing the signature in Figure 2: | [StructuredFields] containing zero or more message signatures | |||
generated from content within the HTTP message. Each member's name | ||||
is a signature identifier that is present as a member name in the | ||||
"Signature-Input" Structured Header within the HTTP message. Each | ||||
member's value is a Byte Sequence containing the signature value for | ||||
the message signature identified by the member name. Any member in | ||||
the "Signature" HTTP header field that does not have a corresponding | ||||
member in the HTTP message's "Signature-Input" HTTP header field MUST | ||||
be ignored. | ||||
Signature: keyId="test-key-b", algorithm="rsa-sha256", | 4.3. Examples | |||
created=1402170695, expires=1402170995, | ||||
headers="(request-target) (created) host date cache-control | The following is a non-normative example of "Signature-Input" and | |||
x-emptyheader x-example", | "Signature" HTTP header fields representing the signature in | |||
signature="T1l3tWH2cSP31nfuvc3nVaHQ6IAu9YLEXg2pCeEOJETXnlWbgKtBTa | Figure 2: | |||
XV6LNQWtf4O42V2DZwDZbmVZ8xW3TFW80RrfrY0+fyjD4OLN7/zV6L6d2v7uB | ||||
puWZ8QzKuHYFaRNVXgFBXN3VJnsIOUjv20pqZMKO3phLCKX2/zQzJLCBQvF/5 | Signature-Input: sig1=(*request-target, *created, host, date, | |||
UKtnJiMp1ACNhG8LF0Q0FPWfe86YZBBxqrQr5WfjMu0LOO52ZAxi9KTWSlceJ | cache-control, x-empty-header, x-example); keyId="test-key-a"; | |||
2U361gDb7S5Deub8MaDrjUEpluphQeo8xyvHBoNXsqeax/WaHyRYOgaW6krxE | alg=hs2019; created=1402170695; expires=1402170995 | |||
GVaBQAfA2czYZhEA05Tb38ahq/gwDQ1bagd9rGnCHtAg==" | Signature: sig1=:K2qGT5srn2OGbOIDzQ6kYT+ruaycnDAAUpKv+ePFfD0RAxn/1BUe | |||
Zx/Kdrq32DrfakQ6bPsvB9aqZqognNT6be4olHROIkeV879RrsrObury8L9SCEibe | ||||
oHyqU/yCjphSmEdd7WD+zrchK57quskKwRefy2iEC5S2uAH0EPyOZKWlvbKmKu5q4 | ||||
CaB8X/I5/+HLZLGvDiezqi6/7p2Gngf5hwZ0lSdy39vyNMaaAT0tKo6nuVw0S1MVg | ||||
1Q7MpWYZs0soHjttq0uLIA3DIbQfLiIvK6/l0BdWTU7+2uQj7lBkQAsFZHoA96ZZg | ||||
FquQrXRlmYOh+Hx5D9fJkXcXe5tmAg==: | ||||
Since "Signature-Input" and "Signature" are both defined as | ||||
Dictionary Structured Headers, they can be used to easily include | ||||
multiple signatures within the same HTTP message. For example, a | ||||
signer may include multiple signatures signing the same content with | ||||
different keys and/or algorithms to support verifiers with different | ||||
capabilities, or a reverse proxy may include information about the | ||||
client in header fields when forwarding the request to a service | ||||
host, and may also include a signature over those fields and the | ||||
client's signature. The following is a non-normative example of | ||||
header fields a reverse proxy might add to a forwarded request that | ||||
contains the signature in the above example: | ||||
X-Forwarded-For: 192.0.2.123 | ||||
Signature-Input: reverse_proxy_sig=(*created, host, date, | ||||
signature:sig1, x-forwarded-for); keyId="test-key-a"; | ||||
alg=hs2019; created=1402170695; expires=1402170695.25 | ||||
Signature: reverse_proxy_sig=:ON3HsnvuoTlX41xfcGWaOEVo1M3bJDRBOp0Pc/O | ||||
jAOWKQn0VMY0SvMMWXS7xG+xYVa152rRVAo6nMV7FS3rv0rR5MzXL8FCQ2A35DCEN | ||||
LOhEgj/S1IstEAEFsKmE9Bs7McBsCtJwQ3hMqdtFenkDffSoHOZOInkTYGafkoy78 | ||||
l1VZvmb3Y4yf7McJwAvk2R3gwKRWiiRCw448Nt7JTWzhvEwbh7bN2swc/v3NJbg/w | ||||
JYyYVbelZx4IywuZnYFxgPl/qvqbAjeEVvaLKLgSMr11y+uzxCHoMnDUnTYhMrmOT | ||||
4O8lBLfRFOcoJPKBdoKg9U0a96U2mUug1bFOozEVYFg==: | ||||
5. IANA Considerations | 5. IANA Considerations | |||
5.1. HTTP Signature Algorithms Registry | 5.1. HTTP Signature Algorithms Registry | |||
This document defines HTTP Signature Algorithms, for which IANA is | This document defines HTTP Signature Algorithms, for which IANA is | |||
asked to create and maintain a new registry titled "HTTP Signature | asked to create and maintain a new registry titled "HTTP Signature | |||
Algorithms". Initial values for this registry are given in | Algorithms". Initial values for this registry are given in | |||
Section 5.1.2. Future assignments and modifications to existing | Section 5.1.2. Future assignments and modifications to existing | |||
assignment are to be made through the Expert Review registration | assignment are to be made through the Expert Review registration | |||
policy [BCP 26] and shall follow the template presented in | policy [RFC8126] and shall follow the template presented in | |||
Section 5.1.1. | Section 5.1.1. | |||
5.1.1. Registration Template | 5.1.1. Registration Template | |||
Algorithm Name | Algorithm Name | |||
An identifier for the HTTP Signature Algorithm. The name MUST be | An identifier for the HTTP Signature Algorithm. The name MUST be | |||
an ASCII string consisting only of lower-case characters (""a"" - | an ASCII string consisting only of lower-case characters (""a"" - | |||
""z""), digits (""0"" - ""9""), and hyphens (""-""), and SHOULD | ""z""), digits (""0"" - ""9""), and hyphens (""-""), and SHOULD | |||
NOT exceed 20 characters in length. The identifier MUST be unique | NOT exceed 20 characters in length. The identifier MUST be unique | |||
within the context of the registry. | within the context of the registry. | |||
Status | Status | |||
A brief text description of the status of the algorithm. The | A brief text description of the status of the algorithm. The | |||
description MUST begin with one of "Active" or "Deprecated", and | description MUST begin with one of "Active" or "Deprecated", and | |||
MAY provide further context or explanation as to the reason for | MAY provide further context or explanation as to the reason for | |||
the status. | the status. | |||
Description | Description | |||
A description of the algorithm used to sign the signing string | A description of the algorithm used to sign the signing string | |||
when generating an HTTP Message Signature, or instructions on how | when generating an HTTP Message Signature, or instructions on how | |||
to determine that algorithm. When the description specifies an | to determine that algorithm. When the description specifies an | |||
algorithm, it MUST include a reference to the document or | algorithm, it MUST include a reference to the document or | |||
documents that define the algorithm. | documents that define the algorithm. | |||
5.1.2. Initial Contents | 5.1.2. Initial Contents | |||
[[ MS: The references in this section are problematic as many of the | (( MS: The references in this section are problematic as many of the | |||
specifications that they refer to are too implementation specific, | specifications that they refer to are too implementation specific, | |||
rather than just pointing to the proper signature and hashing | rather than just pointing to the proper signature and hashing | |||
specifications. A better approach might be just specifying the | specifications. A better approach might be just specifying the | |||
signature and hashing function specifications, leaving implementers | signature and hashing function specifications, leaving implementers | |||
to connect the dots (which are not that hard to connect). ]] | to connect the dots (which are not that hard to connect). )) | |||
"hs2019" | 5.1.2.1. hs2019 | |||
Algorithm Name | Algorithm Name | |||
"hs2019" | "hs2019" | |||
Status | Status | |||
active | active | |||
Description | Description | |||
Derived from metadata associated with "keyId". Recommend support | ||||
Derived from metadata associated with keyId. Recommend support | ||||
for: | for: | |||
* RSASSA-PSS [RFC8017] using SHA-512 [RFC6234] | * RSASSA-PSS [RFC8017] using SHA-512 [RFC6234] | |||
* HMAC [RFC2104] using SHA-512 [RFC6234] | * HMAC [RFC2104] using SHA-512 [RFC6234] | |||
* ECDSA using curve P-256 [DSS] and SHA-512 [RFC6234] | * ECDSA using curve P-256 DSS [FIPS186-4] and SHA-512 [RFC6234] | |||
* Ed25519ph, Ed25519ctx, and Ed25519 [RFC8032] | * Ed25519ph, Ed25519ctx, and Ed25519 [RFC8032] | |||
"rsa-sha1" | 5.1.2.2. rsa-sha1 | |||
Algorithm Name | Algorithm Name | |||
"rsa-sha1" | "rsa-sha1" | |||
Status | Status | |||
Deprecated; SHA-1 not secure. | Deprecated; SHA-1 not secure. | |||
Description | Description | |||
RSASSA-PKCS1-v1_5 [RFC8017] using SHA-1 [RFC6234] | RSASSA-PKCS1-v1_5 [RFC8017] using SHA-1 [RFC6234] | |||
"rsa-sha256" | 5.1.2.3. rsa-sha256 | |||
Algorithm Name | Algorithm Name | |||
"rsa-sha256" | "rsa-sha256" | |||
Status | Status | |||
Deprecated; specifying signature algorithm enables attack vector. | Deprecated; specifying signature algorithm enables attack vector. | |||
Description | Description | |||
RSASSA-PKCS1-v1_5 [RFC8017] using SHA-256 [RFC6234] | RSASSA-PKCS1-v1_5 [RFC8017] using SHA-256 [RFC6234] | |||
"hmac-sha256" | 5.1.2.4. hmac-sha256 | |||
Algorithm Name | Algorithm Name | |||
"hmac-sha256" | "hmac-sha256" | |||
Status | Status | |||
Deprecated; specifying signature algorithm enables attack vector. | Deprecated; specifying signature algorithm enables attack vector. | |||
Description | Description | |||
HMAC [RFC2104] using SHA-256 [RFC6234] | HMAC [RFC2104] using SHA-256 [RFC6234] | |||
"ecdsa-sha256" | 5.1.2.5. ecdsa-sha256 | |||
Algorithm Name | Algorithm Name | |||
"ecdsa-sha256" | "ecdsa-sha256" | |||
Status | Status | |||
Deprecated; specifying signature algorithm enables attack vector. | Deprecated; specifying signature algorithm enables attack vector. | |||
Description | Description | |||
ECDSA using curve P-256 [DSS] and SHA-256 [RFC6234] | ||||
5.2. HTTP Signature Parameters Registry | ECDSA using curve P-256 DSS [FIPS186-4] and SHA-256 [RFC6234] | |||
This document defines the Signature header field, whose value | ||||
contains a list of named parameters. IANA is asked to create and | ||||
maintain a new registry titled "HTTP Signature Parameters" to record | ||||
and maintain the set of named parameters defined for use within the | ||||
Signature header field. Initial values for this registry are given | ||||
in Section 5.2.2. Future assignments and modifications to existing | ||||
assignment are to be made through the Expert Review registration | ||||
policy [BCP 26] and shall follow the template presented in | ||||
Section 5.2.1. | ||||
5.2.1. Registration Template | ||||
Name | 5.2. HTTP Signature Metadata Parameters Registry | |||
An identifier for the parameter. The name MUST be an ASCII string | ||||
consisting only of lower-case characters (""a"" - ""z""), digits | ||||
(""0"" - ""9""), and hyphens (""-""), and SHOULD NOT exceed 20 | ||||
characters in length. The identifier MUST be unique within the | ||||
context of the registry. | ||||
Status | This document defines the "Signature-Input" Structured Header, whose | |||
A value indicating the status of the parameter definition. | member values may have parameters containing metadata about a message | |||
Allowed values are "Active" and "Deprecated". Active parameter | signature. IANA is asked to create and maintain a new registry | |||
definitions are available for general use. Deprecated parameter | titled "HTTP Signature Metadata Parameters" to record and maintain | |||
definitions may be in use by existing implementations, but SHOULD | the set of parameters defined for use with member values in the | |||
NOT be used by new implementations. | "Signature-Input" Structured Header. Initial values for this | |||
registry are given in Section 5.2.2. Future assignments and | ||||
modifications to existing assignments are to be made through the | ||||
Expert Review registration policy [RFC8126] and shall follow the | ||||
template presented in Section 5.2.1. | ||||
Reference(s) | 5.2.1. Registration Template | |||
A reference or list of references to the documents that define the | ||||
purpose, content, and usage of the parameter. The parameter | ||||
definition MUST define the format of the parameter's value using | ||||
the extended ABNF notation used in [HTTP], or by referencing one | ||||
or more standard formats such as base 64 or URI. The parameter | ||||
definition MUST also specify the normative requirements for when | ||||
and how the parameter may be used. Value formats MUST NOT allow | ||||
values that would break the parameter list syntax used by the | ||||
Signature header. | ||||
5.2.2. Initial Contents | 5.2.2. Initial Contents | |||
The table below contains the initial contents of the HTTP Signature | The table below contains the initial contents of the HTTP Signature | |||
Parameters Registry. Each row in the table represents a distinct | Metadata Parameters Registry. Each row in the table represents a | |||
entry in the registry. | distinct entry in the registry. | |||
+-------------+--------+------------------------------+ | +=========+========+================================+ | |||
| Name | Status | Reference(s) | | | Name | Status | Reference(s) | | |||
+=============+========+==============================+ | +=========+========+================================+ | |||
| "algorithm" | Active | Section 4.1 of this document | | | alg | Active | Section 4.1.1 of this document | | |||
+-------------+--------+------------------------------+ | +---------+--------+--------------------------------+ | |||
| "created" | Active | Section 4.1 of this document | | | created | Active | Section 4.1.1 of this document | | |||
+-------------+--------+------------------------------+ | +---------+--------+--------------------------------+ | |||
| "expires" | Active | Section 4.1 of this document | | | expires | Active | Section 4.1.1 of this document | | |||
+-------------+--------+------------------------------+ | +---------+--------+--------------------------------+ | |||
| "headers" | Active | Section 4.1 of this document | | | keyId | Active | Section 4.1.1 of this document | | |||
+-------------+--------+------------------------------+ | +---------+--------+--------------------------------+ | |||
| "keyId" | Active | Section 4.1 of this document | | ||||
+-------------+--------+------------------------------+ | ||||
| "signature" | Active | Section 4.1 of this document | | ||||
+-------------+--------+------------------------------+ | ||||
Table 4: Initial contents of the HTTP Signature | Table 6: Initial contents of the HTTP Signature | |||
Parameters Registry. | Metadata Parameters Registry. | |||
6. Security Considerations | 6. Security Considerations | |||
[[ TODO: need to dive deeper on this section; not sure how much of | (( TODO: need to dive deeper on this section; not sure how much of | |||
what's referenced below is actually applicable, or if it covers | what's referenced below is actually applicable, or if it covers | |||
everything we need to worry about. ]] | everything we need to worry about. )) | |||
[[ TODO: Should provide some recommendations on how to determine what | (( TODO: Should provide some recommendations on how to determine what | |||
content needs to be signed for a given use case. ]] | content needs to be signed for a given use case. )) | |||
There are a number of security considerations to take into account | There are a number of security considerations to take into account | |||
when implementing or utilizing this specification. A thorough | when implementing or utilizing this specification. A thorough | |||
security analysis of this protocol, including its strengths and | security analysis of this protocol, including its strengths and | |||
weaknesses, can be found in Security Considerations for HTTP | weaknesses, can be found in [WP-HTTP-Sig-Audit]. | |||
Signatures [WP-HTTP-Sig-Audit]. | ||||
7. References | 7. References | |||
7.1. Normative References | 7.1. Normative References | |||
[BCP 26] Cotton, M., Leiba, B., and T. Narten, "Guidelines for | [FIPS186-4] | |||
Writing an IANA Considerations Section in RFCs", BCP 26, | "Digital Signature Standard (DSS)", 2013, | |||
RFC 8126, DOI 10.17487/RFC8126, June 2017, | ||||
<https://www.rfc-editor.org/info/rfc8126>. | ||||
[DSS] NIST, "Digital Signature Standard (DSS)", FIPS 186-4, | ||||
DOI 10.6028/NIST.FIPS.186-4, July 2013, | ||||
<https://csrc.nist.gov/publications/detail/fips/186/4/ | <https://csrc.nist.gov/publications/detail/fips/186/4/ | |||
final>. | final>. | |||
[HTTP] Fielding, R., Ed. and J. Reschke, Ed., "Hypertext Transfer | ||||
Protocol (HTTP/1.1): Message Syntax and Routing", | ||||
RFC 7230, DOI 10.17487/RFC7230, June 2014, | ||||
<https://www.rfc-editor.org/info/rfc7230>. | ||||
[HTTP2] Belshe, M., Peon, R., and M. Thomson, Ed., "Hypertext | [HTTP2] Belshe, M., Peon, R., and M. Thomson, Ed., "Hypertext | |||
Transfer Protocol Version 2 (HTTP/2)", RFC 7540, | Transfer Protocol Version 2 (HTTP/2)", RFC 7540, | |||
DOI 10.17487/RFC7540, May 2015, | DOI 10.17487/RFC7540, May 2015, | |||
<https://www.rfc-editor.org/info/rfc7540>. | <https://www.rfc-editor.org/info/rfc7540>. | |||
[POSIX.1] IEEE and The Open Group, "The Open Group Base | [MESSAGING] | |||
Specifications Issue 7, 2018 edition", IEEE | Fielding, R., Ed. and J. Reschke, Ed., "Hypertext Transfer | |||
Std 1003.1-2017, 2018, | Protocol (HTTP/1.1): Message Syntax and Routing", | |||
RFC 7230, DOI 10.17487/RFC7230, June 2014, | ||||
<https://www.rfc-editor.org/info/rfc7230>. | ||||
[POSIX.1] "The Open Group Base Specifications Issue 7, 2018 | ||||
edition", 2018, | ||||
<https://pubs.opengroup.org/onlinepubs/9699919799/>. | <https://pubs.opengroup.org/onlinepubs/9699919799/>. | |||
[RFC2104] Krawczyk, H., Bellare, M., and R. Canetti, "HMAC: Keyed- | [RFC2104] Krawczyk, H., Bellare, M., and R. Canetti, "HMAC: Keyed- | |||
Hashing for Message Authentication", RFC 2104, | Hashing for Message Authentication", RFC 2104, | |||
DOI 10.17487/RFC2104, February 1997, | DOI 10.17487/RFC2104, February 1997, | |||
<https://www.rfc-editor.org/info/rfc2104>. | <https://www.rfc-editor.org/info/rfc2104>. | |||
[RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | |||
Requirement Levels", BCP 14, RFC 2119, | Requirement Levels", BCP 14, RFC 2119, | |||
DOI 10.17487/RFC2119, March 1997, | DOI 10.17487/RFC2119, March 1997, | |||
<https://www.rfc-editor.org/info/rfc2119>. | <https://www.rfc-editor.org/info/rfc2119>. | |||
[RFC3986] Berners-Lee, T., Fielding, R., and L. Masinter, "Uniform | ||||
Resource Identifier (URI): Generic Syntax", STD 66, | ||||
RFC 3986, DOI 10.17487/RFC3986, January 2005, | ||||
<https://www.rfc-editor.org/info/rfc3986>. | ||||
[RFC4648] Josefsson, S., "The Base16, Base32, and Base64 Data | ||||
Encodings", RFC 4648, DOI 10.17487/RFC4648, October 2006, | ||||
<https://www.rfc-editor.org/info/rfc4648>. | ||||
[RFC7541] Peon, R. and H. Ruellan, "HPACK: Header Compression for | ||||
HTTP/2", RFC 7541, DOI 10.17487/RFC7541, May 2015, | ||||
<https://www.rfc-editor.org/info/rfc7541>. | ||||
[RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC | [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC | |||
2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, | 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, | |||
May 2017, <https://www.rfc-editor.org/info/rfc8174>. | May 2017, <https://www.rfc-editor.org/info/rfc8174>. | |||
[SEMANTICS] | ||||
Fielding, R., Ed. and J. Reschke, Ed., "Hypertext Transfer | ||||
Protocol (HTTP/1.1): Semantics and Content", RFC 7231, | ||||
DOI 10.17487/RFC7231, June 2014, | ||||
<https://www.rfc-editor.org/info/rfc7231>. | ||||
[StructuredFields] | ||||
"Structured Field Vaues for HTTP", 2020, | ||||
<https://datatracker.ietf.org/doc/draft-ietf-httpbis- | ||||
header-structure>. | ||||
7.2. Informative References | 7.2. Informative References | |||
[RFC3230] Mogul, J. and A. Van Hoff, "Instance Digests in HTTP", | ||||
RFC 3230, DOI 10.17487/RFC3230, January 2002, | ||||
<https://www.rfc-editor.org/info/rfc3230>. | ||||
[RFC3339] Klyne, G. and C. Newman, "Date and Time on the Internet: | [RFC3339] Klyne, G. and C. Newman, "Date and Time on the Internet: | |||
Timestamps", RFC 3339, DOI 10.17487/RFC3339, July 2002, | Timestamps", RFC 3339, DOI 10.17487/RFC3339, July 2002, | |||
<https://www.rfc-editor.org/info/rfc3339>. | <https://www.rfc-editor.org/info/rfc3339>. | |||
[RFC3986] Berners-Lee, T., Fielding, R., and L. Masinter, "Uniform | ||||
Resource Identifier (URI): Generic Syntax", STD 66, | ||||
RFC 3986, DOI 10.17487/RFC3986, January 2005, | ||||
<https://www.rfc-editor.org/info/rfc3986>. | ||||
[RFC4648] Josefsson, S., "The Base16, Base32, and Base64 Data | ||||
Encodings", RFC 4648, DOI 10.17487/RFC4648, October 2006, | ||||
<https://www.rfc-editor.org/info/rfc4648>. | ||||
[RFC6234] Eastlake 3rd, D. and T. Hansen, "US Secure Hash Algorithms | [RFC6234] Eastlake 3rd, D. and T. Hansen, "US Secure Hash Algorithms | |||
(SHA and SHA-based HMAC and HKDF)", RFC 6234, | (SHA and SHA-based HMAC and HKDF)", RFC 6234, | |||
DOI 10.17487/RFC6234, May 2011, | DOI 10.17487/RFC6234, May 2011, | |||
<https://www.rfc-editor.org/info/rfc6234>. | <https://www.rfc-editor.org/info/rfc6234>. | |||
[RFC7239] Petersson, A. and M. Nilsson, "Forwarded HTTP Extension", | [RFC7239] Petersson, A. and M. Nilsson, "Forwarded HTTP Extension", | |||
RFC 7239, DOI 10.17487/RFC7239, June 2014, | RFC 7239, DOI 10.17487/RFC7239, June 2014, | |||
<https://www.rfc-editor.org/info/rfc7239>. | <https://www.rfc-editor.org/info/rfc7239>. | |||
[RFC7518] Jones, M., "JSON Web Algorithms (JWA)", RFC 7518, | [RFC7518] Jones, M., "JSON Web Algorithms (JWA)", RFC 7518, | |||
DOI 10.17487/RFC7518, May 2015, | DOI 10.17487/RFC7518, May 2015, | |||
<https://www.rfc-editor.org/info/rfc7518>. | <https://www.rfc-editor.org/info/rfc7518>. | |||
[RFC7541] Peon, R. and H. Ruellan, "HPACK: Header Compression for | ||||
HTTP/2", RFC 7541, DOI 10.17487/RFC7541, May 2015, | ||||
<https://www.rfc-editor.org/info/rfc7541>. | ||||
[RFC8017] Moriarty, K., Ed., Kaliski, B., Jonsson, J., and A. Rusch, | [RFC8017] Moriarty, K., Ed., Kaliski, B., Jonsson, J., and A. Rusch, | |||
"PKCS #1: RSA Cryptography Specifications Version 2.2", | "PKCS #1: RSA Cryptography Specifications Version 2.2", | |||
RFC 8017, DOI 10.17487/RFC8017, November 2016, | RFC 8017, DOI 10.17487/RFC8017, November 2016, | |||
<https://www.rfc-editor.org/info/rfc8017>. | <https://www.rfc-editor.org/info/rfc8017>. | |||
[RFC8032] Josefsson, S. and I. Liusvaara, "Edwards-Curve Digital | [RFC8032] Josefsson, S. and I. Liusvaara, "Edwards-Curve Digital | |||
Signature Algorithm (EdDSA)", RFC 8032, | Signature Algorithm (EdDSA)", RFC 8032, | |||
DOI 10.17487/RFC8032, January 2017, | DOI 10.17487/RFC8032, January 2017, | |||
<https://www.rfc-editor.org/info/rfc8032>. | <https://www.rfc-editor.org/info/rfc8032>. | |||
[RFC8446] Rescorla, E., "The Transport Layer Security (TLS) Protocol | [RFC8126] Cotton, M., Leiba, B., and T. Narten, "Guidelines for | |||
Writing an IANA Considerations Section in RFCs", BCP 26, | ||||
RFC 8126, DOI 10.17487/RFC8126, June 2017, | ||||
<https://www.rfc-editor.org/info/rfc8126>. | ||||
[TLS] Rescorla, E., "The Transport Layer Security (TLS) Protocol | ||||
Version 1.3", RFC 8446, DOI 10.17487/RFC8446, August 2018, | Version 1.3", RFC 8446, DOI 10.17487/RFC8446, August 2018, | |||
<https://www.rfc-editor.org/info/rfc8446>. | <https://www.rfc-editor.org/info/rfc8446>. | |||
[WP-HTTP-Sig-Audit] | [WP-HTTP-Sig-Audit] | |||
Sporny, M., "Security Considerations for HTTP Signatures", | "Security Considerations for HTTP Signatures", 2013, | |||
June 2013, <https://web-payments.org/specs/source/http- | <https://web-payments.org/specs/source/http-signatures- | |||
signatures-audit/>. | audit/>. | |||
Appendix A. Examples | Appendix A. Examples | |||
A.1. Example Keys | A.1. Example Keys | |||
This section provides cryptographic keys that are referenced in | This section provides cryptographic keys that are referenced in | |||
example signatures throughout this document. These keys MUST NOT be | example signatures throughout this document. These keys MUST NOT be | |||
used for any purpose other than testing. | used for any purpose other than testing. | |||
A.1.1. "rsa-test" | A.1.1. Example Key RSA test | |||
The following key is a 2048-bit RSA public and private key pair: | The following key is a 2048-bit RSA public and private key pair: | |||
-----BEGIN RSA PUBLIC KEY----- | -----BEGIN RSA PUBLIC KEY----- | |||
MIIBCgKCAQEAhAKYdtoeoy8zcAcR874L8cnZxKzAGwd7v36APp7Pv6Q2jdsPBRrw | MIIBCgKCAQEAhAKYdtoeoy8zcAcR874L8cnZxKzAGwd7v36APp7Pv6Q2jdsPBRrw | |||
WEBnez6d0UDKDwGbc6nxfEXAy5mbhgajzrw3MOEt8uA5txSKobBpKDeBLOsdJKFq | WEBnez6d0UDKDwGbc6nxfEXAy5mbhgajzrw3MOEt8uA5txSKobBpKDeBLOsdJKFq | |||
MGmXCQvEG7YemcxDTRPxAleIAgYYRjTSd/QBwVW9OwNFhekro3RtlinV0a75jfZg | MGmXCQvEG7YemcxDTRPxAleIAgYYRjTSd/QBwVW9OwNFhekro3RtlinV0a75jfZg | |||
kne/YiktSvLG34lw2zqXBDTC5NHROUqGTlML4PlNZS5Ri2U4aCNx2rUPRcKIlE0P | kne/YiktSvLG34lw2zqXBDTC5NHROUqGTlML4PlNZS5Ri2U4aCNx2rUPRcKIlE0P | |||
uKxI4T+HIaFpv8+rdV6eUgOrB2xeI1dSFFn/nnv5OoZJEIB+VmuKn3DCUcCZSFlQ | uKxI4T+HIaFpv8+rdV6eUgOrB2xeI1dSFFn/nnv5OoZJEIB+VmuKn3DCUcCZSFlQ | |||
PSXSfBDiUGhwOw76WuSSsf1D4b/vLoJ10wIDAQAB | PSXSfBDiUGhwOw76WuSSsf1D4b/vLoJ10wIDAQAB | |||
skipping to change at page 24, line 42 ¶ | skipping to change at page 28, line 42 ¶ | |||
9C+celgZd2PW7aGYLCHq7nPbmfDV0yHcWjOhXZ8jRMjmANVR/eLQ2EfsRLdW69bn | 9C+celgZd2PW7aGYLCHq7nPbmfDV0yHcWjOhXZ8jRMjmANVR/eLQ2EfsRLdW69bn | |||
f3ZD7JS1fwGnO3exGmHO3HZG+6AvberKYVYNHahNFEw5TsAcQWDLRpkGybBcxqZo | f3ZD7JS1fwGnO3exGmHO3HZG+6AvberKYVYNHahNFEw5TsAcQWDLRpkGybBcxqZo | |||
81YCqlqidwfeO5YtlO7etx1xLyqa2NsCeG9A86UjG+aeNnXEIDk1PDK+EuiThIUa | 81YCqlqidwfeO5YtlO7etx1xLyqa2NsCeG9A86UjG+aeNnXEIDk1PDK+EuiThIUa | |||
/2IxKzJKWl1BKr2d4xAfR0ZnEYuRrbeDQYgTImOlfW6/GuYIxKYgEKCFHFqJATAG | /2IxKzJKWl1BKr2d4xAfR0ZnEYuRrbeDQYgTImOlfW6/GuYIxKYgEKCFHFqJATAG | |||
IxHrq1PDOiSwXd2GmVVYyEmhZnbcp8CxaEMQoevxAta0ssMK3w6UsDtvUvYvF22m | IxHrq1PDOiSwXd2GmVVYyEmhZnbcp8CxaEMQoevxAta0ssMK3w6UsDtvUvYvF22m | |||
qQKBiD5GwESzsFPy3Ga0MvZpn3D6EJQLgsnrtUPZx+z2Ep2x0xc5orneB5fGyF1P | qQKBiD5GwESzsFPy3Ga0MvZpn3D6EJQLgsnrtUPZx+z2Ep2x0xc5orneB5fGyF1P | |||
WtP+fG5Q6Dpdz3LRfm+KwBCWFKQjg7uTxcjerhBWEYPmEMKYwTJF5PBG9/ddvHLQ | WtP+fG5Q6Dpdz3LRfm+KwBCWFKQjg7uTxcjerhBWEYPmEMKYwTJF5PBG9/ddvHLQ | |||
EQeNC8fHGg4UXU8mhHnSBt3EA10qQJfRDs15M38eG2cYwB1PZpDHScDnDA0= | EQeNC8fHGg4UXU8mhHnSBt3EA10qQJfRDs15M38eG2cYwB1PZpDHScDnDA0= | |||
-----END RSA PRIVATE KEY----- | -----END RSA PRIVATE KEY----- | |||
A.2. Example "keyId" Values | A.2. Example keyId Values | |||
The table below maps example "keyId" values to associated algorithms | The table below maps example "keyId" values to associated algorithms | |||
and/or keys. These are example mappings that are valid only within | and/or keys. These are example mappings that are valid only within | |||
the context of examples in examples within this and future documents | the context of examples in examples within this and future documents | |||
that reference this section. Unless otherwise specified, within the | that reference this section. Unless otherwise specified, within the | |||
context of examples it should be assumed that the signer and verifier | context of examples it should be assumed that the signer and verifier | |||
understand these "keyId" mappings. These "keyId" values are not | understand these "keyId" mappings. These "keyId" values are not | |||
reserved, and deployments are free to use them, with these | reserved, and deployments are free to use them, with these | |||
associations or others. | associations or others. | |||
+--------------+---------------------------------+-----------------+ | +============+=================================+================+ | |||
| "keyId" | Algorithm | Verification | | | keyId | Algorithm | Verification | | |||
| | | Key | | | | | Key | | |||
+==============+=================================+=================+ | +============+=================================+================+ | |||
| "test-key-a" | "hs2019", using RSASSA-PSS | The public key | | | test-key-a | "hs2019", using RSASSA-PSS | The public key | | |||
| | [RFC8017] and SHA-512 [RFC6234] | specified in | | | | [RFC8017] and SHA-512 [RFC6234] | specified in | | |||
| | | Appendix A.1.1. | | | | | Appendix A.1.1 | | |||
+--------------+---------------------------------+-----------------+ | +------------+---------------------------------+----------------+ | |||
| "test-key-b" | "rsa-256" | The public key | | | test-key-b | rsa-sha256 | The public key | | |||
| | | specified in | | | | | specified in | | |||
| | | Appendix A.1.1. | | | | | Appendix A.1.1 | | |||
+--------------+---------------------------------+-----------------+ | +------------+---------------------------------+----------------+ | |||
Table 5 | Table 7 | |||
A.3. Test Cases | A.3. Test Cases | |||
This section provides non-normative examples that may be used as test | This section provides non-normative examples that may be used as test | |||
cases to validate implementation correctness. These examples are | cases to validate implementation correctness. These examples are | |||
based on the following HTTP message: | based on the following HTTP message: | |||
POST /foo?param=value&pet=dog HTTP/1.1 | POST /foo?param=value&pet=dog HTTP/1.1 | |||
Host: example.com | Host: example.com | |||
Date: Tue, 07 Jun 2014 20:51:35 GMT | Date: Tue, 07 Jun 2014 20:51:35 GMT | |||
Content-Type: application/json | Content-Type: application/json | |||
Digest: SHA-256=X48E9qOokqqrvdts8nOJRJN3OWDUoyWxBf7kbu9DBPE= | Digest: SHA-256=X48E9qOokqqrvdts8nOJRJN3OWDUoyWxBf7kbu9DBPE= | |||
Content-Length: 18 | Content-Length: 18 | |||
{"hello": "world"} | {"hello": "world"} | |||
A.3.1. Signature Generation | A.3.1. Signature Generation | |||
A.3.1.1. "hs2019" signature over minimal recommended content | A.3.1.1. hs2019 signature over minimal recommended content | |||
This presents metadata for a Signature using "hs2019", over minimum | This presents metadata for a Signature using "hs2019", over minimum | |||
recommended data to sign: | recommended data to sign: | |||
+--------------+-----------------------------------+ | +==============+===================================+ | |||
| Property | Value | | | Property | Value | | |||
+==============+===================================+ | +==============+===================================+ | |||
| Algorithm | "hs2019", using RSASSA-PSS | | | Algorithm | "hs2019", using RSASSA-PSS | | |||
| | [RFC8017] using SHA-512 [RFC6234] | | | | [RFC8017] using SHA-512 [RFC6234] | | |||
+--------------+-----------------------------------+ | +--------------+-----------------------------------+ | |||
| Covered | "(created) (request-target)" | | | Covered | *created, *request-target | | |||
| Content | | | | Content | | | |||
+--------------+-----------------------------------+ | +--------------+-----------------------------------+ | |||
| Creation | 8:51:35 PM GMT, June 7th, 2014 | | | Creation | 8:51:35 PM GMT, June 7th, 2014 | | |||
| Time | | | | Time | | | |||
+--------------+-----------------------------------+ | +--------------+-----------------------------------+ | |||
| Expiration | Undefined | | | Expiration | Undefined | | |||
| Time | | | | Time | | | |||
+--------------+-----------------------------------+ | +--------------+-----------------------------------+ | |||
| Verification | The public key specified in | | | Verification | The public key specified in | | |||
| Key Material | Appendix A.1.1. | | | Key Material | Appendix A.1.1. | | |||
+--------------+-----------------------------------+ | +--------------+-----------------------------------+ | |||
Table 6 | Table 8 | |||
The Signature Input is: | The Signature Input is: | |||
(created): 1402170695 | *created: 1402170695 | |||
(request-target): post /foo?param=value&pet=dog | *request-target: post /foo?param=value&pet=dog | |||
The signature value is: | The signature value is: | |||
e3y37nxAoeuXw2KbaIxE2d9jpE7Z9okgizg6QbD2Z7fUVUvog+ZTKKLRBnhNglVIY6fAa | QaVaWYfF2da6tG66Xtd0GrVFChJ0fOWUe/C6kaYESPiYYwnMH9egOgyKqgLLY9NQJFk7b | |||
YlHwx7ZAXXdBVF8gjWBPL6U9zRrB4PFzjoLSxHaqsvS0ZK9FRxpenptgukaVQ1aeva3PE | QY834sHEUwjS5ByEBaO3QNwIvqEY1qAAU/2MX14tc9Yn7ELBnaaNHaHkV3xVO9KIuLT7V | |||
1aD6zZ93df2lFIFXGDefYCQ+M/SrDGQOFvaVykEkte5mO6zQZ/HpokjMKvilfSMJS+vbv | 6e4OUuGb1axfbXpMgPEql6CEFrn6K95CLuuKP5/gOEcBtmJp5L58gN4VvZrk2OVA6U971 | |||
C1GJItQpjs636Db+7zB2W1BurkGxtQdCLDXuIDg4S8pPSDihkch/dUzL2BpML3PXGKVXw | YiEDNuDa4CwMcQMvcGssbc/L3OULTUffD/1VcPtdGImP2uvVQntpT8b2lBeBpfh8MuaV2 | |||
HOUkVG6Q2ge07IYdzya6N1fIVA9eKI1Y47HT35QliVAxZgE0EZLo8mxq19ReIVvuFg== | vtzidyBYFtAUoYhRWO8+ntqA1q2OK4LMjM2XgDScSVWvGdVd459A0wI9lRlnPap3zg== | |||
A possible Signature header for this signature is: | A possible "Signature-Input" and "Signature" header containing this | |||
signature is: | ||||
Signature: keyId="test-key-a", created=1402170695, | Signature-Input: sig1=(*created, *request-target); | |||
headers="(created) (request-target)", | keyId="test-key-a"; created=1402170695 | |||
signature="e3y37nxAoeuXw2KbaIxE2d9jpE7Z9okgizg6QbD2Z7fUVUvog+ZTKK | Signature: sig1=:QaVaWYfF2da6tG66Xtd0GrVFChJ0fOWUe/C6kaYESPiYYwnMH9eg | |||
LRBnhNglVIY6fAaYlHwx7ZAXXdBVF8gjWBPL6U9zRrB4PFzjoLSxHaqsvS0ZK | OgyKqgLLY9NQJFk7bQY834sHEUwjS5ByEBaO3QNwIvqEY1qAAU/2MX14tc9Yn7ELB | |||
9FRxpenptgukaVQ1aeva3PE1aD6zZ93df2lFIFXGDefYCQ+M/SrDGQOFvaVyk | naaNHaHkV3xVO9KIuLT7V6e4OUuGb1axfbXpMgPEql6CEFrn6K95CLuuKP5/gOEcB | |||
Ekte5mO6zQZ/HpokjMKvilfSMJS+vbvC1GJItQpjs636Db+7zB2W1BurkGxtQ | tmJp5L58gN4VvZrk2OVA6U971YiEDNuDa4CwMcQMvcGssbc/L3OULTUffD/1VcPtd | |||
dCLDXuIDg4S8pPSDihkch/dUzL2BpML3PXGKVXwHOUkVG6Q2ge07IYdzya6N1 | GImP2uvVQntpT8b2lBeBpfh8MuaV2vtzidyBYFtAUoYhRWO8+ntqA1q2OK4LMjM2X | |||
fIVA9eKI1Y47HT35QliVAxZgE0EZLo8mxq19ReIVvuFg==" | gDScSVWvGdVd459A0wI9lRlnPap3zg==: | |||
A.3.1.2. "hs2019" signature covering all header fields | A.3.1.2. hs2019 signature covering all header fields | |||
This presents metadata for a Signature using "hs2019" that covers all | This presents metadata for a Signature using "hs2019" that covers all | |||
header fields in the request: | header fields in the request: | |||
+--------------+--------------------------------------------------+ | +==============+========================================+ | |||
| Property | Value | | | Property | Value | | |||
+==============+==================================================+ | +==============+========================================+ | |||
| Algorithm | "hs2019", using RSASSA-PSS [RFC8017] using | | | Algorithm | "hs2019", using RSASSA-PSS [RFC8017] | | |||
| | SHA-512 [RFC6234] | | | | using SHA-512 [RFC6234] | | |||
+--------------+--------------------------------------------------+ | +--------------+----------------------------------------+ | |||
| Covered | "(created)", "(request-target)", "host", "date", | | | Covered | *created, *request-target, host, date, | | |||
| Content | "content-type", "digest", "content-length" | | | Content | content-type, digest, content-length | | |||
+--------------+--------------------------------------------------+ | +--------------+----------------------------------------+ | |||
| Creation | 8:51:35 PM GMT, June 7th, 2014 | | | Creation | 8:51:35 PM GMT, June 7th, 2014 | | |||
| Time | | | | Time | | | |||
+--------------+--------------------------------------------------+ | +--------------+----------------------------------------+ | |||
| Expiration | Undefined | | | Expiration | Undefined | | |||
| Time | | | | Time | | | |||
+--------------+--------------------------------------------------+ | +--------------+----------------------------------------+ | |||
| Verification | The public key specified in Appendix A.1.1. | | | Verification | The public key specified in | | |||
| Key Material | | | | Key Material | Appendix A.1.1. | | |||
+--------------+--------------------------------------------------+ | +--------------+----------------------------------------+ | |||
Table 7 | Table 9 | |||
The Signature Input is: | The Signature Input is: | |||
(created): 1402170695 | *created: 1402170695 | |||
(request-target): post /foo?param=value&pet=dog | *request-target: post /foo?param=value&pet=dog | |||
host: example.com | host: example.com | |||
date: Tue, 07 Jun 2014 20:51:35 GMT | date: Tue, 07 Jun 2014 20:51:35 GMT | |||
content-type: application/json | content-type: application/json | |||
digest: SHA-256=X48E9qOokqqrvdts8nOJRJN3OWDUoyWxBf7kbu9DBPE= | digest: SHA-256=X48E9qOokqqrvdts8nOJRJN3OWDUoyWxBf7kbu9DBPE= | |||
content-length: 18 | content-length: 18 | |||
The signature value is: | The signature value is: | |||
KXUj1H3ZOhv3Nk4xlRLTn4bOMlMOmFiud3VXrMa9MaLCxnVmrqOX5BulRvB65YW/wQp0o | B24UG4FaiE2kSXBNKV4DA91J+mElAhS3mncrgyteAye1GKMpmzt8jkHNjoudtqw3GngGY | |||
T/nNQpXgOYeY8ovmHlpkRyz5buNDqoOpRsCpLGxsIJ9cX8XVsM9jy+Q1+RIlD9wfWoPHh | 3n0mmwjdfn1eA6nAjgeHwl0WXced5tONcCPNzLswqPOiobGeA5y4WE8iBveel30OKYVel | |||
qhoXt35ZkasuIDPF/AETuObs9QydlsqONwbK+TdQguDK/8Va1Pocl6wK1uLwqcXlxhPEb | 0lZ1OnXOmN5TIEIIPo9LrE+LzZis6A0HA1FRMtKgKGhT3N965pkqfhKbq/V48kpJKT8+c | |||
55EmdYB9pddDyHTADING7K4qMwof2mC3t8Pb0yoLZoZX5a4Or4FrCCKK/9BHAhq/RsVk0 | Zs0TOn4HFMG+OIy6c9ofSBrXD68yxP6QYTz6xH0GMWawLyPLYR52j3I05fK1ylAb6K0ox | |||
dTENMbTB4i7cHvKQu+o9xuYWuxyvBa0Z6NdOb0di70cdrSDEsL5Gz7LBY5J2N9KdGg== | PxzQ5nwrLD+mUVPZ9rDs1En6fmOX9xfkZTblG/5D+s1fHHs9dDXCOVkT5dLS8DjdIA== | |||
A possible Signature header for this signature is: | A possible "Signature-Input" and "Signature" header containing this | |||
signature is: | ||||
Signature: keyId="test-key-a", algorithm="hs2019", | Signature-Input: sig1=(*request-target, *created, host, date, | |||
created=1402170695, | content-type, digest, content-length); keyId="test-key-a"; | |||
headers="(request-target) (created) host date content-type digest | alg=hs2019; created=1402170695 | |||
content-length", | Signature: sig1=:B24UG4FaiE2kSXBNKV4DA91J+mElAhS3mncrgyteAye1GKMpmzt8 | |||
signature="KXUj1H3ZOhv3Nk4xlRLTn4bOMlMOmFiud3VXrMa9MaLCxnVmrqOX5B | jkHNjoudtqw3GngGY3n0mmwjdfn1eA6nAjgeHwl0WXced5tONcCPNzLswqPOiobGe | |||
ulRvB65YW/wQp0oT/nNQpXgOYeY8ovmHlpkRyz5buNDqoOpRsCpLGxsIJ9cX8 | A5y4WE8iBveel30OKYVel0lZ1OnXOmN5TIEIIPo9LrE+LzZis6A0HA1FRMtKgKGhT | |||
XVsM9jy+Q1+RIlD9wfWoPHhqhoXt35ZkasuIDPF/AETuObs9QydlsqONwbK+T | 3N965pkqfhKbq/V48kpJKT8+cZs0TOn4HFMG+OIy6c9ofSBrXD68yxP6QYTz6xH0G | |||
dQguDK/8Va1Pocl6wK1uLwqcXlxhPEb55EmdYB9pddDyHTADING7K4qMwof2m | MWawLyPLYR52j3I05fK1ylAb6K0oxPxzQ5nwrLD+mUVPZ9rDs1En6fmOX9xfkZTbl | |||
C3t8Pb0yoLZoZX5a4Or4FrCCKK/9BHAhq/RsVk0dTENMbTB4i7cHvKQu+o9xu | G/5D+s1fHHs9dDXCOVkT5dLS8DjdIA==: | |||
YWuxyvBa0Z6NdOb0di70cdrSDEsL5Gz7LBY5J2N9KdGg==" | ||||
A.3.2. Signature Verification | A.3.2. Signature Verification | |||
A.3.2.1. Minimal Required Signature Header | A.3.2.1. Minimal Required Signature Header | |||
This presents a Signature header containing only the minimal required | This presents a "Signature-Input" and "Signature" header containing | |||
parameters: | only the minimal required parameters: | |||
Signature: keyId="test-key-a", (created): 1402170695, | Signature-Input: sig1=(); keyId="test-key-a"; created=1402170695 | |||
signature="V3SijFpJOvDUT8t1/EnYli/4TbF2AGqwBGiGUGrgClCkiOAIlOxxY7 | Signature: sig1=:cxieW5ZKV9R9A70+Ua1A/1FCvVayuE6Z77wDGNVFSiluSzR9TYFV | |||
2Mr13DccFkYzg3gX1jIOpKXzH70C5bru4b71SBG+ShiJLu34gHCG33iw44NLG | vwUjeU6CTYUdbOByGMCee5q1eWWUOM8BIH04Si6VndEHjQVdHqshAtNJk2Quzs6WC | |||
UvT5+F+LCKbbHberyk8eyYsZ+TLwtZAYKafxfNOWQXF4o3QaWslDMm8Tcgrd8 | 2DkV0vysOhBSvFZuLZvtCmXRQfYGTGhZqGwq/AAmFbt5WNLQtDrEe0ErveEKBfaz+ | |||
onM45ayFyR4nXRlcGad4PISYGz8PmO4Y+K8RYOyDkgsmRxKtftFQUYG41anyE | IJ35zhaj+dun71YZ82b/CRfO6fSSt8VXeJuvdqUuVPWqjgJD4n9mgZpZFGBaDdPiw | |||
lccNLfEfLBKsyV6kxr36U1Q7FdUopLv8kqluQySrWD6kesvFxNvbEOi+1uZqT | pfbVZHzcHrumFJeFHWXH64a+c5GN+TWlP8NPg2zFdEc/joMymBiRelq236WGm5VvV | |||
uFlK8ZldITQiqtNYaabRjQFZio63gma2y+UAaTGLdM9A==" | 9a22RW2/yLmaU/uwf9v40yGR/I1NRA==: | |||
The corresponding signature metadata derived from this header field | The corresponding signature metadata derived from this header field | |||
is: | is: | |||
+--------------+-----------------------------------+ | +=================+==========================================+ | |||
| Property | Value | | | Property | Value | | |||
+==============+===================================+ | +=================+==========================================+ | |||
| Algorithm | "hs2019", using RSASSA-PSS | | | Algorithm | "hs2019", using RSASSA-PSS using SHA-256 | | |||
| | [RFC8017] using SHA-256 [RFC6234] | | +-----------------+------------------------------------------+ | |||
+--------------+-----------------------------------+ | | Covered Content | *created | | |||
| Covered | "(created)" | | +-----------------+------------------------------------------+ | |||
| Content | | | | Creation Time | 8:51:35 PM GMT, June 7th, 2014 | | |||
+--------------+-----------------------------------+ | +-----------------+------------------------------------------+ | |||
| Creation | 8:51:35 PM GMT, June 7th, 2014 | | | Expiration Time | Undefined | | |||
| Time | | | +-----------------+------------------------------------------+ | |||
+--------------+-----------------------------------+ | | Verification | The public key specified in | | |||
| Expiration | Undefined | | | Key Material | Appendix A.1.1. | | |||
| Time | | | +-----------------+------------------------------------------+ | |||
+--------------+-----------------------------------+ | ||||
| Verification | The public key specified in | | ||||
| Key Material | Appendix A.1.1. | | ||||
+--------------+-----------------------------------+ | ||||
Table 8 | Table 10 | |||
The corresponding Signature Input is: | The corresponding Signature Input is: | |||
(created): 1402170695 | *created: 1402170695 | |||
A.3.2.2. Minimal Recommended Signature Header | A.3.2.2. Minimal Recommended Signature Header | |||
This presents a Signature header containing only the minimal required | This presents a "Signature-Input" and "Signature" header containing | |||
and recommended parameters: | only the minimal required and recommended parameters: | |||
Signature: algorithm="hs2019", keyId="test-key-a", | Signature-Input: sig1=(); alg=hs2019; keyId="test-key-a"; | |||
(created): 1402170695, | created=1402170695 | |||
signature="V3SijFpJOvDUT8t1/EnYli/4TbF2AGqwBGiGUGrgClCkiOAIlOxxY7 | Signature: sig1=:cxieW5ZKV9R9A70+Ua1A/1FCvVayuE6Z77wDGNVFSiluSzR9TYFV | |||
2Mr13DccFkYzg3gX1jIOpKXzH70C5bru4b71SBG+ShiJLu34gHCG33iw44NLG | vwUjeU6CTYUdbOByGMCee5q1eWWUOM8BIH04Si6VndEHjQVdHqshAtNJk2Quzs6WC | |||
UvT5+F+LCKbbHberyk8eyYsZ+TLwtZAYKafxfNOWQXF4o3QaWslDMm8Tcgrd8 | 2DkV0vysOhBSvFZuLZvtCmXRQfYGTGhZqGwq/AAmFbt5WNLQtDrEe0ErveEKBfaz+ | |||
onM45ayFyR4nXRlcGad4PISYGz8PmO4Y+K8RYOyDkgsmRxKtftFQUYG41anyE | IJ35zhaj+dun71YZ82b/CRfO6fSSt8VXeJuvdqUuVPWqjgJD4n9mgZpZFGBaDdPiw | |||
lccNLfEfLBKsyV6kxr36U1Q7FdUopLv8kqluQySrWD6kesvFxNvbEOi+1uZqT | pfbVZHzcHrumFJeFHWXH64a+c5GN+TWlP8NPg2zFdEc/joMymBiRelq236WGm5VvV | |||
uFlK8ZldITQiqtNYaabRjQFZio63gma2y+UAaTGLdM9A==" | 9a22RW2/yLmaU/uwf9v40yGR/I1NRA==: | |||
The corresponding signature metadata derived from this header field | The corresponding signature metadata derived from this header field | |||
is: | is: | |||
+--------------+-----------------------------------+ | +=================+==========================================+ | |||
| Property | Value | | | Property | Value | | |||
+==============+===================================+ | +=================+==========================================+ | |||
| Algorithm | "hs2019", using RSASSA-PSS | | | Algorithm | "hs2019", using RSASSA-PSS using SHA-512 | | |||
| | [RFC8017] using SHA-512 [RFC6234] | | +-----------------+------------------------------------------+ | |||
+--------------+-----------------------------------+ | | Covered Content | *created | | |||
| Covered | "(created)" | | +-----------------+------------------------------------------+ | |||
| Content | | | | Creation Time | 8:51:35 PM GMT, June 7th, 2014 | | |||
+--------------+-----------------------------------+ | +-----------------+------------------------------------------+ | |||
| Creation | 8:51:35 PM GMT, June 7th, 2014 | | | Expiration Time | Undefined | | |||
| Time | | | +-----------------+------------------------------------------+ | |||
+--------------+-----------------------------------+ | | Verification | The public key specified in | | |||
| Expiration | Undefined | | | Key Material | Appendix A.1.1. | | |||
| Time | | | +-----------------+------------------------------------------+ | |||
+--------------+-----------------------------------+ | ||||
| Verification | The public key specified in | | ||||
| Key Material | Appendix A.1.1. | | ||||
+--------------+-----------------------------------+ | ||||
Table 9 | Table 11 | |||
The corresponding Signature Input is: | The corresponding Signature Input is: | |||
(created): 1402170695 | *created: 1402170695 | |||
A.3.2.3. Minimal Signature Header using "rsa-256" | A.3.2.3. Minimal Signature Header using rsa-sha256 | |||
This presents a minimal Signature header for a signature using the | This presents a minimal "Signature-Input" and "Signature" header for | |||
"rsa-256" algorithm: | a signature using the "rsa-sha256" algorithm: | |||
Signature: algorithm="rsa-256", keyId="test-key-b", | Signature: sig1=(date); alg=rsa-sha256; keyId="test-key-b" | |||
headers="date", | Signature: sig1=:HtXycCl97RBVkZi66ADKnC9c5eSSlb57GnQ4KFqNZplOpNfxqk62 | |||
signature="HtXycCl97RBVkZi66ADKnC9c5eSSlb57GnQ4KFqNZplOpNfxqk62Jz | JzZ484jXgLvoOTRaKfR4hwyxlcyb+BWkVasApQovBSdit9Ml/YmN2IvJDPncrlhPD | |||
Z484jXgLvoOTRaKfR4hwyxlcyb+BWkVasApQovBSdit9Ml/YmN2IvJDPncrlh | VDv36Z9/DiSO+RNHD7iLXugdXo1+MGRimW1RmYdenl/ITeb7rjfLZ4b9VNnLFtVWw | |||
PDVDv36Z9/DiSO+RNHD7iLXugdXo1+MGRimW1RmYdenl/ITeb7rjfLZ4b9VNn | rjhAiwIqeLjodVImzVc5srrk19HMZNuUejK6I3/MyN3+3U8tIRW4LWzx6ZgGZUaEE | |||
LFtVWwrjhAiwIqeLjodVImzVc5srrk19HMZNuUejK6I3/MyN3+3U8tIRW4LWz | P0aBlBkt7Fj0Tt5/P5HNW/Sa/m8smxbOHnwzAJDa10PyjzdIbywlnWIIWtZKPPsoV | |||
x6ZgGZUaEEP0aBlBkt7Fj0Tt5/P5HNW/Sa/m8smxbOHnwzAJDa10PyjzdIbyw | oKVopUWEU3TNhpWmaVhFrUL/O6SN3w==: | |||
lnWIIWtZKPPsoVoKVopUWEU3TNhpWmaVhFrUL/O6SN3w==" | ||||
The corresponding signature metadata derived from this header field | The corresponding signature metadata derived from this header field | |||
is: | is: | |||
+---------------------------+--------------------------+ | +===========================+==========================+ | |||
| Property | Value | | | Property | Value | | |||
+===========================+==========================+ | +===========================+==========================+ | |||
| Algorithm | "rsa-256" | | | Algorithm | rsa-sha256 | | |||
+---------------------------+--------------------------+ | +---------------------------+--------------------------+ | |||
| Covered Content | "date" | | | Covered Content | date | | |||
+---------------------------+--------------------------+ | +---------------------------+--------------------------+ | |||
| Creation Time | Undefined | | | Creation Time | Undefined | | |||
+---------------------------+--------------------------+ | +---------------------------+--------------------------+ | |||
| Expiration Time | Undefined | | | Expiration Time | Undefined | | |||
+---------------------------+--------------------------+ | +---------------------------+--------------------------+ | |||
| Verification Key Material | The public key specified | | | Verification Key Material | The public key specified | | |||
| | in Appendix A.1.1. | | | | in Appendix A.1.1. | | |||
+---------------------------+--------------------------+ | +---------------------------+--------------------------+ | |||
Table 10 | Table 12 | |||
The corresponding Signature Input is: | The corresponding Signature Input is: | |||
date: Tue, 07 Jun 2014 20:51:35 GMT | date: Tue, 07 Jun 2014 20:51:35 GMT | |||
Appendix B. Topics for Working Group Discussion | Appendix B. Topics for Working Group Discussion | |||
This section is to be removed before publishing as an RFC. | _RFC EDITOR: please remove this section before publication_ | |||
The goal of this draft document is to provide a starting point at | The draft has known issues that will need to be addressed during | |||
feature parity and compatible with the cavage-12 draft. The draft | development, and these issues have been enumerated but not addressed | |||
has known issues that will need to be addressed during development, | in this version. Topics are not listed in any particular order. | |||
and in the spirit of keeping compatibility, these issues have been | ||||
enumerated but not addressed in this version. The editor recommends | ||||
the working group discuss the issues and features described in this | ||||
section after adoption of the document by the working group. Topics | ||||
are not listed in any particular order. | ||||
B.1. Issues | B.1. Issues | |||
B.1.1. Confusing guidance on algorithm and key identification | B.1.1. Confusing guidance on algorithm and key identification | |||
The current draft encourages determining the Algorithm metadata | The current draft encourages determining the Algorithm metadata | |||
property from the "keyId" field, both in the guidance for the use of | property from the "keyId" field, both in the guidance for the use of | |||
"algorithm" and "keyId", and the definition for the "hs2019" | "algorithm" and "keyId", and the definition for the "hs2019" | |||
algorithm and deprecation of the other algorithms in the registry. | algorithm and deprecation of the other algorithms in the registry. | |||
The current state arose from concern that a malicious party could | The current state arose from concern that a malicious party could | |||
change the value of the "algorithm" parameter, potentially tricking | change the value of the "algorithm" parameter, potentially tricking | |||
skipping to change at page 31, line 24 ¶ | skipping to change at page 35, line 24 ¶ | |||
Punting algorithm identification into "keyId" hurts interoperability, | Punting algorithm identification into "keyId" hurts interoperability, | |||
since we aren't defining the syntax or semantics of "keyId". It | since we aren't defining the syntax or semantics of "keyId". It | |||
actually goes against that claim, as we are dictating that the | actually goes against that claim, as we are dictating that the | |||
signing algorithm must be specified by "keyId" or derivable from it. | signing algorithm must be specified by "keyId" or derivable from it. | |||
It also renders the algorithm registry essentially useless. Instead | It also renders the algorithm registry essentially useless. Instead | |||
of this approach, we can protect against manipulation of the | of this approach, we can protect against manipulation of the | |||
Signature header field by adding support for (and possibly mandating) | Signature header field by adding support for (and possibly mandating) | |||
including Signature metadata within the Signature Input. | including Signature metadata within the Signature Input. | |||
B.1.2. Lack of definition of "keyId" hurts interoperability | B.1.2. Lack of definition of keyId hurts interoperability | |||
The current text leaves the format and semantics of "keyId" | The current text leaves the format and semantics of "keyId" | |||
completely up to the implementation. This is primarily due to the | completely up to the implementation. This is primarily due to the | |||
fact that most implementers of Cavage have extensive investment in | fact that most implementers of Cavage have extensive investment in | |||
key distribution and management, and just need to plug an identifier | key distribution and management, and just need to plug an identifier | |||
into the header. We should support those cases, but we also need to | into the header. We should support those cases, but we also need to | |||
provide guidance for the developer that doesn't have that and just | provide guidance for the developer that doesn't have that and just | |||
wants to know how to identify a key. It may be enough to punt this | wants to know how to identify a key. It may be enough to punt this | |||
to profiling specs, but this needs to be explored more. | to profiling specs, but this needs to be explored more. | |||
B.1.3. Algorithm Registry duplicates work of JWA | B.1.3. Algorithm Registry duplicates work of JWA | |||
JSON Web Algorithms (JWA) [RFC7518] already defines an IANA registry | [RFC7518] already defines an IANA registry for cryptographic | |||
for cryptographic algorithms. This wasn't used by Cavage out of | algorithms. This wasn't used by Cavage out of concerns about | |||
concerns about complexity of JOSE, and issues with JWE and JWS being | complexity of JOSE, and issues with JWE and JWS being too flexible, | |||
too flexible, leading to insecure combinations of options. Using | leading to insecure combinations of options. Using JWA's definitions | |||
JWA's definitions does not need to mean we're using JOSE, however. | does not need to mean we're using JOSE, however. We should look at | |||
We should look at if/how we can leverage JWA's work without | if/how we can leverage JWA's work without introducing too many sharp | |||
introducing too many sharp edges for implementers. | edges for implementers. | |||
In any use of JWS algorithms, this spec would define a way to create | In any use of JWS algorithms, this spec would define a way to create | |||
the JWS Signing Input string to be applied to the algorithm. It | the JWS Signing Input string to be applied to the algorithm. It | |||
should be noted that this is incompatible with JWS itself, which | should be noted that this is incompatible with JWS itself, which | |||
requires the inclusion of a structured header in the signature input. | requires the inclusion of a structured header in the signature input. | |||
A possible approach is to incorporate all elements of the JWA | A possible approach is to incorporate all elements of the JWA | |||
signature algorithm registry into this spec using a prefix or other | signature algorithm registry into this spec using a prefix or other | |||
marker, such as "jws-RS256" for the RSA 256 JSON Web Signature | marker, such as "jws-RS256" for the RSA 256 JSON Web Signature | |||
algorithm. | algorithm. | |||
skipping to change at page 32, line 20 ¶ | skipping to change at page 36, line 23 ¶ | |||
The initial entries in this document reflect those in Cavage. The | The initial entries in this document reflect those in Cavage. The | |||
ones that are marked deprecated were done so because of the issue | ones that are marked deprecated were done so because of the issue | |||
explained in Appendix B.1.1, with the possible exception of "rsa- | explained in Appendix B.1.1, with the possible exception of "rsa- | |||
sha1". We should probably just remove that one. | sha1". We should probably just remove that one. | |||
B.1.5. No percent-encoding normalization of path/query | B.1.5. No percent-encoding normalization of path/query | |||
See: issue #26 (https://github.com/w3c-dvcg/http-signatures/ | See: issue #26 (https://github.com/w3c-dvcg/http-signatures/ | |||
issues/26) | issues/26) | |||
The canonicalization rules for "(request-target)" do not perform | The canonicalization rules for "*request-target" do not perform | |||
handle minor, semantically meaningless differences in percent- | handle minor, semantically meaningless differences in percent- | |||
encoding, such that verification could fail if an intermediary | encoding, such that verification could fail if an intermediary | |||
normalizes the effective request URI prior to forwarding the message. | normalizes the effective request URI prior to forwarding the message. | |||
At a minimum, they should be case and percent-encoding normalized as | At a minimum, they should be case and percent-encoding normalized as | |||
described in sections 6.2.2.1 and 6.2.2.2 of [RFC3986]. | described in sections 6.2.2.1 and 6.2.2.2 of [RFC3986]. | |||
B.1.6. Misleading name for "headers" parameter | B.1.6. Misleading name for headers parameter | |||
The Covered Content list contains identifiers for more than just | The Covered Content list contains identifiers for more than just | |||
headers, so the "header" parameter name is no longer appropriate. | headers, so the "header" parameter name is no longer appropriate. | |||
Some alternatives: "content", "signed-content", "covered-content". | Some alternatives: "content", "signed-content", "covered-content". | |||
B.1.7. Changes to whitespace in header field values break verification | B.1.7. Changes to whitespace in header field values break verification | |||
Some header field values contain RWS, OWS, and/or BWS. Since the | Some header field values contain RWS, OWS, and/or BWS. Since the | |||
header field value canonicalization rules do not address whitespace, | header field value canonicalization rules do not address whitespace, | |||
changes to it (e.g., removing OWS or BWS or replacing strings of RWS | changes to it (e.g., removing OWS or BWS or replacing strings of RWS | |||
skipping to change at page 33, line 25 ¶ | skipping to change at page 37, line 30 ¶ | |||
B.1.12. Max values, precision for Integer String and Decimal String not | B.1.12. Max values, precision for Integer String and Decimal String not | |||
defined | defined | |||
The definitions for Integer String and Decimal String do not specify | The definitions for Integer String and Decimal String do not specify | |||
a maximum value. The definition for Decimal String (used to provide | a maximum value. The definition for Decimal String (used to provide | |||
sub-second precision for Expiration Time) does not define minimum or | sub-second precision for Expiration Time) does not define minimum or | |||
maximum precision requirements. It should set a sane requirement | maximum precision requirements. It should set a sane requirement | |||
here (e.g., MUST support up to 3 decimal places and no more). | here (e.g., MUST support up to 3 decimal places and no more). | |||
B.1.13. "keyId" parameter value could break list syntax | B.1.13. keyId parameter value could break list syntax | |||
The "keyId" parameter value needs to be constrained so as to not | The "keyId" parameter value needs to be constrained so as to not | |||
break list syntax (e.g., by containing a comma). | break list syntax (e.g., by containing a comma). | |||
B.1.14. Creation Time and Expiration Time do not allow for clock skew | B.1.14. Creation Time and Expiration Time do not allow for clock skew | |||
The processing instructions for Creation Time and Expiration Time | The processing instructions for Creation Time and Expiration Time | |||
imply that verifiers are not permitted to account for clock skew | imply that verifiers are not permitted to account for clock skew | |||
during signature verification. | during signature verification. | |||
skipping to change at page 34, line 15 ¶ | skipping to change at page 38, line 23 ¶ | |||
B.1.17. Remove algorithm-specific rules for content identifiers | B.1.17. Remove algorithm-specific rules for content identifiers | |||
The rules that restrict when the signer can or must include certain | The rules that restrict when the signer can or must include certain | |||
identifiers appear to be related to the pseudo-revving of the Cavage | identifiers appear to be related to the pseudo-revving of the Cavage | |||
draft that happened when the "hs2019" algorithm was introduced. We | draft that happened when the "hs2019" algorithm was introduced. We | |||
should drop these rules, as it can be expected that anyone | should drop these rules, as it can be expected that anyone | |||
implementing this draft will support all content identifiers. | implementing this draft will support all content identifiers. | |||
B.1.18. Add guidance for signing compressed headers | B.1.18. Add guidance for signing compressed headers | |||
The draft should provide guidance on how to sign headers when HTTP/2 | The draft should provide guidance on how to sign headers when | |||
header compression [RFC7541] is used. This guidance might be as | [RFC7541] is used. This guidance might be as simple as "sign the | |||
simple as "sign the uncompressed header field value." | uncompressed header field value." | |||
B.1.19. Transformations to Via header field value break verification | B.1.19. Transformations to Via header field value break verification | |||
Intermediaries are permitted to strip comments from the Via header | Intermediaries are permitted to strip comments from the "Via" header | |||
field value, and consolidate related sequences of entries. The | field value, and consolidate related sequences of entries. The | |||
canonicalization rules do not account for these changes, and thus | canonicalization rules do not account for these changes, and thus | |||
they cause signature verification to fail if the Via header is | they cause signature verification to fail if the "Via" header is | |||
signed. At the very least, guidance on signing or not signing Via | signed. At the very least, guidance on signing or not signing "Via" | |||
headers needs to be included. | headers needs to be included. | |||
B.1.20. Case changes to case-insensitive header field values break | B.1.20. Case changes to case-insensitive header field values break | |||
verification | verification | |||
Some header field values are case-insensitive, in whole or in part. | Some header field values are case-insensitive, in whole or in part. | |||
The canonicalization rules do not account for this, thus a case | The canonicalization rules do not account for this, thus a case | |||
change to a covered header field value causes verification to fail. | change to a covered header field value causes verification to fail. | |||
B.1.21. Need more examples for Signature header | B.1.21. Need more examples for Signature header | |||
skipping to change at page 35, line 22 ¶ | skipping to change at page 39, line 33 ¶ | |||
* The value used for the "keyId" parameter | * The value used for the "keyId" parameter | |||
* Request method | * Request method | |||
* Individual components of the effective request URI: scheme, | * Individual components of the effective request URI: scheme, | |||
authority, path, query | authority, path, query | |||
* Status code | * Status code | |||
* Request body (currently supported via Digest header) | * Request body (currently supported via Digest header [RFC3230] ) | |||
B.2.2. Multiple signature support | B.2.2. Multiple signature support | |||
[[ Editor's note: I believe this use case is theoretical. Please let | (( Editor's note: I believe this use case is theoretical. Please let | |||
me know if this is a use case you have. ]] | me know if this is a use case you have. )) | |||
There may be scenarios where attaching multiple signatures to a | There may be scenarios where attaching multiple signatures to a | |||
single message is useful: | single message is useful: | |||
* A gateway attaches a signature over headers it adds (e.g., | * A gateway attaches a signature over headers it adds (e.g., | |||
Forwarded) to messages already signed by the user agent. | "Forwarded") to messages already signed by the user agent. | |||
* A signer attaches two signatures signed by different keys, to be | * A signer attaches two signatures signed by different keys, to be | |||
verified by different entities. | verified by different entities. | |||
This could be addressed by changing the Signature header syntax to | This could be addressed by changing the Signature header syntax to | |||
accept a list of parameter sets for a single signature, e.g., by | accept a list of parameter sets for a single signature, e.g., by | |||
separating parameters with "";"" instead of "","". It may also be | separating parameters with "";"" instead of "","". It may also be | |||
necessary to include a signature identifier parameter. | necessary to include a signature identifier parameter. | |||
B.2.3. Support for incremental signing of header field value list items | B.2.3. Support for incremental signing of header field value list items | |||
[[ Editor's note: I believe this use case is theoretical. Please let | (( Editor's note: I believe this use case is theoretical. Please let | |||
me know if this is a use case you have. ]] | me know if this is a use case you have. )) | |||
Currently, signing a header field value is all-or-nothing: either the | Currently, signing a header field value is all-or-nothing: either the | |||
entire value is signed, or none of it is. For header fields that use | entire value is signed, or none of it is. For header fields that use | |||
list syntax, it would be useful to be able to specify which items in | list syntax, it would be useful to be able to specify which items in | |||
the list are signed. | the list are signed. | |||
A simple approach that allowed the signer to indicate the list size | A simple approach that allowed the signer to indicate the list size | |||
at signing time would allow a signer to sign header fields that are | at signing time would allow a signer to sign header fields that are | |||
may be appended to by intermediaries as the message makes its way to | may be appended to by intermediaries as the message makes its way to | |||
the recipient. Specifying list size in terms of number of items | the recipient. Specifying list size in terms of number of items | |||
skipping to change at page 36, line 28 ¶ | skipping to change at page 40, line 38 ¶ | |||
expected to change, for example from "public-service- | expected to change, for example from "public-service- | |||
name.example.com" to "service-host-1.public-service- | name.example.com" to "service-host-1.public-service- | |||
name.example.com". This is commonly the case for services that are | name.example.com". This is commonly the case for services that are | |||
hosted behind a load-balancing gateway, where the client sends | hosted behind a load-balancing gateway, where the client sends | |||
requests to a publicly known domain name for the service, and these | requests to a publicly known domain name for the service, and these | |||
requests are transformed by the gateway into requests to specific | requests are transformed by the gateway into requests to specific | |||
hosts in the service fleet. | hosts in the service fleet. | |||
One possible way to handle this would be to special-case the Host | One possible way to handle this would be to special-case the Host | |||
header field to allow verifier to substitute a known expected value, | header field to allow verifier to substitute a known expected value, | |||
or a value provided in another header field (e.g., Via) when | or a value provided in another header field (e.g., "Via") when | |||
generating the Signature Input, provided that the verifier also | generating the Signature Input, provided that the verifier also | |||
recognizes the real value in the Host header. Alternatively, this | recognizes the real value in the "Host" header. Alternatively, this | |||
logic could apply to an "(audience)" content identifier. | logic could apply to an "(audience)" content identifier. | |||
B.2.5. Support for signing specific cookies | B.2.5. Support for signing specific cookies | |||
A signer may only wish to sign one or a few cookies, for example if | A signer may only wish to sign one or a few cookies, for example if | |||
the website requires its authentication state cookie to be signed, | the website requires its authentication state cookie to be signed, | |||
but also sets other cookies (e.g., for analytics, ad tracking, etc.) | but also sets other cookies (e.g., for analytics, ad tracking, etc.) | |||
Acknowledgements | Acknowledgements | |||
This specification is based on the draft-cavage-http-signatures | This specification is based on the draft-cavage-http-signatures | |||
draft. The editor would like to thank the authors of that draft, | draft. The editor would like to thank the authors of that draft, | |||
Mark Cavage and Manu Sporny, for their work on that draft and their | Mark Cavage and Manu Sporny, for their work on that draft and their | |||
continuing contributions. | continuing contributions. | |||
The editor would also like to thank the following individuals for | The editor would also like to thank the following individuals for | |||
feedback on and implementations of the draft-cavage-http-signatures | feedback on and implementations of the draft-cavage-http-signatures | |||
draft (in alphabetical order): Mark Adamcin, Mark Allen, Paul | draft (in alphabetical order): Mark Adamcin, Mark Allen, Paul | |||
Annesley, Karl Böhlmark, Stéphane Bortzmeyer, Sarven | Annesley, Karl Boehlmark, Stephane Bortzmeyer, Sarven Capadisli, Liam | |||
Capadisli, Liam Dennehy, ductm54, Stephen Farrell, Phillip Hallam- | Dennehy, ductm54, Stephen Farrell, Phillip Hallam-Baker, Eric Holmes, | |||
Baker, Eric Holmes, Andrey Kislyuk, Adam Knight, Dave Lehn, Dave | Andrey Kislyuk, Adam Knight, Dave Lehn, Dave Longley, James H. | |||
Longley, James H. Manger, Ilari Liusvaara, Mark Nottingham, Yoav | Manger, Ilari Liusvaara, Mark Nottingham, Yoav Nir, Adrian Palmer, | |||
Nir, Adrian Palmer, Lucas Pardue, Roberto Polli, Julian Reschke, | Lucas Pardue, Roberto Polli, Julian Reschke, Michael Richardson, | |||
Michael Richardson, Wojciech Rygielski, Adam Scarr, Cory J. Slep, | Wojciech Rygielski, Adam Scarr, Cory J. Slep, Dirk Stein, Henry | |||
Dirk Stein, Henry Story, Lukasz Szewc, Chris Webber, and Jeffrey | Story, Lukasz Szewc, Chris Webber, and Jeffrey Yasskin | |||
Yasskin | ||||
Document History | Document History | |||
This section is to be removed before publishing as an RFC. | _RFC EDITOR: please remove this section before publication_ | |||
* *draft-ietf-httpbis-message-signatures* | * draft-ietf-httpbis-message-signatures | |||
- *-00* | - Since -01 | |||
o Copied from draft-richanna-http-message-signatures | o Replaced unstructured "Signature" header with "Signature- | |||
Input" and "Signature" Dictionary Structured Header Fields. | ||||
o Corrected header field content identifiers in Table 1. | o Defined content identifiers for individual Dictionary | |||
members, e.g., "x-dictionary-field:member-name". | ||||
* *draft-richanna-http-message-signatures* | o Defined content identifiers for first N members of a List, | |||
e.g., "x-list-field:4". | ||||
- *-00* | o Fixed up examples. | |||
o Updated introduction now that it's adopted. | ||||
- -01 | ||||
o Strengthened requirement for content identifiers for header | ||||
fields to be lower-case (changed from SHOULD to MUST). | ||||
o Added real example values for Creation Time and Expiration | ||||
Time. | ||||
o Minor editorial corrections and readability improvements. | ||||
- -00 | ||||
o Initialized from draft-richanna-http-message-signatures-00, | ||||
following adoption by the working group. | ||||
* draft-richanna-http-message-signatures | ||||
- -00 | ||||
o Converted to xml2rfc v3 and reformatted to comply with RFC | o Converted to xml2rfc v3 and reformatted to comply with RFC | |||
style guides. | style guides. | |||
o Removed "Signature" auth-scheme definition and related | o Removed Signature auth-scheme definition and related | |||
content. | content. | |||
o Removed conflicting normative requirements for use of | o Removed conflicting normative requirements for use of | |||
"algorithm" parameter. Now MUST NOT be relied upon. | algorithm parameter. Now MUST NOT be relied upon. | |||
o Removed Extensions appendix. | o Removed Extensions appendix. | |||
o Rewrote abstract and introduction to explain context and | o Rewrote abstract and introduction to explain context and | |||
need, and challenges inherent in signing HTTP messages. | need, and challenges inherent in signing HTTP messages. | |||
o Rewrote and heavily expanded algorithm definition, retaining | o Rewrote and heavily expanded algorithm definition, retaining | |||
normative requirements. | normative requirements. | |||
o Added definitions for key terms, referenced RFC 7230 for | o Added definitions for key terms, referenced RFC 7230 for | |||
HTTP terms. | HTTP terms. | |||
o Added examples for canonicalization and signature generation | o Added examples for canonicalization and signature generation | |||
steps. | steps. | |||
o Rewrote Signature header definition, retaining normative | o Rewrote Signature header definition, retaining normative | |||
requirements. | requirements. | |||
o Added default values for "algorithm" and "expires" | o Added default values for algorithm and expires parameters. | |||
parameters. | ||||
o Rewrote HTTP Signature Algorithms registry definition. | o Rewrote HTTP Signature Algorithms registry definition. | |||
Added change control policy and registry template. Removed | Added change control policy and registry template. Removed | |||
suggested URI. | suggested URI. | |||
o Added IANA HTTP Signature Parameter registry. | o Added IANA HTTP Signature Parameter registry. | |||
o Added additional normative and informative references. | o Added additional normative and informative references. | |||
o Added Topics for Working Group Discussion section, to be | o Added Topics for Working Group Discussion section, to be | |||
skipping to change at page 38, line 42 ¶ | skipping to change at page 43, line 28 ¶ | |||
Email: ietf@justin.richer.org | Email: ietf@justin.richer.org | |||
URI: https://bspk.io/ | URI: https://bspk.io/ | |||
Manu Sporny | Manu Sporny | |||
Digital Bazaar | Digital Bazaar | |||
203 Roanoke Street W. | 203 Roanoke Street W. | |||
Blacksburg, VA 24060 | Blacksburg, VA 24060 | |||
United States of America | United States of America | |||
Phone: +1 540 961 4469 | ||||
Email: msporny@digitalbazaar.com | Email: msporny@digitalbazaar.com | |||
URI: https://manu.sporny.org/ | URI: https://manu.sporny.org/ | |||
End of changes. 198 change blocks. | ||||
590 lines changed or deleted | 778 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ |