draft-ietf-httpbis-message-signatures-03.txt | draft-ietf-httpbis-message-signatures-04.txt | |||
---|---|---|---|---|
HTTP 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: 9 October 2021 Bespoke Engineering | Expires: 23 October 2021 Bespoke Engineering | |||
M. Sporny | M. Sporny | |||
Digital Bazaar | Digital Bazaar | |||
7 April 2021 | 21 April 2021 | |||
Signing HTTP Messages | Signing HTTP Messages | |||
draft-ietf-httpbis-message-signatures-03 | draft-ietf-httpbis-message-signatures-04 | |||
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. | |||
skipping to change at page 2, line 10 ¶ | skipping to change at page 2, line 10 ¶ | |||
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 9 October 2021. | This Internet-Draft will expire on 23 October 2021. | |||
Copyright Notice | Copyright Notice | |||
Copyright (c) 2021 IETF Trust and the persons identified as the | Copyright (c) 2021 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 . . . . . . . . . . . . . . . . . . . . . . . . 3 | |||
1.1. Requirements Discussion . . . . . . . . . . . . . . . . . 4 | 1.1. Requirements Discussion . . . . . . . . . . . . . . . . . 4 | |||
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 . . . . . . . . . . . . . . . 6 | |||
1.5. Application of HTTP Message Signatures . . . . . . . . . 7 | 1.5. Application of HTTP Message Signatures . . . . . . . . . 8 | |||
2. HTTP Message Signature Covered Content . . . . . . . . . . . 8 | 2. HTTP Message Signature Covered Content . . . . . . . . . . . 9 | |||
2.1. HTTP Headers . . . . . . . . . . . . . . . . . . . . . . 9 | 2.1. HTTP Headers . . . . . . . . . . . . . . . . . . . . . . 9 | |||
2.1.1. Canonicalized Structured HTTP Headers . . . . . . . . 9 | 2.1.1. Canonicalized Structured HTTP Headers . . . . . . . . 10 | |||
2.1.2. Canonicalization Examples . . . . . . . . . . . . . . 9 | 2.1.2. Canonicalization Examples . . . . . . . . . . . . . . 10 | |||
2.2. Dictionary Structured Field Members . . . . . . . . . . . 10 | 2.2. Dictionary Structured Field Members . . . . . . . . . . . 11 | |||
2.2.1. Canonicalization Examples . . . . . . . . . . . . . . 10 | 2.2.1. Canonicalization Examples . . . . . . . . . . . . . . 11 | |||
2.3. List Prefixes . . . . . . . . . . . . . . . . . . . . . . 11 | 2.3. List Prefixes . . . . . . . . . . . . . . . . . . . . . . 12 | |||
2.3.1. Canonicalization Examples . . . . . . . . . . . . . . 11 | 2.3.1. Canonicalization Examples . . . . . . . . . . . . . . 12 | |||
2.4. Specialty Content Fields . . . . . . . . . . . . . . . . 12 | 2.4. Specialty Content Fields . . . . . . . . . . . . . . . . 13 | |||
2.4.1. Request Target . . . . . . . . . . . . . . . . . . . 12 | 2.4.1. Request Target . . . . . . . . . . . . . . . . . . . 13 | |||
2.4.2. Signature Parameters . . . . . . . . . . . . . . . . 13 | 2.4.2. Signature Parameters . . . . . . . . . . . . . . . . 14 | |||
2.5. Creating the Signature Input String . . . . . . . . . . . 16 | 2.5. Creating the Signature Input String . . . . . . . . . . . 16 | |||
3. HTTP Message Signatures . . . . . . . . . . . . . . . . . . . 17 | 3. HTTP Message Signatures . . . . . . . . . . . . . . . . . . . 18 | |||
3.1. Creating a Signature . . . . . . . . . . . . . . . . . . 18 | 3.1. Creating a Signature . . . . . . . . . . . . . . . . . . 18 | |||
3.2. Verifying a Signature . . . . . . . . . . . . . . . . . . 20 | 3.2. Verifying a Signature . . . . . . . . . . . . . . . . . . 19 | |||
3.2.1. Enforcing Application Requirements . . . . . . . . . 21 | 3.2.1. Enforcing Application Requirements . . . . . . . . . 21 | |||
3.3. Signature Algorithm Methods . . . . . . . . . . . . . . . 22 | 3.3. Signature Algorithm Methods . . . . . . . . . . . . . . . 22 | |||
3.3.1. RSASSA-PSS using SHA-512 . . . . . . . . . . . . . . 22 | 3.3.1. RSASSA-PSS using SHA-512 . . . . . . . . . . . . . . 22 | |||
3.3.2. RSASSA-PKCS1-v1_5 using SHA-256 . . . . . . . . . . . 22 | 3.3.2. RSASSA-PKCS1-v1_5 using SHA-256 . . . . . . . . . . . 23 | |||
3.3.3. HMAC using SHA-256 . . . . . . . . . . . . . . . . . 23 | 3.3.3. HMAC using SHA-256 . . . . . . . . . . . . . . . . . 23 | |||
3.3.4. ECDSA using curve P-256 DSS and SHA-256 . . . . . . . 23 | 3.3.4. ECDSA using curve P-256 DSS and SHA-256 . . . . . . . 24 | |||
3.3.5. JSON Web Signature (JWS) algorithms . . . . . . . . . 24 | 3.3.5. JSON Web Signature (JWS) algorithms . . . . . . . . . 24 | |||
4. Including a Message Signature in a Message . . . . . . . . . 24 | 4. Including a Message Signature in a Message . . . . . . . . . 24 | |||
4.1. The 'Signature-Input' HTTP Header . . . . . . . . . . . . 24 | 4.1. The 'Signature-Input' HTTP Header . . . . . . . . . . . . 25 | |||
4.2. The 'Signature' HTTP Header . . . . . . . . . . . . . . . 25 | 4.2. The 'Signature' HTTP Header . . . . . . . . . . . . . . . 25 | |||
4.3. Examples . . . . . . . . . . . . . . . . . . . . . . . . 25 | 4.3. Multiple Signatures . . . . . . . . . . . . . . . . . . . 26 | |||
5. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 26 | 5. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 27 | |||
5.1. HTTP Signature Algorithms Registry . . . . . . . . . . . 26 | 5.1. HTTP Signature Algorithms Registry . . . . . . . . . . . 27 | |||
5.1.1. Registration Template . . . . . . . . . . . . . . . . 26 | 5.1.1. Registration Template . . . . . . . . . . . . . . . . 27 | |||
5.1.2. Initial Contents . . . . . . . . . . . . . . . . . . 27 | 5.1.2. Initial Contents . . . . . . . . . . . . . . . . . . 28 | |||
5.2. HTTP Signature Metadata Parameters Registry . . . . . . . 28 | 5.2. HTTP Signature Metadata Parameters Registry . . . . . . . 29 | |||
5.2.1. Registration Template . . . . . . . . . . . . . . . . 28 | 5.2.1. Registration Template . . . . . . . . . . . . . . . . 29 | |||
5.2.2. Initial Contents . . . . . . . . . . . . . . . . . . 28 | 5.2.2. Initial Contents . . . . . . . . . . . . . . . . . . 29 | |||
5.3. HTTP Signature Specialty Content Identifiers Registry . . 29 | 5.3. HTTP Signature Specialty Content Identifiers Registry . . 30 | |||
5.3.1. Registration Template . . . . . . . . . . . . . . . . 29 | 5.3.1. Registration Template . . . . . . . . . . . . . . . . 30 | |||
5.3.2. Initial Contents . . . . . . . . . . . . . . . . . . 29 | 5.3.2. Initial Contents . . . . . . . . . . . . . . . . . . 30 | |||
6. Security Considerations . . . . . . . . . . . . . . . . . . . 30 | 6. Security Considerations . . . . . . . . . . . . . . . . . . . 31 | |||
7. References . . . . . . . . . . . . . . . . . . . . . . . . . 30 | 7. References . . . . . . . . . . . . . . . . . . . . . . . . . 31 | |||
7.1. Normative References . . . . . . . . . . . . . . . . . . 30 | 7.1. Normative References . . . . . . . . . . . . . . . . . . 31 | |||
7.2. Informative References . . . . . . . . . . . . . . . . . 31 | 7.2. Informative References . . . . . . . . . . . . . . . . . 32 | |||
Appendix A. Detecting HTTP Message Signatures . . . . . . . . . 32 | Appendix A. Detecting HTTP Message Signatures . . . . . . . . . 33 | |||
Appendix B. Examples . . . . . . . . . . . . . . . . . . . . . . 32 | Appendix B. Examples . . . . . . . . . . . . . . . . . . . . . . 33 | |||
B.1. Example Keys . . . . . . . . . . . . . . . . . . . . . . 32 | B.1. Example Keys . . . . . . . . . . . . . . . . . . . . . . 33 | |||
B.1.1. Example Key RSA test . . . . . . . . . . . . . . . . 32 | B.1.1. Example Key RSA test . . . . . . . . . . . . . . . . 33 | |||
B.2. Example keyid Values . . . . . . . . . . . . . . . . . . 33 | B.1.2. Example Key RSA PSS test . . . . . . . . . . . . . . 34 | |||
B.3. Test Cases . . . . . . . . . . . . . . . . . . . . . . . 34 | B.2. Test Cases . . . . . . . . . . . . . . . . . . . . . . . 35 | |||
B.3.1. Signature Verification . . . . . . . . . . . . . . . 34 | B.2.1. Minimal Signature Header using rsa-pss-sha512 . . . . 36 | |||
Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . . 35 | B.2.2. Header Coverage . . . . . . . . . . . . . . . . . . . 36 | |||
Document History . . . . . . . . . . . . . . . . . . . . . . . . 35 | B.2.3. Full Coverage . . . . . . . . . . . . . . . . . . . . 37 | |||
Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 38 | Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . . 37 | |||
Document History . . . . . . . . . . . . . . . . . . . . . . . . 38 | ||||
Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 40 | ||||
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 applications. | that are critical to the secure operation of many HTTP applications. | |||
Application developers typically rely on the transport layer to | Application developers typically rely on the transport layer to | |||
provide these properties, by operating their application over [TLS]. | provide these properties, by operating their application over [TLS]. | |||
However, TLS only guarantees these properties over a single TLS | However, TLS only guarantees these properties over a single TLS | |||
connection, and the path between client and application may be | connection, and the path between client and application may be | |||
composed of multiple independent TLS connections (for example, if the | composed of multiple independent TLS connections (for example, if the | |||
skipping to change at page 7, line 11 ¶ | skipping to change at page 7, line 25 ¶ | |||
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. | |||
The term "Unix time" is defined by [POSIX.1] section 4.16 | Covered Content: | |||
An ordered list of content identifiers for headers (Section 2.1) | ||||
and specialty content (Section 2.4) that indicates the metadata | ||||
and message content that is covered by the signature, not | ||||
including the "@signature-params" specialty field itself. | ||||
HTTP Signature Algorithm: | ||||
A cryptographic algorithm that describes the signing and | ||||
verification process for the signature. When expressed | ||||
explicitly, the value maps to a string defined in the HTTP | ||||
Signature Algorithms Registry defined in this document. | ||||
Key Material: | ||||
The key material required to create or verify the signature. The | ||||
key material is often identified with an explicit key identifier, | ||||
allowing the signer to indicate to the verifier which key was | ||||
used. | ||||
Creation Time: | ||||
A timestamp representing the point in time that the signature was | ||||
generated, as asserted by the signer. | ||||
Expiration Time: | ||||
A timestamp representing the point in time at which the signature | ||||
expires, as asserted by the signer. A signature's expiration time | ||||
could be undefined, indicating that the signature does not expire | ||||
from the perspective of the signer. | ||||
The term "Unix time" is defined by [POSIX.1], Section 4.16 | ||||
(http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/ | (http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/ | |||
V1_chap04.html#tag_04_16). | V1_chap04.html#tag_04_16). | |||
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. Some examples use a single trailing backslash '' to | |||
into multiple lines, using the "obs-fold" syntax. This syntax is | indicate line wrapping for long values, as per [RFC8792]. The "\" | |||
deprecated in [MESSAGING], and senders MUST NOT generate messages | character and leading spaces on wrapped lines are not part of the | |||
that include it. | value. | |||
Additionally, some examples use '\' line wrapping for long values | ||||
that contain no whitespace, as per [RFC8792]. | ||||
1.5. Application of HTTP Message Signatures | 1.5. Application of HTTP Message Signatures | |||
HTTP Message Signatures are designed to be a general-purpose security | HTTP Message Signatures are designed to be a general-purpose security | |||
mechanism applicable in a wide variety of circumstances and | mechanism applicable in a wide variety of circumstances and | |||
applications. In order to properly and safely apply HTTP Message | applications. In order to properly and safely apply HTTP Message | |||
Signatures, an application or profile of this specification MUST | Signatures, an application or profile of this specification MUST | |||
specify all of the following items: | specify all of the following items: | |||
* The set of content identifiers (Section 2) that are expected and | * The set of content identifiers (Section 2) that are expected and | |||
required. For example, an authorization protocol could mandate | required. For example, an authorization protocol could mandate | |||
that the "Authorization" header be covered to protect the | that the "Authorization" header be covered to protect the | |||
authorization credentials and mandate the signature parameters | authorization credentials and mandate the signature parameters | |||
contain a "created" parameter, while an API expecting HTTP message | contain a "created" parameter, while an API expecting HTTP message | |||
bodies could require the "Digest" header to be present and | bodies could require the "Digest" header to be present and | |||
covered. | covered. | |||
* A means of retrieving the key material used to verify the | * A means of retrieving the key material used to verify the | |||
signature. An application will usually use the "keyid" parameter | signature. An application will usually use the "keyid" parameter | |||
of the signature parameters Section 2.4.2 and define rules for | of the signature parameters (Section 2.4.2) and define rules for | |||
resolving a key from there, though the appropriate key could be | resolving a key from there, though the appropriate key could be | |||
known from other means. | known from other means. | |||
* A means of determining the signature algorithm used to verify the | * A means of determining the signature algorithm used to verify the | |||
signature content is appropriate for the key material. For | signature content is appropriate for the key material. For | |||
example, the process could use the "alg" parameter of the | example, the process could use the "alg" parameter of the | |||
signature parameters Section 2.4.2 to state the algorithm | signature parameters (Section 2.4.2) to state the algorithm | |||
explicitly, derive the algorithm from the key material, or use | explicitly, derive the algorithm from the key material, or use | |||
some pre-configured algorithm agreed upon by the signer and | some pre-configured algorithm agreed upon by the signer and | |||
verifier. | verifier. | |||
* A means of determining that a given key and algorithm presented in | * A means of determining that a given key and algorithm presented in | |||
the request are appropriate for the request being made. For | the request are appropriate for the request being made. For | |||
example, a server expecting only ECDSA signatures should know to | example, a server expecting only ECDSA signatures should know to | |||
reject any RSA signatures, or a server expecting asymmetric | reject any RSA signatures, or a server expecting asymmetric | |||
cryptography should know to reject any symmetric cryptography. | cryptography should know to reject any symmetric cryptography. | |||
skipping to change at page 8, line 32 ¶ | skipping to change at page 9, line 23 ¶ | |||
Some content within HTTP messages can undergo transformations that | Some content within HTTP messages can 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 | |||
example, the merging together of header fields with the same name). | example, the merging together of header fields with the same name). | |||
Message content must therefore be canonicalized before it is signed, | Message content must therefore be canonicalized before it is signed, | |||
to ensure that a signature can be verified despite such intermediary | to ensure that a signature can be verified despite such intermediary | |||
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. | |||
Content identifiers are defined using production grammar defined by | Content identifiers are defined using production grammar defined by | |||
[RFC8941] section 4. The content identifier is an "sf-string" value. | RFC8941, Section 4 [RFC8941]. The content identifier is an "sf- | |||
The content identifier type MAY define parameters which are included | string" value. The content identifier type MAY define parameters | |||
using the "parameters" rule. | which are included using the "parameters" rule. | |||
content-identifier = sf-string parameters | content-identifier = sf-string parameters | |||
Note that this means the value of the identifier itself is encased in | Note that this means the value of the identifier itself is encased in | |||
double quotes, with parameters following as a semicolon-separated | double quotes, with parameters following as a semicolon-separated | |||
list, such as ""cache-control"", ""date"", or ""@signature-params"". | list, such as ""cache-control"", ""date"", or ""@signature-params"". | |||
The following sections define content identifier types, their | The following sections define content identifier types, their | |||
parameters, their associated content, and their canonicalization | parameters, their associated content, and their canonicalization | |||
rules. The method for combining content identifiers into the | rules. The method for combining content identifiers into the | |||
skipping to change at page 9, line 30 ¶ | skipping to change at page 10, line 15 ¶ | |||
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. | " between each item. | |||
The resulting string is the canonicalized value. | The resulting string is the canonicalized value. | |||
2.1.1. Canonicalized Structured HTTP Headers | 2.1.1. Canonicalized Structured HTTP Headers | |||
If value of the the HTTP header in question is a structured field | If value of the the HTTP header in question is a structured field | |||
[RFC8941], the content identifier MAY include the "sf" parameter. If | ([RFC8941]), the content identifier MAY include the "sf" parameter. | |||
this parameter is included, the HTTP header value MUST be | If this parameter is included, the HTTP header value MUST be | |||
canonicalized using the rules specified in [RFC8941] section 4. Note | canonicalized using the rules specified in Section 4 of RFC8941 | |||
that this process will replace any optional whitespace with a single | [RFC8941]. Note that this process will replace any optional | |||
space. | whitespace with a single space. | |||
The resulting string is used as the field value input in Section 2.1. | The resulting string is used as the field value input in Section 2.1. | |||
2.1.2. Canonicalization Examples | 2.1.2. 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 | ||||
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 | | |||
+---------------------+----------------------------------+ | +---------------------+----------------------------------+ | |||
skipping to change at page 10, line 36 ¶ | skipping to change at page 11, line 34 ¶ | |||
2.2. Dictionary Structured Field Members | 2.2. Dictionary Structured Field Members | |||
An individual member in the value of a Dictionary Structured Field is | An individual member in the value of a Dictionary Structured Field is | |||
identified by using the parameter "key" on the content identifier for | identified by using the parameter "key" on the content identifier for | |||
the header. The value of this parameter is a the key being | the header. The value of this parameter is a the key being | |||
identified, without any parameters present on that key in the | identified, without any parameters present on that key in the | |||
original dictionary. | original dictionary. | |||
An individual member in the value of a Dictionary Structured Field is | An individual member in the value of a Dictionary Structured Field is | |||
canonicalized by applying the serialization algorithm described in | canonicalized by applying the serialization algorithm described in | |||
Section 4.1.2 of [RFC8941] on a Dictionary containing only that | Section 4.1.2 of RFC8941 [RFC8941] on a Dictionary containing only | |||
member. | that member. | |||
2.2.1. Canonicalization Examples | 2.2.1. Canonicalization Examples | |||
This section contains non-normative examples of canonicalized values | This section contains non-normative examples of canonicalized values | |||
for Dictionary Structured Field Members given the following example | for Dictionary Structured Field Members given the following example | |||
header field, whose value is assumed to be a Dictionary: | header field, whose value is assumed to be a Dictionary: | |||
X-Dictionary: a=1, b=2;x=1;y=2, c=(a b c) | X-Dictionary: a=1, b=2;x=1;y=2, c=(a b c) | |||
The following table shows example canonicalized values for different | The following table shows example canonicalized values for different | |||
skipping to change at page 11, line 26 ¶ | skipping to change at page 12, line 26 ¶ | |||
Dictionary member canonicalization. | Dictionary member canonicalization. | |||
2.3. List Prefixes | 2.3. List Prefixes | |||
A prefix of a List Structured Field consisting of the first N members | 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 | 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 | than or equal to the number of members in the List) is identified by | |||
the parameter "prefix" with the value of N as an integer. | the parameter "prefix" with the value of N as an integer. | |||
A list prefix value is canonicalized by applying the serialization | A list prefix value is canonicalized by applying the serialization | |||
algorithm described in Section 4.1.1 of [RFC8941] on a List | algorithm described in Section 4.1.1 of RFC8941 [RFC8941] on a List | |||
containing only the first N members as specified in the list prefix, | containing only the first N members as specified in the list prefix, | |||
in the order they appear in the original List. | in the order they appear in the original List. | |||
2.3.1. Canonicalization Examples | 2.3.1. Canonicalization Examples | |||
This section contains non-normative examples of canonicalized values | This section contains non-normative examples of canonicalized values | |||
for list prefixes given the following example header fields, whose | for list prefixes given the following example header fields, whose | |||
values are assumed to be Dictionaries: | values are assumed to be Dictionaries: | |||
X-List-A: (a b c d e f) | X-List-A: (a b c d e f) | |||
skipping to change at page 12, line 33 ¶ | skipping to change at page 13, line 33 ¶ | |||
Content not found in an HTTP header can be included in the signature | Content not found in an HTTP header can be included in the signature | |||
base string by defining a content identifier and the canonicalization | base string by defining a content identifier and the canonicalization | |||
method for its content. | method for its content. | |||
To differentiate specialty content identifiers from HTTP headers, | To differentiate specialty content identifiers from HTTP headers, | |||
specialty content identifiers MUST start with the "at" "@" character. | specialty content identifiers MUST start with the "at" "@" character. | |||
This specification defines the following specialty content | This specification defines the following specialty content | |||
identifiers: | identifiers: | |||
@request-target The target request endpoint. Section 2.4.1 | @request-target The target request endpoint. (Section 2.4.1) | |||
@signature-params The signature metadata parameters for this | @signature-params The signature metadata parameters for this | |||
signature. Section 2.4.2 | signature. (Section 2.4.2) | |||
Additional specialty content identifiers MAY be defined and | Additional specialty content identifiers MAY be defined and | |||
registered in the HTTP Signatures Specialty Content Identifier | registered in the HTTP Signatures Specialty Content Identifier | |||
Registry. Section 5.3 | Registry. (Section 5.3) | |||
2.4.1. Request Target | 2.4.1. Request Target | |||
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. | |||
skipping to change at page 13, line 51 ¶ | skipping to change at page 14, line 51 ¶ | |||
information regarding the signature's generation and/or verification. | information regarding the signature's generation and/or verification. | |||
The signature parameters special content is identified by the | The signature parameters special content is identified by the | |||
"@signature-params" identifier. | "@signature-params" identifier. | |||
Its canonicalized value is the serialization of the signature | Its canonicalized value is the serialization of the signature | |||
parameters for this signature, including the covered content list | parameters for this signature, including the covered content list | |||
with all associated parameters. The following metadata properties | with all associated parameters. The following metadata properties | |||
are defined: | are defined: | |||
Covered Content: | The signature parameters are serialized using the rules in Section 4 | |||
of RFC8941 [RFC8941] as follows: | ||||
An ordered list of content identifiers for headers Section 2.1 and | ||||
specialty content Section 2.4 that indicates the metadata and | ||||
message content that is covered by the signature. This list MUST | ||||
NOT include the "@signature-params" specialty content identifier | ||||
itself. | ||||
Algorithm: | ||||
An HTTP Signature Algorithm defined in the HTTP Signature | ||||
Algorithms Registry defined in this document, represented as a | ||||
string. It describes the signing and verification algorithms for | ||||
the signature. | ||||
Key Material: | 1. Let the output be an empty string. | |||
The key material required to create or verify the signature. | ||||
Creation Time: | 2. Determine an order for the content identifiers of the covered | |||
A timestamp representing the point in time that the signature was | content. Once this order is chosen, it cannot be changed. | |||
generated, represented as an integer. Sub-second precision is not | ||||
supported. A signature's Creation Time MAY be undefined, | ||||
indicating that it is unknown. | ||||
Expiration Time: | 3. Serialize the content identifiers of the covered content as an | |||
A timestamp representing the point in time at which the signature | ordered "inner-list" according to Section 4.1.1.1 of RFC8941 | |||
expires, represented as an integer. An expired signature always | [RFC8941] and append this to the output. | |||
fails verification. A signature's Expiration Time MAY be | ||||
undefined, indicating that the signature does not expire. | ||||
The signature parameters are serialized using the rules in [RFC8941] | 4. Determine an order for signature metadata parameters. Once this | |||
section 4 as follows: | order is chosen, it cannot be changed. | |||
1. Let the output be an empty string. | 5. Append the signature metadata as parameters according to | |||
Section 4.1.1.2 of RFC8941 [RFC8941] in the chosen order, | ||||
skipping fields that are not available or not used for this | ||||
signature: | ||||
2. Serialize the content identifiers of the covered content as an | * "alg": The HTTP message signature algorithm from the HTTP | |||
ordered "inner-list" according to [RFC8941] section 4.1.1.1 and | Message Signature Algorithm Registry, as an "sf-string" value. | |||
append this to the output. | ||||
3. Append the signature metadata as parameters according to | * "keyid": The identifier for the key material as an "sf-string" | |||
[RFC8941] section 4.1.1.2 in the any order, skipping fields that | value. | |||
are not available: | ||||
* "alg": Algorithm as an "sf-string" value. | * "created": Creation time as an "sf-integer" UNIX timestamp | |||
value. Sub-second precision is not supported. | ||||
* "keyid": Identifier for the key material as an "sf-string" | * "expires": Expiration time as an "sf-integer" UNIX timestamp | |||
value. | value. Sub-second precision is not supported. | |||
* "created": Creation time as an "sf-integer" timestamp value. | * "nonce": A random unique value generated for this signature. | |||
* "expires": Expiration time as an "sf-integer" timestamp value. | 6. The output contains the signature parameters value. | |||
Note that the "inner-list" serialization is used for the covered | Note that the "inner-list" serialization is used for the covered | |||
content instead of the "sf-list" serialization in order to facilitate | content value instead of the "sf-list" serialization in order to | |||
this value's additional inclusion in the "Signature-Input" header's | facilitate this value's additional inclusion in the "Signature-Input" | |||
dictionary, as discussed in Section 4.1. | header's dictionary, as discussed in Section 4.1. | |||
This example shows a canonicalized value for the parameters of a | This example shows a canonicalized value for the parameters of a | |||
given signature: | given signature: | |||
# NOTE: '\' line wrapping per RFC 8792 | ("@request-target" "host" "date" "cache-control" "x-empty-header" \ | |||
("@request-target" "host" "date" "cache-control" "x-empty-header" | "x-example");keyid="test-key-rsa-pss";alg="rsa-pss-sha512";\ | |||
"x-example"); keyid="test-key-a"; alg="rsa-pss-sha512"; \ | created=1618884475;expires=1618884775 | |||
created=1402170695; expires=1402170995 | ||||
Note that an HTTP message could contain multiple signatures, but only | Note that an HTTP message could contain multiple signatures, but only | |||
the signature parameters used for the current signature are included. | the signature parameters used for the current signature are included | |||
in this field. | ||||
2.4.2.1. Canonicalization Examples | ||||
Given the following signature parameters: | ||||
+==============+=========================================+ | ||||
| Property | Value | | ||||
+==============+=========================================+ | ||||
| Algorithm | rsa-pss-sha512 | | ||||
+--------------+-----------------------------------------+ | ||||
| Covered | "@request-target", "host", "date", | | ||||
| Content | "cache-control", "x-emptyheader", | | ||||
| | "x-example", "x-dictionary;key=b", | | ||||
| | "x-dictionary;key=a", "x-list;prefix=3" | | ||||
+--------------+-----------------------------------------+ | ||||
| Creation | 1402174295 | | ||||
| Time | | | ||||
+--------------+-----------------------------------------+ | ||||
| Expiration | 1402174595 | | ||||
| Time | | | ||||
+--------------+-----------------------------------------+ | ||||
| Verification | The public key provided in | | ||||
| Key Material | Appendix B.1.1 and identified by the | | ||||
| | "keyid" value "test-key-a". | | ||||
+--------------+-----------------------------------------+ | ||||
Table 5 | ||||
The signature parameter value is defined as: | ||||
# NOTE: '\' line wrapping per RFC 8792 | ||||
"@signature-params": ("@request-target" "host" "date" "cache-control" \ | ||||
"x-empty-header" "x-example" "x-dictionary";key=b \ | ||||
"x-dictionary";key=a "x-list";prefix=3); keyid="test-key-a"; \ | ||||
alg="rsa-pss-sha512"; created=1402170695; expires=1402170995 | ||||
2.5. Creating the Signature Input String | 2.5. Creating the Signature Input String | |||
The signature input is a US-ASCII string containing the content that | The signature input is a US-ASCII string containing the content that | |||
is covered by the signature. To create the signature input string, | is covered by the signature. To create the signature input string, | |||
the signer or verifier concatenates together entries for each | the signer or verifier concatenates together entries for each | |||
identifier in the signature's covered content and parameters using | identifier in the signature's covered content and parameters using | |||
the following algorithm: | the following algorithm: | |||
1. Let the output be an empty string. | 1. Let the output be an empty string. | |||
skipping to change at page 16, line 32 ¶ | skipping to change at page 16, line 26 ¶ | |||
order): | order): | |||
1. Append the identifier for the covered content serialized | 1. Append the identifier for the covered content serialized | |||
according to the "content-identifier" rule. | according to the "content-identifier" rule. | |||
2. Append a single colon "":"" | 2. Append a single colon "":"" | |||
3. Append a single space "" "" | 3. Append a single space "" "" | |||
4. Append the covered content's canonicalized value, as defined | 4. Append the covered content's canonicalized value, as defined | |||
by the covered content type. Section 2.1 and Section 2.4 | by the covered content type. (Section 2.1 and Section 2.4) | |||
5. Append a single newline ""\\n"" | 5. Append a single newline ""\\n"" | |||
3. Append the signature parameters Section 2.4.2 as follows: | 3. Append the signature parameters (Section 2.4.2) as follows: | |||
1. Append the identifier for the signature parameters serialized | 1. Append the identifier for the signature parameters serialized | |||
according to the "content-identifier" rule, ""@signature- | according to the "content-identifier" rule, ""@signature- | |||
params"" | params"" | |||
2. Append a single colon "":"" | 2. Append a single colon "":"" | |||
3. Append a single space "" "" | 3. Append a single space "" "" | |||
4. Append the signature parameters' canonicalized value as | 4. Append the signature parameters' canonicalized value as | |||
defined in Section 2.4.2 | defined in Section 2.4.2 | |||
4. Return the output string. | 4. Return the output string. | |||
If covered content references an identifier that cannot be resolved | If covered content references an identifier that cannot be resolved | |||
to a value in the message, the implementation MUST produce an error. | to a value in the message, the implementation MUST produce an error. | |||
Such situations are included but not limited to: * The signer or | Such situations are included but not limited to: | |||
verifier does not understand the content identifier. * The identifier | ||||
identifies a header field that is not present in the message or whose | ||||
value is malformed. * The identifier is a Dictionary member | ||||
identifier that references a header field that is not present in the | ||||
message, is not a Dictionary Structured Field, or whose value is | ||||
malformed. * The identifier is a List Prefix member identifier that | ||||
references a header field that is not present in the message, is not | ||||
a List Structured Field, or whose value is malformed. * The | ||||
identifier is a Dictionary member identifier that references a member | ||||
that is not present in the header field value, or whose value is | ||||
malformed. E.g., the identifier is ""x-dictionary";key=c" and the | ||||
value of the "x-dictionary" header field is "a=1, b=2" * The | ||||
identifier is a List Prefix member identifier that specifies more | ||||
List members than are present the header field. E.g., the identifier | ||||
is ""x-list";prefix=3" and the value of the "x-list" header field is | ||||
"(1, 2)". | ||||
For the non-normative example Signature metadata in Table 6, the | * The signer or verifier does not understand the content identifier. | |||
corresponding Signature Input is: | ||||
* The identifier identifies a header field that is not present in | ||||
the message or whose value is malformed. | ||||
* The identifier is a Dictionary member identifier that references a | ||||
header field that is not present in the message, is not a | ||||
Dictionary Structured Field, or whose value is malformed. | ||||
* The identifier is a List Prefix member identifier that references | ||||
a header field that is not present in the message, is not a List | ||||
Structured Field, or whose value is malformed. | ||||
* The identifier is a Dictionary member identifier that references a | ||||
member that is not present in the header field value, or whose | ||||
value is malformed. E.g., the identifier is | ||||
""x-dictionary";key=c" and the value of the "x-dictionary" header | ||||
field is "a=1, b=2" | ||||
* The identifier is a List Prefix member identifier that specifies | ||||
more List members than are present the header field. E.g., the | ||||
identifier is ""x-list";prefix=3" and the value of the "x-list" | ||||
header field is "(1, 2)". | ||||
In the following non-normative example, the HTTP message being signed | ||||
is the following request: | ||||
GET /foo HTTP/1.1 | ||||
Host: example.org | ||||
Date: Tue, 20 Apr 2021 02:07:55 GMT | ||||
X-Example: Example header | ||||
with some whitespace. | ||||
X-Empty-Header: | ||||
Cache-Control: max-age=60 | ||||
Cache-Control: must-revalidate | ||||
The covered content consists of the "@request-target" speciality | ||||
header followed by the "Host", "Date", "Cache-Control", "X-Empty- | ||||
Header", "X-Example" HTTP headers, in order. The signature creation | ||||
timestamp is "1618884475" and the key identifier is "test-key-rsa- | ||||
pss". The signature input string for this message with these | ||||
parameters is: | ||||
# NOTE: '\' line wrapping per RFC 8792 | ||||
"@request-target": get /foo | "@request-target": get /foo | |||
"host": example.org | "host": example.org | |||
"date": Tue, 07 Jun 2014 20:51:35 GMT | "date": Tue, 20 Apr 2021 02:07:55 GMT | |||
"cache-control": max-age=60, must-revalidate | "cache-control": max-age=60, must-revalidate | |||
"x-emptyheader": | "x-empty-header": | |||
"x-example": Example header with some whitespace. | "x-example": Example header with some whitespace. | |||
"x-dictionary";key=b: 2 | ||||
"x-dictionary";key=a: 1 | ||||
"x-list";prefix=3: (a, b, c) | ||||
"@signature-params": ("@request-target" "host" "date" "cache-control" \ | "@signature-params": ("@request-target" "host" "date" "cache-control" \ | |||
"x-empty-header" "x-example" "x-dictionary";key=b \ | "x-empty-header" "x-example");created=1618884475;\ | |||
"x-dictionary";key=a "x-list";prefix=3); keyid="test-key-a"; \ | keyid="test-key-rsa-pss" | |||
created=1402170695; expires=1402170995 | ||||
Figure 1: Non-normative example Signature Input | Figure 1: Non-normative example Signature Input | |||
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. | |||
3.1. Creating a Signature | 3.1. Creating a Signature | |||
In order to create a signature, a signer completes the following | In order to create a signature, a signer MUST follow the following | |||
process: | algorithm: | |||
1. The signer chooses an HTTP signature algorithm and key material | 1. The signer chooses an HTTP signature algorithm and key material | |||
for signing. The signer MUST choose key material that is | for signing. The signer MUST choose key material that is | |||
appropriate for the signature's algorithm, and that conforms to | appropriate for the signature's algorithm, and that conforms to | |||
any requirements defined by the algorithm, such as key size or | any requirements defined by the algorithm, such as key size or | |||
format. The mechanism by which the signer chooses the algorithm | format. The mechanism by which the signer chooses the algorithm | |||
and key material is out of scope for this document. | and key material is out of scope for this document. | |||
2. The signer sets the signature's creation time to the current | 2. The signer sets the signature's creation time to the current | |||
time. | time. | |||
3. If applicable, the signer sets the signature's expiration time | 3. If applicable, the signer sets the signature's expiration time | |||
property to the time at which the signature is to expire. | property to the time at which the signature is to expire. | |||
4. The signer creates an ordered list of content identifiers | 4. 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. | signature's Covered Content. | |||
* Each covered content identifier MUST reference either an HTTP | * Once an order of covered content is chosen, the order MUST NOT | |||
header or a specialty content field listed in Section 2.4 or | change for the life of the signature. | |||
its associated registry. | ||||
* Each covered content identifier MUST either reference an HTTP | ||||
header in the request message Section 2.1 or reference a | ||||
specialty content field listed in Section 2.4 or its | ||||
associated registry. | ||||
* Signers SHOULD include "@request-target" in the covered | * Signers SHOULD include "@request-target" in the covered | |||
content list list. | content list list. | |||
* Signers SHOULD include a date stamp in some form, such as | * Signers SHOULD include a date stamp in some form, such as | |||
using the "date" header. Alternatively, the "created" | using the "date" header. Alternatively, the "created" | |||
signature metadata parameter can fulfil this role. | signature metadata parameter can fulfil this role. | |||
* Further guidance on what to include in this list and in what | * Further guidance on what to include in this list and in what | |||
order is out of scope for this document. However, note that | order is out of scope for this document. However, note that | |||
the list order is significant and once established for a given | the list order is significant and once established for a given | |||
signature it MUST be preserved for that signature. | signature it MUST be preserved for that signature. | |||
* Note that the "@signature-params" specialty identifier is not | * Note that the "@signature-params" specialty identifier is not | |||
explicitly listed in the list of covered content identifiers, | explicitly listed in the list of covered content identifiers, | |||
because it is required to always be present as the last line | because it is required to always be present as the last line | |||
in the signature input. This ensures that a signature always | in the signature input. This ensures that a signature always | |||
covers its own metadata. | covers its own metadata. | |||
5. The signer creates the signature input string. Section 2.5 | 5. The signer creates the signature input string. (Section 2.5) | |||
6. The signer signs the signature input with the chosen signing | 6. The signer signs the signature input with the chosen signing | |||
algorithm using the key material chosen by the signer. Several | algorithm using the key material chosen by the signer. Several | |||
signing algorithms are defined in in Section 3.3. | signing algorithms are defined in in Section 3.3. | |||
7. The signer then encodes the result of that operation as a | 7. The byte array output of the signature function is the HTTP | |||
Base64-encoded string [RFC4648]. This string is the signature | message signature output value to be included in the "Signature" | |||
output value. | header as defined in Section 4.2. | |||
For example, given the following HTTP message: | For example, given the HTTP message and signature parameters in the | |||
example in Section 2.5, the example signature input string when | ||||
signed with the "test-key-rsa-pss" key in Appendix B.1.2 gives the | ||||
following message signature output value, encoded in Base64: | ||||
GET /foo HTTP/1.1 | :H00a6KdNCRWgOWBMvuRtxh6c/wrVxwt2p5KyqBJqmtPbNTd980hWwkUE6H4NWiTs5f2Ef0\ | |||
Host: example.org | qJ3iypXT2bR9Pc+PVU9U2gAzTcZKK8MDJLjYKfaE835zg/9sOdGR+tlRJ1cbCoWMVoCgEPi\ | |||
Date: Sat, 07 Jun 2014 20:51:35 GMT | 4t6QewbI0xgdx8AmP5ItTunYmhe8G0JR42lfvz60+szb8SpwJEmkMPr5dBOz6DLEeM3IgKN\ | |||
X-Example: Example header | oBlJPp94WSJkgvwTM64rXw049ZkYenl9jwKlcXEmA1a4MNWoUElr6eh5k20djMZftCYTPUU\ | |||
with some whitespace. | PMxZUavcQy+cp6lfKonz6HIDe3+n3VOTOo8uu1aSVfKQQzR+ZEwSaZQBrdQ==: | |||
X-EmptyHeader: | ||||
X-Dictionary: a=1, b=2 | ||||
X-List: (a b c d) | ||||
Cache-Control: max-age=60 | ||||
Cache-Control: must-revalidate | ||||
The following table presents a non-normative example of metadata | Figure 2: Non-normative example signature value | |||
values that a signer may choose: | ||||
+==============+=========================================+ | 3.2. Verifying a Signature | |||
| Property | Value | | ||||
+==============+=========================================+ | ||||
| Covered | "@request-target", "host", "date", | | ||||
| Content | "cache-control", "x-emptyheader", | | ||||
| | "x-example", "x-dictionary;key=b", | | ||||
| | "x-dictionary;key=a", "x-list;prefix=3" | | ||||
+--------------+-----------------------------------------+ | ||||
| Creation | 1402174295 | | ||||
| Time | | | ||||
+--------------+-----------------------------------------+ | ||||
| Expiration | 1402174595 | | ||||
| Time | | | ||||
+--------------+-----------------------------------------+ | ||||
| Verification | The public key provided in | | ||||
| Key Material | Appendix B.1.1 and identified by the | | ||||
| | "keyid" value "test-key-a". | | ||||
+--------------+-----------------------------------------+ | ||||
Table 6: Non-normative example metadata values | A verifier processes a signature and its associated signature input | |||
parameters in concert with each other. | ||||
For the non-normative example signature metadata and signature input | In order to verify a signature, a verifier MUST follow the following | |||
in Figure 1, the corresponding signature value is: | algorithm: | |||
# NOTE: '\' line wrapping per RFC 8792 | 1. Parse the "Signature" and "Signature-Input" headers and extract | |||
K2qGT5srn2OGbOIDzQ6kYT+ruaycnDAAUpKv+ePFfD0RAxn/1BUeZx/Kdrq32DrfakQ6b\ | the signatures to be verified. | |||
PsvB9aqZqognNT6be4olHROIkeV879RrsrObury8L9SCEibeoHyqU/yCjphSmEdd7WD+z\ | ||||
rchK57quskKwRefy2iEC5S2uAH0EPyOZKWlvbKmKu5q4CaB8X/I5/+HLZLGvDiezqi6/7\ | ||||
p2Gngf5hwZ0lSdy39vyNMaaAT0tKo6nuVw0S1MVg1Q7MpWYZs0soHjttq0uLIA3DIbQfL\ | ||||
iIvK6/l0BdWTU7+2uQj7lBkQAsFZHoA96ZZgFquQrXRlmYOh+Hx5D9fJkXcXe5tmAg== | ||||
Figure 2: Non-normative example signature value | 1. If there is more than one signature value present, determine | |||
which signature should be processed for this request. If an | ||||
appropriate signature is not found, produce an error. | ||||
3.2. Verifying a Signature | 2. If the chosen "Signature" value does not have a corresponding | |||
"Signature-Input" value, produce an error. | ||||
In order to verify a signature, a verifier MUST follow the following | 2. Parse the values of the chosen "Signature-Input" header field to | |||
algorithm: | get the parameters for the signature to be verified. | |||
1. Examine the signature's parameters to confirm that the signature | 3. Parse the value of the corresponding "Signature" header field to | |||
get the byte array value of the signature to be verified. | ||||
4. Examine the signature parameters 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 | |||
contents are required to be covered by the signature. | contents are required to be covered by the signature. | |||
Section 3.2.1 | (Section 3.2.1) | |||
2. Determine the verification key material for this signature. If | 5. Determine the verification key material for this signature. If | |||
the key material is known through external means such as static | the key material is known through external means such as static | |||
configuration or external protocol negotiation, the verifier will | configuration or external protocol negotiation, the verifier will | |||
use that. If the key is identified in the signature parameters, | use that. If the key is identified in the signature parameters, | |||
the verifier will dereference this to appropriate key material to | the verifier will dereference this to appropriate key material to | |||
use with the signature. The verifier has to determine the | use with the signature. The verifier has to determine the | |||
trustworthiness of the key material for the context in which the | trustworthiness of the key material for the context in which the | |||
signature is presented. | signature is presented. If a key is identified that the verifier | |||
does not know, does not trust for this request, or does not match | ||||
something preconfigured, the verification MUST fail. | ||||
3. Determine the algorithm to apply for verification: | 6. Determine the algorithm to apply for verification: | |||
1. If the algorithm is known through external means such as | 1. If the algorithm is known through external means such as | |||
static configuration or external protocol negotiation, the | static configuration or external protocol negotiation, the | |||
verifier will use this algorithm. | verifier will use this algorithm. | |||
2. If the algorithm is explicitly stated in the signature | 2. If the algorithm is explicitly stated in the signature | |||
parameters using a value from the HTTP Message Signatures | parameters using a value from the HTTP Message Signatures | |||
registry, the verifier will use the referenced algorithm. | registry, the verifier will use the referenced algorithm. | |||
3. If the algorithm can be determined from the keying material, | 3. If the algorithm can be determined from the keying material, | |||
such as through an algorithm field on the key value itself, | such as through an algorithm field on the key value itself, | |||
the verifier will use this algorithm. | the verifier will use this algorithm. | |||
4. Use the received HTTP message and the signature's metadata to | 4. If the algorithm is specified in more that one location, such | |||
as through static configuration and the algorithm signature | ||||
parameter, or the algorithm signature parameter and from the | ||||
key material itself, the resolved algorithms MUST be the | ||||
same. If the algorithms are not the same, the verifier MUST | ||||
vail the verification. | ||||
7. Use the received HTTP message and the signature's metadata to | ||||
recreate the signature input, using the process described in | recreate the signature input, using the process described in | |||
Section 2.5. The value of the "@signature-params" input is the | Section 2.5. The value of the "@signature-params" input is the | |||
value of the SignatureInput header field for this signature | value of the SignatureInput header field for this signature | |||
serialized according to the rules described in Section 2.4.2, not | serialized according to the rules described in Section 2.4.2, not | |||
including the signature's label from the SignatureInput header. | including the signature's label from the "Signature-Input" | |||
header. | ||||
5. If the key material is appropriate for the algorithm, apply the | 8. If the key material is appropriate for the algorithm, apply the | |||
verification algorithm to the signature, signature input, | verification algorithm to the signature, recalculated signature | |||
signature parameters, key material, and algorithm. The results | input, signature parameters, key material, and algorithm. | |||
of the verification algorithm function are the final results of | Several algorithms are defined in Section 3.3. | |||
the signature verification. Several algorithms are defined in | ||||
Section 3.3. | 9. The results of the verification algorithm function are the final | |||
results of the signature verification. | ||||
If any of the above steps fail, the signature validation fails. | If any of the above steps fail, the signature validation fails. | |||
3.2.1. Enforcing Application Requirements | 3.2.1. Enforcing Application Requirements | |||
The verification requirements specified in this document are intended | The verification requirements specified in this document are intended | |||
as a baseline set of restrictions that are generally applicable to | as a baseline set of restrictions that are generally applicable to | |||
all use cases. Applications using HTTP Message Signatures MAY impose | all use cases. Applications using HTTP Message Signatures MAY impose | |||
requirements above and beyond those specified by this document, as | requirements above and beyond those specified by this document, as | |||
appropriate for their use case. | appropriate for their use case. | |||
skipping to change at page 21, line 43 ¶ | skipping to change at page 21, line 45 ¶ | |||
Authorization, Digest). | Authorization, Digest). | |||
* Enforcing a maximum signature age. | * Enforcing a maximum signature age. | |||
* Prohibiting the use of certain algorithms, or mandating the use of | * Prohibiting the use of certain algorithms, or mandating the use of | |||
an algorithm. | an algorithm. | |||
* Requiring keys to be of a certain size (e.g., 2048 bits vs. 1024 | * Requiring keys to be of a certain size (e.g., 2048 bits vs. 1024 | |||
bits). | bits). | |||
* Enforcing uniqueness of a nonce value. | ||||
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. | |||
3.3. Signature Algorithm Methods | 3.3. Signature Algorithm Methods | |||
HTTP Message signatures MAY use any cryptographic digital signature | HTTP Message signatures MAY use any cryptographic digital signature | |||
or MAC method that allows for the signing of the signature input | or MAC method that is appropriate for the key material, environment, | |||
string. This section contains several common algorithm parameters | and needs of the signer and verifier. All signatures are generated | |||
that can be communicated through the algorithm signature parameter | from and verified against the byte values of the signature input | |||
defined in Section 2.4.2, by reference to the key material, or | string defined in Section 2.5. | |||
through agreement between the signer and verifier. | ||||
Signatures are generated from and verified against the byte values of | Each signature algorithm method takes as its input the signature | |||
the signature input string defined in Section 2.5. | input string as a set of byte values ("I"), the signing key material | |||
("Ks"), and outputs the signed content as a set of byte values ("S"): | ||||
HTTP_SIGN (I, Ks) -> S | ||||
Each verification algorithm method takes as its input the | ||||
recalculated signature input string as a set of byte values ("I"), | ||||
the verification key material ("Kv"), and the presented signature to | ||||
be verified as a set of byte values ("S") and outputs the | ||||
verification result ("V") as a boolean: | ||||
HTTP_VERIFY (I, Kv, S) -> V | ||||
This section contains several common algorithm methods. The method | ||||
to use can be communicated through the algorithm signature parameter | ||||
defined in Section 2.4.2, by reference to the key material, or | ||||
through mutual agreement between the signer and verifier. | ||||
3.3.1. RSASSA-PSS using SHA-512 | 3.3.1. RSASSA-PSS using SHA-512 | |||
To sign using this algorithm, the signer applies the "RSASSA-PSS-SIGN | To sign using this algorithm, the signer applies the "RSASSA-PSS-SIGN | |||
(K, M)" function [RFC8017] with the signer's private signing key | (K, M)" function [RFC8017] with the signer's private signing key | |||
("K") and the signature input string ("M") Section 2.5. The hash | ("K") and the signature input string ("M") (Section 2.5). The hash | |||
SHA-512 [RFC6234] is applied to the signature input string to create | SHA-512 [RFC6234] is applied to the signature input string to create | |||
the digest content to which the digital signature is applied. The | the digest content to which the digital signature is applied. The | |||
resulting signed content ("S") is Base64-encoded as described in | resulting signed content byte array ("S") is the HTTP message | |||
Section 3.1. The resulting encoded value is the HTTP message | signature output used in Section 3.1. | |||
signature output. | ||||
To verify using this algorithm, the verifier applies the "RSASSA-PSS- | To verify using this algorithm, the verifier applies the "RSASSA-PSS- | |||
VERIFY ((n, e), M, S)" function [RFC8017] using the public key | VERIFY ((n, e), M, S)" function [RFC8017] using the public key | |||
material ("(n, e)"). The verifier re-creates the signature input | portion of the verification key material ("(n, e)") and the signature | |||
string ("M") from the received message, as defined in Section 2.5. | input string ("M") re-created as described in Section 3.2. The hash | |||
The hash function SHA-512 [RFC6234] is applied to the signature input | function SHA-512 [RFC6234] is applied to the signature input string | |||
string to create the digest content to which the verification | to create the digest content to which the verification function is | |||
function is applied. The verifier decodes the HTTP message signature | applied. The verifier extracts the HTTP message signature to be | |||
from Base64 as described in Section 3.2 to give the http message | verified ("S") as described in Section 3.2. The results of the | |||
signature to be verified ("S"). The results of the verification | verification function are compared to the http message signature to | |||
function are compared to the http message signature to determine if | determine if the signature presented is valid. | |||
the signature presented is valid. | ||||
3.3.2. RSASSA-PKCS1-v1_5 using SHA-256 | 3.3.2. RSASSA-PKCS1-v1_5 using SHA-256 | |||
To sign using this algorithm, the signer applies the "RSASSA- | To sign using this algorithm, the signer applies the "RSASSA- | |||
PKCS1-V1_5-SIGN (K, M)" function [RFC8017] to signer's private | PKCS1-V1_5-SIGN (K, M)" function [RFC8017] with the signer's private | |||
signing key ("K") and the signature input string ("M") Section 2.5. | signing key ("K") and the signature input string ("M") (Section 2.5). | |||
The hash SHA-256 [RFC6234] is applied to the signature input string | The hash SHA-256 [RFC6234] is applied to the signature input string | |||
to create the digest content to which the digital signature is | to create the digest content to which the digital signature is | |||
applied. The resulting signed content ("S") is Base64-encoded as | applied. The resulting signed content byte array ("S") is the HTTP | |||
described in Section 3.1. The resulting encoded value is the HTTP | message signature output used in Section 3.1. | |||
message signature output. | ||||
To verify using this algorithm, the verifier applies the "RSASSA- | To verify using this algorithm, the verifier applies the "RSASSA-PSS- | |||
PKCS1-V1_5-VERIFY ((n, e), M, S)" function [RFC8017] using the public | VERIFY ((n, e), M, S)" function [RFC8017] using the public key | |||
key material ("(n, e)"). The verifier re-creates the signature input | portion of the verification key material ("(n, e)") and the signature | |||
string ("M") from the received message, as defined in Section 2.5. | input string ("M") re-created as described in Section 3.2. The hash | |||
The hash function SHA-256 [RFC6234] is applied to the signature input | function SHA-256 [RFC6234] is applied to the signature input string | |||
string to create the digest content to which the verification | to create the digest content to which the verification function is | |||
function is applied. The verifier decodes the HTTP message signature | applied. The verifier extracts the HTTP message signature to be | |||
from Base64 as described in Section 3.2 to give the http message | verified ("S") as described in Section 3.2. The results of the | |||
signature to be verified ("S"). The results of the verification | verification function are compared to the http message signature to | |||
function are compared to the http message signature to determine if | determine if the signature presented is valid. | |||
the signature presented is valid. | ||||
3.3.3. HMAC using SHA-256 | 3.3.3. HMAC using SHA-256 | |||
To sign and verify using this algorithm, the signer applies the | To sign and verify using this algorithm, the signer applies the | |||
"HMAC" function [RFC2104] with the shared signing key ("K") and the | "HMAC" function [RFC2104] with the shared signing key ("K") and the | |||
signature input string ("text") Section 2.5. The hash function | signature input string ("text") (Section 2.5). The hash function | |||
SHA-256 [RFC6234] is applied to the signature input string to create | SHA-256 [RFC6234] is applied to the signature input string to create | |||
the digest content to which the HMAC is applied, giving the signature | the digest content to which the HMAC is applied, giving the signature | |||
result. | result. | |||
For signing, the resulting signed content is Base64-encoded as | For signing, the resulting value is the HTTP message signature output | |||
described in Section 3.1. The resulting encoded value is the HTTP | used in Section 3.1. | |||
message signature output. | ||||
For verification, the verifier decodes the HTTP message signature | For verification, the verifier extracts the HTTP message signature to | |||
from Base64 as described in Section 3.2 to give the signature to be | be verified ("S") as described in Section 3.2. The output of the | |||
compared to the output of the HMAC function. The results of the | HMAC function is compared to the value of the HTTP message signature, | |||
comparison determine the validity of the signature presented. | and the results of the comparison determine the validity of the | |||
signature presented. | ||||
3.3.4. ECDSA using curve P-256 DSS and SHA-256 | 3.3.4. ECDSA using curve P-256 DSS and SHA-256 | |||
To sign using this algorithm, the signer applies the "ECDSA" | To sign using this algorithm, the signer applies the "ECDSA" | |||
algorithm [FIPS186-4] using curve P-256 with signer's private signing | algorithm [FIPS186-4] using curve P-256 with the signer's private | |||
key and the signature input string Section 2.5. The hash function | signing key and the signature input string (Section 2.5). The hash | |||
SHA-256 [RFC6234] is applied to the signature input string to create | SHA-256 [RFC6234] is applied to the signature input string to create | |||
the digest content to which the digital signature is applied. The | the digest content to which the digital signature is applied. The | |||
resulting signed content is Base64-encoded as described in | resulting signed content byte array is the HTTP message signature | |||
Section 3.1. The resulting encoded value is the HTTP message | output used in Section 3.1. | |||
signature output. | ||||
To verify using this algorithm, the verifier applies the "ECDSA" | To verify using this algorithm, the verifier applies the "ECDSA" | |||
algorithm [FIPS186-4] using the public key material. The verifier | algorithm [FIPS186-4] using the public key portion of the | |||
re-creates the signature input string defined in Section 2.5. The | verification key material and the signature input string re-created | |||
hash function SHA-256 [RFC6234] is applied to the signature input | as described in Section 3.2. The hash function SHA-256 [RFC6234] is | |||
string to create the digest content to which the verification | applied to the signature input string to create the digest content to | |||
function is applied. The verifier decodes the HTTP message signature | which the verification function is applied. The verifier extracts | |||
from Base64 as described in Section 3.2 to give the signature to be | the HTTP message signature to be verified ("S") as described in | |||
verified. The results of the verification function are compared to | Section 3.2. The results of the verification function are compared | |||
the http message signature to determine if the signature presented is | to the http message signature to determine if the signature presented | |||
valid. | is valid. | |||
3.3.5. JSON Web Signature (JWS) algorithms | 3.3.5. JSON Web Signature (JWS) algorithms | |||
If the signing algorithm is a JOSE signing algorithm from the JSON | If the signing algorithm is a JOSE signing algorithm from the JSON | |||
Web Signature and Encryption Algorithms Registry established by | Web Signature and Encryption Algorithms Registry established by | |||
[RFC7518], the JWS algorithm definition determines the signature and | [RFC7518], the JWS algorithm definition determines the signature and | |||
hashing algorithms to apply for both signing and verification. | hashing algorithms to apply for both signing and verification. There | |||
is no use of the explicit "alg" signature parameter when using JOSE | ||||
signing algorithms. | ||||
For both signing and verification, the HTTP messages signature input | For both signing and verification, the HTTP messages signature input | |||
string Section 2.5 is used as the entire "JWS Signing Input". The | string (Section 2.5) is used as the entire "JWS Signing Input". The | |||
JWS Header defined in [RFC7517] is not used, nor is the input string | JOSE Header defined in [RFC7517] is not used, and the signature input | |||
first encoded in Base64 before applying the algorithm. | string is not first encoded in Base64 before applying the algorithm. | |||
The output of the JWS signature is taken as a byte array prior to the | ||||
Base64url encoding used in JOSE. | ||||
The JWS algorithm MUST NOT be "none" and MUST NOT be any algorithm | The JWS algorithm MUST NOT be "none" and MUST NOT be any algorithm | |||
with a JOSE Implementation Requirement of "Prohibited". | with a JOSE Implementation Requirement of "Prohibited". | |||
4. Including a Message Signature in a Message | 4. Including a Message Signature in a Message | |||
Message signatures can be included within an HTTP message via the | Message signatures can be included within an HTTP message via the | |||
"Signature-Input" and "Signature" HTTP header fields, both defined | "Signature-Input" and "Signature" HTTP header fields, both defined | |||
within this specification. The "Signature" HTTP header field | within this specification. | |||
contains signature values, while the "Signature-Input" HTTP header | ||||
field identifies the Covered Content and metadata that describe how | An HTTP message signature MUST use both headers: the "Signature" HTTP | |||
each signature was generated. | header field contains the signature value, while the "Signature- | |||
Input" HTTP header field identifies the covered content and | ||||
parameters that describe how the signature was generated. The Each | ||||
header MAY contain multiple labeled values, where the labels | ||||
determine the correlation between the "Signature" and "Signature- | ||||
Input" fields. | ||||
4.1. The 'Signature-Input' HTTP Header | 4.1. The 'Signature-Input' HTTP Header | |||
The "Signature-Input" HTTP header field is a Dictionary Structured | The "Signature-Input" HTTP header field is a Dictionary Structured | |||
Header [RFC8941] containing the metadata for zero or more message | Header [RFC8941] containing the metadata for one or more message | |||
signatures generated from content within the HTTP message. Each | signatures generated from content within the HTTP message. Each | |||
member describes a single message signature. The member's name is an | member describes a single message signature. The member's name is an | |||
identifier that uniquely identifies the message signature within the | identifier that uniquely identifies the message signature within the | |||
context of the HTTP message. The member's value is the serialization | context of the HTTP message. The member's value is the serialization | |||
of the covered content including all signature metadata parameters, | of the covered content including all signature metadata parameters, | |||
using the serialization process defined in Section 2.4.2. | using the serialization process defined in Section 2.4.2. | |||
# NOTE: '\' line wrapping per RFC 8792 | Signature-Input: sig1=("@request-target" "host" "date" "cache-control" \ | |||
Signature-Input: sig1=("@request-target" "host" "date" | "x-empty-header" "x-example");created=1618884475;\ | |||
"cache-control" "x-empty-header" "x-example"); keyid="test-key-a"; | keyid="test-key-rsa-pss" | |||
alg="rsa-pss-sha512"; created=1402170695; expires=1402170995 | ||||
To facilitate signature validation, the "Signature-Input" header MUST | To facilitate signature validation, the "Signature-Input" header | |||
contain the same serialization value used in generating the signature | value MUST contain the same serialized value used in generating the | |||
input. | signature input string's "@signature-params" value. | |||
4.2. The 'Signature' HTTP Header | 4.2. The 'Signature' HTTP Header | |||
The "Signature" HTTP header field is a Dictionary Structured Header | The "Signature" HTTP header field is a Dictionary Structured Header | |||
[RFC8941] containing zero or more message signatures generated from | [RFC8941] containing one or more message signatures generated from | |||
content within the HTTP message. Each member's name is a signature | content within the HTTP message. Each member's name is a signature | |||
identifier that is present as a member name in the "Signature-Input" | identifier that is present as a member name in the "Signature-Input" | |||
Structured Header within the HTTP message. Each member's value is a | Structured Header within the HTTP message. Each member's value is a | |||
Byte Sequence containing the signature value for the message | Byte Sequence containing the signature value for the message | |||
signature identified by the member name. Any member in the | signature identified by the member name. Any member in the | |||
"Signature" HTTP header field that does not have a corresponding | "Signature" HTTP header field that does not have a corresponding | |||
member in the HTTP message's "Signature-Input" HTTP header field MUST | member in the HTTP message's "Signature-Input" HTTP header field MUST | |||
be ignored. | be ignored. | |||
# NOTE: '\' line wrapping per RFC 8792 | Signature: sig1=:H00a6KdNCRWgOWBMvuRtxh6c/wrVxwt2p5KyqBJqmtPbNTd980hWwk\ | |||
Signature: sig1=:K2qGT5srn2OGbOIDzQ6kYT+ruaycnDAAUpKv+ePFfD0RAxn/1BUe\ | UE6H4NWiTs5f2Ef0qJ3iypXT2bR9Pc+PVU9U2gAzTcZKK8MDJLjYKfaE835zg/9sOdGR+\ | |||
Zx/Kdrq32DrfakQ6bPsvB9aqZqognNT6be4olHROIkeV879RrsrObury8L9SCEibe\ | tlRJ1cbCoWMVoCgEPi4t6QewbI0xgdx8AmP5ItTunYmhe8G0JR42lfvz60+szb8SpwJEm\ | |||
oHyqU/yCjphSmEdd7WD+zrchK57quskKwRefy2iEC5S2uAH0EPyOZKWlvbKmKu5q4\ | kMPr5dBOz6DLEeM3IgKNoBlJPp94WSJkgvwTM64rXw049ZkYenl9jwKlcXEmA1a4MNWoU\ | |||
CaB8X/I5/+HLZLGvDiezqi6/7p2Gngf5hwZ0lSdy39vyNMaaAT0tKo6nuVw0S1MVg\ | Elr6eh5k20djMZftCYTPUUPMxZUavcQy+cp6lfKonz6HIDe3+n3VOTOo8uu1aSVfKQQzR\ | |||
1Q7MpWYZs0soHjttq0uLIA3DIbQfLiIvK6/l0BdWTU7+2uQj7lBkQAsFZHoA96ZZg\ | +ZEwSaZQBrdQ==: | |||
FquQrXRlmYOh+Hx5D9fJkXcXe5tmAg==: | ||||
4.3. Examples | 4.3. Multiple Signatures | |||
The following is a non-normative example of "Signature-Input" and | Since "Signature-Input" and "Signature" are both defined as | |||
"Signature" HTTP header fields representing the signature in | Dictionary Structured Headers, they can be used to include multiple | |||
Figure 2: | signatures within the same HTTP message. For example, a signer may | |||
include multiple signatures signing the same content with different | ||||
keys 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, including a | ||||
signature over those fields and the client's original signature. | ||||
# NOTE: '\' line wrapping per RFC 8792 | The following is a non-normative example of header fields a reverse | |||
proxy in addition to the examples in the previous sections. The | ||||
original signature is included under the identifier "sig1", and the | ||||
reverse proxy's signature is included under "proxy_sig". The proxy | ||||
uses the key "rsa-test-key" to create its signature using the "rsa- | ||||
v1_5-sha256" signature value. This results in a signature input | ||||
string of: | ||||
Signature-Input: sig1=("@request-target" "host" "date" | "signature";key="sig1": :H00a6KdNCRWgOWBMvuRtxh6c/wrVxwt2p5KyqBJqmtPbNT\ | |||
"cache-control" "x-empty-header" "x-example"); keyid="test-key-a"; | d980hWwkUE6H4NWiTs5f2Ef0qJ3iypXT2bR9Pc+PVU9U2gAzTcZKK8MDJLjYKfaE835zg\ | |||
alg="rsa-pss-sha512"; created=1402170695; expires=1402170995 | /9sOdGR+tlRJ1cbCoWMVoCgEPi4t6QewbI0xgdx8AmP5ItTunYmhe8G0JR42lfvz60+sz\ | |||
Signature: sig1=:K2qGT5srn2OGbOIDzQ6kYT+ruaycnDAAUpKv+ePFfD0RAxn/1BUe\ | b8SpwJEmkMPr5dBOz6DLEeM3IgKNoBlJPp94WSJkgvwTM64rXw049ZkYenl9jwKlcXEmA\ | |||
Zx/Kdrq32DrfakQ6bPsvB9aqZqognNT6be4olHROIkeV879RrsrObury8L9SCEibe\ | 1a4MNWoUElr6eh5k20djMZftCYTPUUPMxZUavcQy+cp6lfKonz6HIDe3+n3VOTOo8uu1a\ | |||
oHyqU/yCjphSmEdd7WD+zrchK57quskKwRefy2iEC5S2uAH0EPyOZKWlvbKmKu5q4\ | SVfKQQzR+ZEwSaZQBrdQ==: | |||
CaB8X/I5/+HLZLGvDiezqi6/7p2Gngf5hwZ0lSdy39vyNMaaAT0tKo6nuVw0S1MVg\ | x-forwarded-for: 192.0.2.123 | |||
1Q7MpWYZs0soHjttq0uLIA3DIbQfLiIvK6/l0BdWTU7+2uQj7lBkQAsFZHoA96ZZg\ | "@signature-params": ("signature";key="sig1" x-forwarded-for)\ | |||
FquQrXRlmYOh+Hx5D9fJkXcXe5tmAg==: | ;created=1618884475;keyid="test-key-rsa";alg="rsa-v1_5-sha256" | |||
Since "Signature-Input" and "Signature" are both defined as | And a signature output value of: | |||
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: | ||||
# NOTE: '\' line wrapping per RFC 8792 | :NgQsRJwOL/EgoRXdcmHMOLZM+KWqLDsO76CrqoiLH279VJs9Fj6bn4V+perAEUbHBEMFCb\ | |||
l6tucEVgKrU+5IIyDMBI85FExQeuBrNPALczjCdxne6LUoBcWBAk8NoRyjfd++DXIAjAZcf\ | ||||
/hBUXLll+5veI0ynzBRFTZ4v8AbluYODjJlSprYEwUb2ndbFr12vzgIpy0uTQCslN+3rUUZ\ | ||||
+lQWlrILvbR0CIvtGwk2+hE0dTRAG0R3wmlR24mhSqiE5RADyoSWQVjVxntp98XHAB6MZE9\ | ||||
2bbu2a8Uo951Hvah03XHWEk/WiYdq+mt3hwXVPLXlBU9DWCo2AaYD/rkXtQ==: | ||||
These values are added to the HTTP request message by the proxy. The | ||||
different signature values are wrapped onto separate lines to | ||||
increase human-readability of the result. | ||||
X-Forwarded-For: 192.0.2.123 | X-Forwarded-For: 192.0.2.123 | |||
Signature-Input: reverse_proxy_sig=("host" "date" | Signature-Input: sig1=("@request-target" "host" "date" "cache-control" \ | |||
"signature";key=sig1 "x-forwarded-for"); keyid="test-key-a"; | "x-empty-header" "x-example");created=1618884475\ | |||
alg="rsa-pss-sha512"; created=1402170695; expires=1402170695 | ;keyid="test-key-rsa-pss", \ | |||
Signature: reverse_proxy_sig=:ON3HsnvuoTlX41xfcGWaOEVo1M3bJDRBOp0Pc/O\ | proxy_sig=("signature";key="sig1" x-forwarded-for);created=1618884480\ | |||
jAOWKQn0VMY0SvMMWXS7xG+xYVa152rRVAo6nMV7FS3rv0rR5MzXL8FCQ2A35DCEN\ | ;keyid="test-key-rsa";alg="rsa-v1_5-sha256" | |||
LOhEgj/S1IstEAEFsKmE9Bs7McBsCtJwQ3hMqdtFenkDffSoHOZOInkTYGafkoy78\ | Signature: sig1=:H00a6KdNCRWgOWBMvuRtxh6c/wrVxwt2p5KyqBJqmtPbNTd980hWwk\ | |||
l1VZvmb3Y4yf7McJwAvk2R3gwKRWiiRCw448Nt7JTWzhvEwbh7bN2swc/v3NJbg/w\ | UE6H4NWiTs5f2Ef0qJ3iypXT2bR9Pc+PVU9U2gAzTcZKK8MDJLjYKfaE835zg/9sOdG\ | |||
JYyYVbelZx4IywuZnYFxgPl/qvqbAjeEVvaLKLgSMr11y+uzxCHoMnDUnTYhMrmOT\ | R+tlRJ1cbCoWMVoCgEPi4t6QewbI0xgdx8AmP5ItTunYmhe8G0JR42lfvz60+szb8Sp\ | |||
4O8lBLfRFOcoJPKBdoKg9U0a96U2mUug1bFOozEVYFg==: | wJEmkMPr5dBOz6DLEeM3IgKNoBlJPp94WSJkgvwTM64rXw049ZkYenl9jwKlcXEmA1a\ | |||
4MNWoUElr6eh5k20djMZftCYTPUUPMxZUavcQy+cp6lfKonz6HIDe3+n3VOTOo8uu1a\ | ||||
SVfKQQzR+ZEwSaZQBrdQ==:, \ | ||||
proxy_sig=:NgQsRJwOL/EgoRXdcmHMOLZM+KWqLDsO76CrqoiLH279VJs9Fj6bn4V+pe\ | ||||
rAEUbHBEMFCbl6tucEVgKrU+5IIyDMBI85FExQeuBrNPALczjCdxne6LUoBcWBAk8No\ | ||||
Ryjfd++DXIAjAZcf/hBUXLll+5veI0ynzBRFTZ4v8AbluYODjJlSprYEwUb2ndbFr12\ | ||||
vzgIpy0uTQCslN+3rUUZ+lQWlrILvbR0CIvtGwk2+hE0dTRAG0R3wmlR24mhSqiE5RA\ | ||||
DyoSWQVjVxntp98XHAB6MZE92bbu2a8Uo951Hvah03XHWEk/WiYdq+mt3hwXVPLXlBU\ | ||||
9DWCo2AaYD/rkXtQ==: | ||||
The proxy's signature and the client's original signature can be | ||||
verified independently for the same message, depending on the needs | ||||
of the application. | ||||
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 | |||
skipping to change at page 27, line 34 ¶ | skipping to change at page 28, line 34 ¶ | |||
Algorithm Name: | Algorithm Name: | |||
"rsa-pss-sha512" | "rsa-pss-sha512" | |||
Status: | Status: | |||
Active | Active | |||
Definition: | Definition: | |||
RSASSA-PSS using SHA-256 | RSASSA-PSS using SHA-256 | |||
Specification document(s): | Specification document(s): | |||
[[This document]] Section 3.3.1 | [[This document]], Section 3.3.1 | |||
5.1.2.2. rsa-v1_5-sha256 | 5.1.2.2. rsa-v1_5-sha256 | |||
Algorithm Name: | Algorithm Name: | |||
"rsa-v1_5-sha256" | "rsa-v1_5-sha256" | |||
Status: | Status: | |||
Active | Active | |||
Description: | Description: | |||
RSASSA-PKCS1-v1_5 using SHA-256 | RSASSA-PKCS1-v1_5 using SHA-256 | |||
Specification document(s): | Specification document(s): | |||
[[This document]] Section 3.3.2 | [[This document]], Section 3.3.2 | |||
5.1.2.3. hmac-sha256 | 5.1.2.3. hmac-sha256 | |||
Algorithm Name: | Algorithm Name: | |||
"hmac-sha256" | "hmac-sha256" | |||
Status: | Status: | |||
Active | Active | |||
Description: | Description: | |||
HMAC using SHA-256 | HMAC using SHA-256 | |||
Specification document(s): | Specification document(s): | |||
[[This document]] Section 3.3.3 | [[This document]], Section 3.3.3 | |||
5.1.2.4. ecdsa-p256-sha256 | 5.1.2.4. ecdsa-p256-sha256 | |||
Algorithm Name: | Algorithm Name: | |||
"ecdsa-p256-sha256" | "ecdsa-p256-sha256" | |||
Status: | Status: | |||
Active | Active | |||
Description: | Description: | |||
ECDSA using curve P-256 DSS and SHA-256 | ECDSA using curve P-256 DSS and SHA-256 | |||
Specification document(s): | Specification document(s): | |||
[[This document]] Section 3.3.4 | [[This document]], Section 3.3.4 | |||
5.2. HTTP Signature Metadata Parameters Registry | 5.2. HTTP Signature Metadata Parameters Registry | |||
This document defines the "Signature-Input" Structured Header, whose | This document defines the "Signature-Input" Structured Header, whose | |||
member values may have parameters containing metadata about a message | member values may have parameters containing metadata about a message | |||
signature. IANA is asked to create and maintain a new registry | signature. IANA is asked to create and maintain a new registry | |||
titled "HTTP Signature Metadata Parameters" to record and maintain | titled "HTTP Signature Metadata Parameters" to record and maintain | |||
the set of parameters defined for use with member values in the | the set of parameters defined for use with member values in the | |||
"Signature-Input" Structured Header. Initial values for this | "Signature-Input" Structured Header. Initial values for this | |||
registry are given in Section 5.2.2. Future assignments and | registry are given in Section 5.2.2. Future assignments and | |||
skipping to change at page 29, line 16 ¶ | skipping to change at page 30, line 16 ¶ | |||
| Name | Status | Reference(s) | | | Name | Status | Reference(s) | | |||
+=========+========+================================+ | +=========+========+================================+ | |||
| alg | Active | Section 2.4.2 of this document | | | alg | Active | Section 2.4.2 of this document | | |||
+---------+--------+--------------------------------+ | +---------+--------+--------------------------------+ | |||
| created | Active | Section 2.4.2 of this document | | | created | Active | Section 2.4.2 of this document | | |||
+---------+--------+--------------------------------+ | +---------+--------+--------------------------------+ | |||
| expires | Active | Section 2.4.2 of this document | | | expires | Active | Section 2.4.2 of this document | | |||
+---------+--------+--------------------------------+ | +---------+--------+--------------------------------+ | |||
| keyid | Active | Section 2.4.2 of this document | | | keyid | Active | Section 2.4.2 of this document | | |||
+---------+--------+--------------------------------+ | +---------+--------+--------------------------------+ | |||
| nonce | Active | Section 2.4.2 of this document | | ||||
+---------+--------+--------------------------------+ | ||||
Table 7: Initial contents of the HTTP Signature | Table 5: Initial contents of the HTTP Signature | |||
Metadata Parameters Registry. | Metadata Parameters Registry. | |||
5.3. HTTP Signature Specialty Content Identifiers Registry | 5.3. HTTP Signature Specialty Content Identifiers Registry | |||
This document defines a method for canonicalizing HTTP message | This document defines a method for canonicalizing HTTP message | |||
content, including content that can be generated from the context of | content, including content that can be generated from the context of | |||
the HTTP message outside of the HTTP headers. This content is | the HTTP message outside of the HTTP headers. This content is | |||
identified by a unique key. IANA is asked to create and maintain a | identified by a unique key. IANA is asked to create and maintain a | |||
new registry typed "HTTP Signature Specialty Content Identifiers" to | new registry typed "HTTP Signature Specialty Content Identifiers" to | |||
record and maintain the set of non-header content identifiers and | record and maintain the set of non-header content identifiers and | |||
skipping to change at page 29, line 49 ¶ | skipping to change at page 30, line 51 ¶ | |||
Specialty Content Identifiers Registry. | Specialty Content Identifiers Registry. | |||
+===================+========+================================+ | +===================+========+================================+ | |||
| Name | Status | Reference(s) | | | Name | Status | Reference(s) | | |||
+===================+========+================================+ | +===================+========+================================+ | |||
| @request-target | Active | Section 2.4.1 of this document | | | @request-target | Active | Section 2.4.1 of this document | | |||
+-------------------+--------+--------------------------------+ | +-------------------+--------+--------------------------------+ | |||
| @signature-params | Active | Section 2.4.2 of this document | | | @signature-params | Active | Section 2.4.2 of this document | | |||
+-------------------+--------+--------------------------------+ | +-------------------+--------+--------------------------------+ | |||
Table 8: Initial contents of the HTTP Signature Specialty | Table 6: Initial contents of the HTTP Signature Specialty | |||
Content Identifiers Registry. | Content Identifiers 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. )) | |||
skipping to change at page 31, line 26 ¶ | skipping to change at page 32, line 26 ¶ | |||
<https://www.rfc-editor.org/rfc/rfc8941>. | <https://www.rfc-editor.org/rfc/rfc8941>. | |||
[SEMANTICS] | [SEMANTICS] | |||
Fielding, R., Ed. and J. Reschke, Ed., "Hypertext Transfer | Fielding, R., Ed. and J. Reschke, Ed., "Hypertext Transfer | |||
Protocol (HTTP/1.1): Semantics and Content", RFC 7231, | Protocol (HTTP/1.1): Semantics and Content", RFC 7231, | |||
DOI 10.17487/RFC7231, June 2014, | DOI 10.17487/RFC7231, June 2014, | |||
<https://www.rfc-editor.org/rfc/rfc7231>. | <https://www.rfc-editor.org/rfc/rfc7231>. | |||
7.2. Informative References | 7.2. Informative References | |||
[RFC4648] Josefsson, S., "The Base16, Base32, and Base64 Data | ||||
Encodings", RFC 4648, DOI 10.17487/RFC4648, October 2006, | ||||
<https://www.rfc-editor.org/rfc/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/rfc/rfc6234>. | <https://www.rfc-editor.org/rfc/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/rfc/rfc7239>. | <https://www.rfc-editor.org/rfc/rfc7239>. | |||
[RFC7517] Jones, M., "JSON Web Key (JWK)", RFC 7517, | [RFC7517] Jones, M., "JSON Web Key (JWK)", RFC 7517, | |||
skipping to change at page 32, line 43 ¶ | skipping to change at page 33, line 38 ¶ | |||
interpreted in the context of this draft. | interpreted in the context of this draft. | |||
Appendix B. Examples | Appendix B. Examples | |||
B.1. Example Keys | B.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. | |||
The key identifiers for each key are used throughout the examples in | ||||
this specification. It is assumed for these examples that the signer | ||||
and verifier can unambiguously dereference all key identifiers used | ||||
here, and that the keys and algorithms used are appropriate for the | ||||
context in which the signature is presented. | ||||
B.1.1. Example Key RSA test | B.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, | |||
referred to in this document as "test-key-rsa": | ||||
-----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 | |||
-----END RSA PUBLIC KEY----- | -----END RSA PUBLIC KEY----- | |||
skipping to change at page 33, line 42 ¶ | skipping to change at page 34, 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----- | |||
B.2. Example keyid Values | B.1.2. Example Key RSA PSS test | |||
The table below maps example "keyid" values to associated algorithms | The following key is a 2048-bit RSA public and private key pair, | |||
and/or keys. These are example mappings that are valid only within | referred to in this document as "test-key-rsa-pss": | |||
the context of examples in examples within this and future documents | ||||
that reference this section. Unless otherwise specified, within the | ||||
context of examples it should be assumed that the signer and verifier | ||||
understand these "keyid" mappings. These "keyid" values are not | ||||
reserved, and deployments are free to use them, with these | ||||
associations or others. | ||||
+============+=================+==========================+ | -----BEGIN PUBLIC KEY----- | |||
| keyid | Algorithm | Verification Key | | MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAr4tmm3r20Wd/PbqvP1s2 | |||
+============+=================+==========================+ | +QEtvpuRaV8Yq40gjUR8y2Rjxa6dpG2GXHbPfvMs8ct+Lh1GH45x28Rw3Ry53mm+ | |||
| test-key-a | rsa-pss-sha512 | The public key specified | | oAXjyQ86OnDkZ5N8lYbggD4O3w6M6pAvLkhk95AndTrifbIFPNU8PPMO7OyrFAHq | |||
| | | in Appendix B.1.1 | | gDsznjPFmTOtCEcN2Z1FpWgchwuYLPL+Wokqltd11nqqzi+bJ9cvSKADYdUAAN5W | |||
+------------+-----------------+--------------------------+ | Utzdpiy6LbTgSxP7ociU4Tn0g5I6aDZJ7A8Lzo0KSyZYoA485mqcO0GVAdVw9lq4 | |||
| test-key-b | rsa-v1_5-sha256 | The public key specified | | aOT9v6d+nb4bnNkQVklLQ3fVAvJm+xdDOp9LCNCN48V2pnDOkFV6+U9nV5oyc6XI | |||
| | | in Appendix B.1.1 | | 2wIDAQAB | |||
+------------+-----------------+--------------------------+ | -----END PUBLIC KEY----- | |||
Table 9 | -----BEGIN PRIVATE KEY----- | |||
MIIEvgIBADALBgkqhkiG9w0BAQoEggSqMIIEpgIBAAKCAQEAr4tmm3r20Wd/Pbqv | ||||
P1s2+QEtvpuRaV8Yq40gjUR8y2Rjxa6dpG2GXHbPfvMs8ct+Lh1GH45x28Rw3Ry5 | ||||
3mm+oAXjyQ86OnDkZ5N8lYbggD4O3w6M6pAvLkhk95AndTrifbIFPNU8PPMO7Oyr | ||||
FAHqgDsznjPFmTOtCEcN2Z1FpWgchwuYLPL+Wokqltd11nqqzi+bJ9cvSKADYdUA | ||||
AN5WUtzdpiy6LbTgSxP7ociU4Tn0g5I6aDZJ7A8Lzo0KSyZYoA485mqcO0GVAdVw | ||||
9lq4aOT9v6d+nb4bnNkQVklLQ3fVAvJm+xdDOp9LCNCN48V2pnDOkFV6+U9nV5oy | ||||
c6XI2wIDAQABAoIBAQCUB8ip+kJiiZVKF8AqfB/aUP0jTAqOQewK1kKJ/iQCXBCq | ||||
pbo360gvdt05H5VZ/RDVkEgO2k73VSsbulqezKs8RFs2tEmU+JgTI9MeQJPWcP6X | ||||
aKy6LIYs0E2cWgp8GADgoBs8llBq0UhX0KffglIeek3n7Z6Gt4YFge2TAcW2WbN4 | ||||
XfK7lupFyo6HHyWRiYHMMARQXLJeOSdTn5aMBP0PO4bQyk5ORxTUSeOciPJUFktQ | ||||
HkvGbym7KryEfwH8Tks0L7WhzyP60PL3xS9FNOJi9m+zztwYIXGDQuKM2GDsITeD | ||||
2mI2oHoPMyAD0wdI7BwSVW18p1h+jgfc4dlexKYRAoGBAOVfuiEiOchGghV5vn5N | ||||
RDNscAFnpHj1QgMr6/UG05RTgmcLfVsI1I4bSkbrIuVKviGGf7atlkROALOG/xRx | ||||
DLadgBEeNyHL5lz6ihQaFJLVQ0u3U4SB67J0YtVO3R6lXcIjBDHuY8SjYJ7Ci6Z6 | ||||
vuDcoaEujnlrtUhaMxvSfcUJAoGBAMPsCHXte1uWNAqYad2WdLjPDlKtQJK1diCm | ||||
rqmB2g8QE99hDOHItjDBEdpyFBKOIP+NpVtM2KLhRajjcL9Ph8jrID6XUqikQuVi | ||||
4J9FV2m42jXMuioTT13idAILanYg8D3idvy/3isDVkON0X3UAVKrgMEne0hJpkPL | ||||
FYqgetvDAoGBAKLQ6JZMbSe0pPIJkSamQhsehgL5Rs51iX4m1z7+sYFAJfhvN3Q/ | ||||
OGIHDRp6HjMUcxHpHw7U+S1TETxePwKLnLKj6hw8jnX2/nZRgWHzgVcY+sPsReRx | ||||
NJVf+Cfh6yOtznfX00p+JWOXdSY8glSSHJwRAMog+hFGW1AYdt7w80XBAoGBAImR | ||||
NUugqapgaEA8TrFxkJmngXYaAqpA0iYRA7kv3S4QavPBUGtFJHBNULzitydkNtVZ | ||||
3w6hgce0h9YThTo/nKc+OZDZbgfN9s7cQ75x0PQCAO4fx2P91Q+mDzDUVTeG30mE | ||||
t2m3S0dGe47JiJxifV9P3wNBNrZGSIF3mrORBVNDAoGBAI0QKn2Iv7Sgo4T/XjND | ||||
dl2kZTXqGAk8dOhpUiw/HdM3OGWbhHj2NdCzBliOmPyQtAr770GITWvbAI+IRYyF | ||||
S7Fnk6ZVVVHsxjtaHy1uJGFlaZzKR4AGNaUTOJMs6NadzCmGPAxNQQOCqoUjn4XR | ||||
rOjr9w349JooGXhOxbu8nOxX | ||||
-----END PRIVATE KEY----- | ||||
B.3. Test Cases | B.2. 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, 20 Apr 2021 02:07:55 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"} | |||
B.3.1. Signature Verification | B.2.1. Minimal Signature Header using rsa-pss-sha512 | |||
B.3.1.1. Minimal Signature Header using rsa-pss-sha512 | This example presents a minimal "Signature-Input" and "Signature" | |||
header for a signature using the "rsa-pss-sha512" algorithm, covering | ||||
none of the content of the HTTP message request but providing a | ||||
timestamped signature proof of possession of the key. | ||||
This presents a minimal "Signature-Input" and "Signature" header for | The corresponding signature input is: | |||
a signature using the "rsa-pss-sha512" algorithm: | ||||
# NOTE: '\' line wrapping per RFC 8792 | "@signature-params": ();created=1618884475;keyid="test-key-rsa-pss"\ | |||
;alg="rsa-pss-sha512" | ||||
Signature: sig1=("date"); alg="rsa-pss-sha512"; keyid="test-key-b" | This results in the following "Signature-Input" and "Signature" | |||
Signature: sig1=:HtXycCl97RBVkZi66ADKnC9c5eSSlb57GnQ4KFqNZplOpNfxqk62\ | headers being added to the message: | |||
JzZ484jXgLvoOTRaKfR4hwyxlcyb+BWkVasApQovBSdit9Ml/YmN2IvJDPncrlhPD\ | ||||
VDv36Z9/DiSO+RNHD7iLXugdXo1+MGRimW1RmYdenl/ITeb7rjfLZ4b9VNnLFtVWw\ | ||||
rjhAiwIqeLjodVImzVc5srrk19HMZNuUejK6I3/MyN3+3U8tIRW4LWzx6ZgGZUaEE\ | ||||
P0aBlBkt7Fj0Tt5/P5HNW/Sa/m8smxbOHnwzAJDa10PyjzdIbywlnWIIWtZKPPsoV\ | ||||
oKVopUWEU3TNhpWmaVhFrUL/O6SN3w==: | ||||
The corresponding signature metadata derived from this header field | Signature-Input: sig1=();created=1618884475;keyid="test-key-rsa-pss"\ | |||
is: | ;alg="rsa-pss-sha512" | |||
Signature: sig1=:qGKjr1213+iZCU1MCV8w2NTr/HvMGWYDzpqAWx7SrPE1y6gOkIQ3k2\ | ||||
GlZDu9KnKnLN6LKX0JRa2M5vU9v/b0GjV0WSInMMKQJExJ/e9Y9K8q2eE0G9saGebEaWd\ | ||||
R3Ao47odxLh95hBtejKIdiUBmQcQSAzAkoQ4aOZgvrHgkmvQDZQL0w30+8lMz3VglmN73\ | ||||
CKp/ijZemO1iPdNwrdhAtDvj9OdFVJ/wiUECfU78aQWkQocvwrZXTmHCX9BMVUHGneXMY\ | ||||
NQ0Y8umEHjxpnnLLvxUbw2KZrflp+l6m7WlhwXGJ15eAt1+mImanxUCtaKQJvEfcnOQ0S\ | ||||
2jHysSRLheTA==: | ||||
+===========================+==========================+ | B.2.2. Header Coverage | |||
| Property | Value | | ||||
+===========================+==========================+ | ||||
| Algorithm | rsa-pss-sha512 | | ||||
+---------------------------+--------------------------+ | ||||
| Covered Content | date | | ||||
+---------------------------+--------------------------+ | ||||
| Creation Time | Undefined | | ||||
+---------------------------+--------------------------+ | ||||
| Expiration Time | Undefined | | ||||
+---------------------------+--------------------------+ | ||||
| Verification Key Material | The public key specified | | ||||
| | in Appendix B.1.1. | | ||||
+---------------------------+--------------------------+ | ||||
Table 10 | This example covers all the specified headers in the example message. | |||
The corresponding Signature Input is: | The corresponding signature input is: | |||
"date": Tue, 07 Jun 2014 20:51:35 GMT | "host": example.com | |||
"@signature-params": ("date"); alg="rsa-pss-sha512"; keyid="test-key-b" | "date": Tue, 20 Apr 2021 02:07:55 GMT | |||
"content-type": application/json | ||||
"@signature-params": ("host" "date" "content-type");created=1618884475\ | ||||
;keyid="test-key-rsa-pss" | ||||
This results in the following "Signature-Input" and "Signature" | ||||
headers being added to the message: | ||||
Signature-Input: sig1=("host" "date" "content-type");created=1618884475\ | ||||
;keyid="test-key-rsa-pss" | ||||
Signature: sig1=:NtIKWuXjr4SBEXj97gbick4O95ff378I0CZOa2VnIeEXZ1itzAdqTp\ | ||||
SvG91XYrq5CfxCmk8zz1Zg7ZGYD+ngJyVn805r73rh2eFCPO+ZXDs45Is/Ex8srzGC9sf\ | ||||
VZfqeEfApRFFe5yXDmANVUwzFWCEnGM6+SJVmWl1/jyEn45qA6Hw+ZDHbrbp6qvD4N0S9\ | ||||
2jlPyVVEh/SmCwnkeNiBgnbt+E0K5wCFNHPbo4X1Tj406W+bTtnKzaoKxBWKW8aIQ7rg9\ | ||||
2zqE1oqBRjqtRi5/Q6P5ZYYGGINKzNyV3UjZtxeZNnNJ+MAnWS0mofFqcZHVgSU/1wUzP\ | ||||
7MhzOKLca1Yg==: | ||||
B.2.3. Full Coverage | ||||
This example covers all headers in the example message plus the | ||||
request target and message body digest. | ||||
The corresponding signature input is: | ||||
"@request-target": post /foo?param=value&pet=dog | ||||
"host": example.com | ||||
"date": Tue, 20 Apr 2021 02:07:55 GMT | ||||
"content-type": application/json | ||||
"digest": SHA-256=X48E9qOokqqrvdts8nOJRJN3OWDUoyWxBf7kbu9DBPE= | ||||
"content-length": 18 | ||||
"@signature-params": ("@request-target" "host" "date" "content-type" \ | ||||
"digest" "content-length");created=1618884475\ | ||||
;keyid="test-key-rsa-pss" | ||||
This results in the following "Signature-Input" and "Signature" | ||||
headers being added to the message: | ||||
Signature-Input: sig1=("@request-target" "host" "date" "content-type" \ | ||||
"digest" "content-length");created=1618884475\ | ||||
;keyid="test-key-rsa-pss" | ||||
Signature: sig1=:QNPZtqAGWN1YMtsLJ1oyQMLg9TuIwjsIBESTo1/YXUsG+6Sl1uKUdT\ | ||||
e9xswwrc3Ui3gUd4/tLv48NGih2TRDc1AWbEQDuy6pjroxSPtFjquubqzbszxit1arPNh\ | ||||
ONnyR/8yuIh3bOXfc/NYJ3KLNaWR6MKrGinCYKTNwrX/0V67EMdSgd5HHnW5xHFgKfRCj\ | ||||
rG3ncV+jbaeSPJ8e96RZgr8slcdwmqXdiwiIBCQDKRIQ3U2muJWvxyjV/IYhCTwAXJaUz\ | ||||
sQPKzR5QWelXEVdHyv4WIB2lKaYh7mAsz0/ANxFYRRSp2Joms0OAnIAFX9kKCSp4p15/Q\ | ||||
8L9vSIGNpQtw==: | ||||
Acknowledgements | Acknowledgements | |||
This specification was initially based on the draft-cavage-http- | This specification was initially based on the draft-cavage-http- | |||
signatures internet draft. The editors would like to thank the | signatures internet draft. The editors would like to thank the | |||
authors of that draft, Mark Cavage and Manu Sporny, for their work on | authors of that draft, Mark Cavage and Manu Sporny, for their work on | |||
that draft and their continuing contributions. | that draft and their continuing contributions. | |||
The editor would also like to thank the following individuals for | The editors would also like to thank the following individuals for | |||
feedback on and implementations of the draft-cavage-http-signatures | feedback, insight, and implementation of this draft and its | |||
draft (in alphabetical order): Mark Adamcin, Mark Allen, Paul | predecessors (in alphabetical order): Mark Adamcin, Mark Allen, Paul | |||
Annesley, Karl Boehlmark, Stephane Bortzmeyer, Sarven Capadisli, Liam | Annesley, Karl Boehlmark, Stephane Bortzmeyer, Sarven Capadisli, Liam | |||
Dennehy, ductm54, Stephen Farrell, Phillip Hallam-Baker, Eric Holmes, | Dennehy, ductm54, Stephen Farrell, Phillip Hallam-Baker, Eric Holmes, | |||
Andrey Kislyuk, Adam Knight, Dave Lehn, Dave Longley, James H. | Andrey Kislyuk, Adam Knight, Dave Lehn, Dave Longley, Ilari | |||
Manger, Ilari Liusvaara, Mark Nottingham, Yoav Nir, Adrian Palmer, | Liusvaara, James H. Manger, Kathleen Moriarty, Mark Nottingham, Yoav | |||
Lucas Pardue, Roberto Polli, Julian Reschke, Michael Richardson, | Nir, Adrian Palmer, Lucas Pardue, Roberto Polli, Julian Reschke, | |||
Wojciech Rygielski, Adam Scarr, Cory J. Slep, Dirk Stein, Henry | Michael Richardson, Wojciech Rygielski, Adam Scarr, Cory J. Slep, | |||
Story, Lukasz Szewc, Chris Webber, and Jeffrey Yasskin | Dirk Stein, Henry Story, Lukasz Szewc, Chris Webber, and Jeffrey | |||
Yasskin. | ||||
Document History | Document History | |||
_RFC EDITOR: please remove this section before publication_ | _RFC EDITOR: please remove this section before publication_ | |||
* draft-ietf-httpbis-message-signatures | * draft-ietf-httpbis-message-signatures | |||
- -04 | ||||
o Moved signature component definitions up to intro. | ||||
o Created formal function definitions for algorithms to | ||||
fulfill. | ||||
o Updated all examples. | ||||
o Added nonce parameter field. | ||||
- -03 | - -03 | |||
o Clarified signing and verification processes. | o Clarified signing and verification processes. | |||
o Updated algorithm and key selection method. | o Updated algorithm and key selection method. | |||
o Clearly defined core algorithm set. | o Clearly defined core algorithm set. | |||
o Defined JOSE signature mapping process. | o Defined JOSE signature mapping process. | |||
o Removed legacy signature methods. | o Removed legacy signature methods. | |||
End of changes. 132 change blocks. | ||||
439 lines changed or deleted | 548 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/ |