draft-ietf-webpush-vapid-03.txt | draft-ietf-webpush-vapid-04.txt | |||
---|---|---|---|---|
Network Working Group M. Thomson | Network Working Group M. Thomson | |||
Internet-Draft Mozilla | Internet-Draft Mozilla | |||
Intended status: Standards Track P. Beverloo | Intended status: Standards Track P. Beverloo | |||
Expires: December 20, 2017 Google | Expires: March 8, 2018 Google | |||
June 18, 2017 | September 04, 2017 | |||
Voluntary Application Server Identification (VAPID) for Web Push | Voluntary Application Server Identification (VAPID) for Web Push | |||
draft-ietf-webpush-vapid-03 | draft-ietf-webpush-vapid-04 | |||
Abstract | Abstract | |||
An application server can use the method described to voluntarily | An application server can use the method described to voluntarily | |||
identify itself to a push service. This identification information | identify itself to a push service. The "vapid" authentication scheme | |||
can be used by the push service to attribute requests that are made | allows a client to include its an identity in a signed token with | |||
by the same application server to a single entity. An application | requests that it makes. The signature can be used by the push | |||
server can include additional information that the operator of a push | service to attribute requests that are made by the same application | |||
service can use to contact the operator of the application server. | server to a single entity. The identification information can allow | |||
This identification information can be used to restrict the use of a | the operator of a push service to contact the operator of the | |||
push subscription a single application server. | application server. The signature can be used to restrict the use of | |||
a push subscription to a single application server. | ||||
Status of This Memo | Status of This Memo | |||
This Internet-Draft is submitted in full conformance with the | This Internet-Draft is submitted in full conformance with the | |||
provisions of BCP 78 and BCP 79. | provisions of BCP 78 and BCP 79. | |||
Internet-Drafts are working documents of the Internet Engineering | Internet-Drafts are working documents of the Internet Engineering | |||
Task Force (IETF). Note that other groups may also distribute | Task Force (IETF). Note that other groups may also distribute | |||
working documents as Internet-Drafts. The list of current Internet- | working documents as Internet-Drafts. The list of current Internet- | |||
Drafts is at http://datatracker.ietf.org/drafts/current/. | Drafts is at http://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 December 20, 2017. | This Internet-Draft will expire on March 8, 2018. | |||
Copyright Notice | Copyright Notice | |||
Copyright (c) 2017 IETF Trust and the persons identified as the | Copyright (c) 2017 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 | Provisions Relating to IETF Documents | |||
(http://trustee.ietf.org/license-info) in effect on the date of | (http://trustee.ietf.org/license-info) in effect on the date of | |||
publication of this document. Please review these documents | publication of this document. Please review these documents | |||
skipping to change at page 2, line 16 ¶ | skipping to change at page 2, line 17 ¶ | |||
the Trust Legal Provisions and are provided without warranty as | the Trust Legal Provisions and are provided without warranty as | |||
described in the Simplified BSD License. | described in the Simplified BSD License. | |||
Table of Contents | Table of Contents | |||
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 2 | 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 2 | |||
1.1. Voluntary Identification . . . . . . . . . . . . . . . . 3 | 1.1. Voluntary Identification . . . . . . . . . . . . . . . . 3 | |||
1.2. Notational Conventions . . . . . . . . . . . . . . . . . 3 | 1.2. Notational Conventions . . . . . . . . . . . . . . . . . 3 | |||
2. Application Server Self-Identification . . . . . . . . . . . 4 | 2. Application Server Self-Identification . . . . . . . . . . . 4 | |||
2.1. Application Server Contact Information . . . . . . . . . 4 | 2.1. Application Server Contact Information . . . . . . . . . 4 | |||
2.2. Additional Claims . . . . . . . . . . . . . . . . . . . . 4 | 2.2. Additional Claims . . . . . . . . . . . . . . . . . . . . 5 | |||
2.3. Cryptographic Agility . . . . . . . . . . . . . . . . . . 5 | 2.3. Cryptographic Agility . . . . . . . . . . . . . . . . . . 5 | |||
2.4. Example . . . . . . . . . . . . . . . . . . . . . . . . . 5 | 2.4. Example . . . . . . . . . . . . . . . . . . . . . . . . . 5 | |||
3. Vapid Authentication Scheme . . . . . . . . . . . . . . . . . 6 | 3. Vapid Authentication Scheme . . . . . . . . . . . . . . . . . 6 | |||
3.1. Token Parameter (t) . . . . . . . . . . . . . . . . . . . 6 | 3.1. Token Parameter (t) . . . . . . . . . . . . . . . . . . . 6 | |||
3.2. Public Key Parameter (k) . . . . . . . . . . . . . . . . 6 | 3.2. Public Key Parameter (k) . . . . . . . . . . . . . . . . 6 | |||
4. Subscription Restriction . . . . . . . . . . . . . . . . . . 7 | 4. Subscription Restriction . . . . . . . . . . . . . . . . . . 7 | |||
4.1. Creating a Restricted Push Subscription . . . . . . . . . 7 | 4.1. Creating a Restricted Push Subscription . . . . . . . . . 7 | |||
4.2. Using Restricted Subscriptions . . . . . . . . . . . . . 8 | 4.2. Using Restricted Subscriptions . . . . . . . . . . . . . 8 | |||
5. Security Considerations . . . . . . . . . . . . . . . . . . . 9 | 5. Security Considerations . . . . . . . . . . . . . . . . . . . 9 | |||
6. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 9 | 6. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 9 | |||
6.1. Vapid Authentication Scheme Registration . . . . . . . . 9 | 6.1. Vapid Authentication Scheme Registration . . . . . . . . 10 | |||
6.2. Vapid Authentication Scheme Parameters . . . . . . . . . 10 | 6.2. Vapid Authentication Scheme Parameters . . . . . . . . . 10 | |||
6.3. application/webpush-options+json Media Type Registration 10 | 6.3. application/webpush-options+json Media Type Registration 11 | |||
7. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . 11 | 7. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . 12 | |||
8. References . . . . . . . . . . . . . . . . . . . . . . . . . 11 | 8. References . . . . . . . . . . . . . . . . . . . . . . . . . 12 | |||
8.1. Normative References . . . . . . . . . . . . . . . . . . 12 | 8.1. Normative References . . . . . . . . . . . . . . . . . . 12 | |||
8.2. Informative References . . . . . . . . . . . . . . . . . 13 | 8.2. Informative References . . . . . . . . . . . . . . . . . 14 | |||
Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 13 | Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 14 | |||
1. Introduction | 1. Introduction | |||
The Web Push protocol [RFC8030] describes how an application server | The Web Push protocol [RFC8030] describes how an application server | |||
is able to request that a push service deliver a push message to a | is able to request that a push service deliver a push message to a | |||
user agent. | user agent. | |||
As a consequence of the expected deployment architecture, there is no | As a consequence of the expected deployment architecture, there is no | |||
basis for an application server to be known to a push service prior | basis for an application server to be known to a push service prior | |||
to requesting delivery of a push message. Requiring that the push | to requesting delivery of a push message. Requiring that the push | |||
service be able to authenticate application servers places an | service be able to authenticate application servers places an | |||
unwanted constraint on the interactions between user agents and | unwanted constraint on the interactions between user agents and | |||
application servers, who are the ultimate users of a push service. | application servers, who are the ultimate users of a push service. | |||
That constraint would also degrade the privacy-preserving properties | That constraint would also degrade the privacy-preserving properties | |||
the protocol provides. For these reasons, [RFC8030] does not define | the protocol provides. For these reasons, [RFC8030] does not define | |||
a mandatory system for authentication of application servers. | a mandatory system for authentication of application servers. | |||
An unfortunate consequence of this design is that a push service is | An unfortunate consequence of the design of [RFC8030] is that a push | |||
exposed to a greater risk of denial of service attack. While | service is exposed to a greater risk of denial of service attack. | |||
requests from application servers can be indirectly attributed to | While requests from application servers can be indirectly attributed | |||
user agents, this is not always efficient or even sufficient. | to user agents, this is not always efficient or even sufficient. | |||
Providing more information about the application server directly to a | Providing more information about the application server directly to a | |||
push service allows the push service to better distinguish between | push service allows the push service to better distinguish between | |||
legitimate and bogus requests. | legitimate and bogus requests. | |||
Additionally, this design also relies on endpoint secrecy as any | Additionally, the design of RFC 8030 relies on maintaining the | |||
application server in possession of the endpoint is able to send | secrecy of push subscription URIs. Any application server in | |||
messages, albeit without payloads. In situations where usage of a | possession of this URI is able to send messages to the user agent. | |||
subscription can be limited to a single application server, the | If use of a subscription could be limited to a single application | |||
ability to associate a subscription with the application server could | server, this would reduce the impact of the push subscription URI | |||
reduce the impact of a data leak. | being learned by an unauthorized party. | |||
1.1. Voluntary Identification | 1.1. Voluntary Identification | |||
This document describes a system whereby an application server can | This document describes a system whereby an application server can | |||
volunteer information about itself to a push service. At a minimum, | volunteer information about itself to a push service. At a minimum, | |||
this provides a stable identity for the application server, though | this provides a stable identity for the application server, though | |||
this could also include contact information, such as an email | this could also include contact information, such as an email | |||
address. | address. | |||
A consistent identity can be used by a push service to establish | A consistent identity can be used by a push service to establish | |||
skipping to change at page 3, line 48 ¶ | skipping to change at page 3, line 48 ¶ | |||
message volume. Contacting the operator of the application server | message volume. Contacting the operator of the application server | |||
has proven to be valuable. | has proven to be valuable. | |||
Even in the absence of usable contact information, an application | Even in the absence of usable contact information, an application | |||
server that has a well-established reputation might be given | server that has a well-established reputation might be given | |||
preference over an unidentified application server when choosing | preference over an unidentified application server when choosing | |||
whether to discard a push message. | whether to discard a push message. | |||
1.2. Notational Conventions | 1.2. Notational Conventions | |||
The words "MUST", "MUST NOT", "SHOULD", and "MAY" are used in this | The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | |||
document. It's not shouting, when they are capitalized, they have | "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | |||
the special meaning described in [RFC2119]. | "OPTIONAL" in this document are to be interpreted as described in BCP | |||
14 [RFC2119] [RFC8174] when, and only when, they appear in all | ||||
capitals, as shown here. | ||||
The terms "push message", "push service", "push subscription", | The terms "push message", "push service", "push subscription", | |||
"application server", and "user agent" are used as defined in | "application server", and "user agent" are used as defined in | |||
[RFC8030]. | [RFC8030]. | |||
2. Application Server Self-Identification | 2. Application Server Self-Identification | |||
Application servers that wish to self-identify generate and maintain | Application servers that wish to self-identify generate and maintain | |||
a signing key pair. This key pair MUST be usable with elliptic curve | a signing key pair. This key pair MUST be usable with elliptic curve | |||
digital signature (ECDSA) over the P-256 curve [FIPS186]. Use of | digital signature (ECDSA) over the P-256 curve [FIPS186]. Use of | |||
skipping to change at page 4, line 30 ¶ | skipping to change at page 4, line 30 ¶ | |||
o An "aud" (Audience) claim in the token MUST include the unicode | o An "aud" (Audience) claim in the token MUST include the unicode | |||
serialization of the origin (Section 6.1 of [RFC6454]) of the push | serialization of the origin (Section 6.1 of [RFC6454]) of the push | |||
resource URL. This binds the token to a specific push service. | resource URL. This binds the token to a specific push service. | |||
This ensures that the token is reusable for all push resource URLs | This ensures that the token is reusable for all push resource URLs | |||
that share the same origin. | that share the same origin. | |||
o An "exp" (Expiry) claim MUST be included with the time after which | o An "exp" (Expiry) claim MUST be included with the time after which | |||
the token expires. This limits the time over which a token is | the token expires. This limits the time over which a token is | |||
valid. An "exp" claim MUST NOT be more than 24 hours from the | valid. An "exp" claim MUST NOT be more than 24 hours from the | |||
time of the request. | time of the request. Limiting this to 24 hours balances the need | |||
for reuse against the potential cost and likelihood of theft of a | ||||
valid token. | ||||
This JWT is included in an Authorization header field, using an auth- | This JWT is included in an Authorization header field, using an auth- | |||
scheme of "vapid". A push service MAY reject a request with a 403 | scheme of "vapid". A push service MAY reject a request with a 403 | |||
(Forbidden) status code [RFC7235] if the JWT signature or its claims | (Forbidden) status code [RFC7235] if the JWT signature or its claims | |||
are invalid. | are invalid. A push service MUST NOT use information from an invalid | |||
token. | ||||
The JWT MUST use a JSON Web Signature (JWS) [RFC7515]. The signature | The JWT MUST use a JSON Web Signature (JWS) [RFC7515]. The signature | |||
MUST use ECDSA on the NIST P-256 curve [FIPS186] which is identified | MUST use ECDSA on the NIST P-256 curve [FIPS186] which is identified | |||
as "ES256" [RFC7518]. | as "ES256" [RFC7518]. | |||
2.1. Application Server Contact Information | 2.1. Application Server Contact Information | |||
If the application server wishes to provide contact details it MAY | If the application server wishes to provide contact details it MAY | |||
include a "sub" (Subject) claim in the JWT. The "sub" claim SHOULD | include a "sub" (Subject) claim in the JWT. The "sub" claim SHOULD | |||
include a contact URI for the application server as either a | include a contact URI for the application server as either a | |||
skipping to change at page 5, line 9 ¶ | skipping to change at page 5, line 14 ¶ | |||
2.2. Additional Claims | 2.2. Additional Claims | |||
An application server MAY include additional claims using public or | An application server MAY include additional claims using public or | |||
private names (see Sections 4.2 and 4.3 of [RFC7519]). Since the JWT | private names (see Sections 4.2 and 4.3 of [RFC7519]). Since the JWT | |||
is in a header field, the size of additional claims SHOULD be kept as | is in a header field, the size of additional claims SHOULD be kept as | |||
small as possible. | small as possible. | |||
2.3. Cryptographic Agility | 2.3. Cryptographic Agility | |||
The "vapid" authentication scheme is used to identify the specific | The "vapid" HTTP authentication scheme (Section 3) is used to | |||
profile of JWT defined in this document. A different authentication | identify the specific profile of JWT defined in this document. A | |||
scheme is needed to update the signature algorithm or other | different authentication scheme is needed to update the signature | |||
parameters. This ensures that existing mechanisms for negotiating | algorithm or other parameters. This ensures that existing mechanisms | |||
authentication scheme can be used rather than defining new parameter | for negotiating authentication scheme can be used rather than | |||
negotiation mechanisms. | defining new parameter negotiation mechanisms. | |||
2.4. Example | 2.4. Example | |||
An application server requests the delivery of a push message as | An application server requests the delivery of a push message as | |||
described in [RFC8030]. If the application server wishes to self- | described in [RFC8030]. If the application server wishes to self- | |||
identify, it includes an Authorization header field with credentials | identify, it includes an Authorization header field with credentials | |||
that use the "vapid" authentication scheme (Section 3). | that use the "vapid" authentication scheme. | |||
POST /p/JzLQ3raZJfFBR0aqvOMsLrt54w4rJUsV HTTP/1.1 | POST /p/JzLQ3raZJfFBR0aqvOMsLrt54w4rJUsV HTTP/1.1 | |||
Host: push.example.net | Host: push.example.net | |||
TTL: 30 | TTL: 30 | |||
Content-Length: 136 | Content-Length: 136 | |||
Content-Encoding: aes128gcm | Content-Encoding: aes128gcm | |||
Authorization: vapid | Authorization: vapid | |||
t=eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiJ9.eyJhdWQiOiJodHRwczovL3 | t=eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiJ9.eyJhdWQiOiJodHRwczovL3 | |||
B1c2guZXhhbXBsZS5uZXQiLCJleHAiOjE0NTM1MjM3NjgsInN1YiI6Im1ha | B1c2guZXhhbXBsZS5uZXQiLCJleHAiOjE0NTM1MjM3NjgsInN1YiI6Im1ha | |||
Wx0bzpwdXNoQGV4YW1wbGUuY29tIn0.i3CYb7t4xfxCDquptFOepC9GAu_H | Wx0bzpwdXNoQGV4YW1wbGUuY29tIn0.i3CYb7t4xfxCDquptFOepC9GAu_H | |||
skipping to change at page 6, line 26 ¶ | skipping to change at page 6, line 28 ¶ | |||
3. Vapid Authentication Scheme | 3. Vapid Authentication Scheme | |||
A new "vapid" HTTP authentication scheme [RFC7235] is defined. This | A new "vapid" HTTP authentication scheme [RFC7235] is defined. This | |||
authentication scheme carries a signed JWT, as described in | authentication scheme carries a signed JWT, as described in | |||
Section 2, plus the key that signed that JWT. | Section 2, plus the key that signed that JWT. | |||
This authentication scheme is for origin-server authentication only. | This authentication scheme is for origin-server authentication only. | |||
Therefore, this authentication scheme MUST NOT be used with the | Therefore, this authentication scheme MUST NOT be used with the | |||
Proxy-Authenticate or Proxy-Authorization header fields. | Proxy-Authenticate or Proxy-Authorization header fields. | |||
This authentication scheme does not require a challenge. Clients are | The challenge for the "vapid" authentication scheme contains only the | |||
able to generate the Authorization header field without any | "auth-scheme" production. No parameters are currently defined. | |||
additional information from a server. Therefore, a challenge for | ||||
this authentication scheme MUST NOT be sent in a WWW-Authenticate | ||||
header field. | ||||
Two parameters are defined for this authentication scheme: "t" and | Two parameters are defined for this authentication scheme: "t" and | |||
"k". All unknown or unsupported parameters to "vapid" authentication | "k". All unknown or unsupported parameters to "vapid" authentication | |||
credentials MUST be ignored. The "realm" parameter is ignored for | credentials MUST be ignored. The "realm" parameter is ignored for | |||
this authentication scheme. | this authentication scheme. | |||
This authentication scheme is intended for use by an application | This authentication scheme is intended for use by an application | |||
server when using the Web Push protocol [RFC8030], but it could be | server when using the Web Push protocol [RFC8030]. | |||
used in other contexts if applicable. | ||||
3.1. Token Parameter (t) | 3.1. Token Parameter (t) | |||
The "t" parameter of the "vapid" authentication scheme carries a JWT | The "t" parameter of the "vapid" authentication scheme carries a JWT | |||
as described in Section 2. | as described in Section 2. | |||
3.2. Public Key Parameter (k) | 3.2. Public Key Parameter (k) | |||
In order for the push service to be able to validate the JWT, it | In order for the push service to be able to validate the JWT, it | |||
needs to learn the public key of the application server. A "k" | needs to learn the public key of the application server. A "k" | |||
skipping to change at page 7, line 15 ¶ | skipping to change at page 7, line 15 ¶ | |||
The "k" parameter includes an elliptic curve digital signature | The "k" parameter includes an elliptic curve digital signature | |||
algorithm (ECDSA) public key [FIPS186] in uncompressed form [X9.62] | algorithm (ECDSA) public key [FIPS186] in uncompressed form [X9.62] | |||
that is encoded using base64url encoding [RFC7515]. | that is encoded using base64url encoding [RFC7515]. | |||
Note: X9.62 encoding is used over JWK [RFC7517] for two reasons. A | Note: X9.62 encoding is used over JWK [RFC7517] for two reasons. A | |||
JWK does not have a canonical form, so X9.62 encoding makes it | JWK does not have a canonical form, so X9.62 encoding makes it | |||
easier for the push service to handle comparison of keys from | easier for the push service to handle comparison of keys from | |||
different sources. Secondarily, the X9.62 encoding is also | different sources. Secondarily, the X9.62 encoding is also | |||
considerably smaller. | considerably smaller. | |||
Some implementations permit the same P-256 key to be used for signing | Some elliptic curve implementations permit the same P-256 key to be | |||
and key exchange. An application server MUST select a different | used for signing and key exchange. An application server MUST select | |||
private key for the key exchange [I-D.ietf-webpush-encryption] and | a different private key for the key exchange [WEBPUSH-ENCRYPTION] and | |||
signing the authentication token. Though a push service is not | signing the authentication token. Though a push service is not | |||
obligated to check either parameter for every push message, a push | obligated to check either parameter for every push message, a push | |||
service SHOULD reject push messages that have identical values for | service SHOULD reject push messages that have identical values for | |||
these parameters with a 400 (Bad Request) status code. | these parameters with a 400 (Bad Request) status code. | |||
4. Subscription Restriction | 4. Subscription Restriction | |||
The public key of the application server serves as a stable | The public key of the application server serves as a stable | |||
identifier for the server. This key can be used to restrict a push | identifier for the server. This key can be used to restrict a push | |||
subscription to a specific application server. | subscription to a specific application server. | |||
Subscription restriction reduces the reliance on endpoint secrecy by | Subscription restriction reduces the reliance on endpoint secrecy by | |||
requiring proof of possession to be demonstrated by an application | requiring that an application server provide a signed token when | |||
server when requesting delivery of a push message. This provides an | requesting delivery of a push message. This provides an additional | |||
additional level of protection against leaking of the details of the | level of protection against leaking of the details of the push | |||
push subscription. | subscription. | |||
4.1. Creating a Restricted Push Subscription | 4.1. Creating a Restricted Push Subscription | |||
The user agent includes the public key of the application server when | A user agent that wishes to create a restricted subscription includes | |||
requesting the creation of a push subscription. This restricts use | the public key of the application server when requesting the creation | |||
of the resulting subscription to application servers that are able to | of a push subscription. This restricts use of the resulting | |||
provide proof of possession for the corresponding private key. | subscription to application servers that are able to provide a valid | |||
JWT signed by the corresponding private key. | ||||
The public key is then added to the request to create a push | The user agent then adds the public key to the request to create a | |||
subscription. The push subscription request is extended to include a | push subscription. The push subscription request is extended to | |||
body. The body of the request is a JSON object as described in | include a body. The body of the request is a JSON object as | |||
[RFC7159]. A "vapid" member is added to this JSON object, containing | described in [RFC7159]. The user agent adds a "vapid" member to this | |||
the public key on the P-256 curve, encoded in the uncompressed form | JSON object that contains a public key on the P-256 curve, encoded in | |||
[X9.62] and base64url encoded [RFC7515]. The media type of the body | the uncompressed form [X9.62] and base64url encoded [RFC7515]. The | |||
is set to "application/webpush-options+json" (see Section 6.3 for | media type of the body is set to "application/webpush-options+json" | |||
registration of this media type). | (see Section 6.3 for registration of this media type). | |||
A push service MUST ignore the body of a request that uses a | A push service MUST ignore the body of a request that uses a | |||
different media type. For the "application/webpush-options+json" | different media type. For the "application/webpush-options+json" | |||
media type, a push service MUST ignore any members on this object | media type, a push service MUST ignore any members on this object | |||
that it does not understand. | that it does not understand. | |||
The example in Figure 3 shows a restriction to the key used in | The example in Figure 3 shows a restriction to the key used in | |||
Figure 1. Extra whitespace is added to meet formatting constraints. | Figure 1. Extra whitespace is added to meet formatting constraints. | |||
POST /subscribe/ HTTP/1.1 | POST /subscribe/ HTTP/1.1 | |||
Host: push.example.net | Host: push.example.net | |||
Content-Type: application/webpush-optjons+json;charset=utf-8 | Content-Type: application/webpush-options+json | |||
Content-Length: 104 | Content-Length: 104 | |||
{ "vapid": "BA1Hxzyi1RUM1b5wjxsn7nGxAszw2u61m164i3MrAIxH | { "vapid": "BA1Hxzyi1RUM1b5wjxsn7nGxAszw2u61m164i3MrAIxH | |||
F6YK5h4SDYic-dRuU_RCPCfA5aq9ojSwk5Y2EmClBPs" } | F6YK5h4SDYic-dRuU_RCPCfA5aq9ojSwk5Y2EmClBPs" } | |||
Figure 3: Example Subscribe Request | Figure 3: Example Subscribe Request | |||
An application might use the Web Push API [API] to provide the user | An application might use the Web Push API [API] to provide the user | |||
agent with a public key. | agent with a public key. | |||
4.2. Using Restricted Subscriptions | 4.2. Using Restricted Subscriptions | |||
When a push subscription has been associated with an application | When a push subscription has been restricted to an application | |||
server, the request for push message delivery MUST include proof of | server, the request for push message delivery MUST include a JWT | |||
possession for the associated private key that was used when creating | signed by the private key that corresponds to the public key used | |||
the push subscription. | when creating the subscription. | |||
A push service MUST reject a message that omits mandatory credentials | A push service MUST reject a message sent to a restricted push | |||
with a 401 (Unauthorized) status code. A push service MAY reject a | subscription if that message includes no "vapid" authentication or | |||
message that includes invalid credentials with a 403 (Forbidden) | invalid "vapid" authentication. A 401 (Unauthorized) status code | |||
status code. Credentials are invalid if: | might be used if the authentication is absent; a 403 (Forbidden) | |||
status code might be used if authentication is invalid. | ||||
"vapid" authentication is invalid if: | ||||
o either the authentication token or public key are not included in | o either the authentication token or public key are not included in | |||
the request, | the request, | |||
o the signature on the JWT cannot be successfully verified using the | o the signature on the JWT cannot be successfully verified using the | |||
included public key, | included public key, | |||
o the current time is later than the time identified in the "exp" | o the current time is later than the time identified in the "exp" | |||
(Expiry) claim or more than 24 hours before the expiry time, | (Expiry) claim or more than 24 hours before the expiry time, | |||
o the origin of the push resource is not included in the "aud" | o the origin of the push resource is not included in the "aud" | |||
(Audience) claim, or | (Audience) claim, or | |||
o the public key used to sign the JWT doesn't match the one that was | o the public key used to sign the JWT doesn't match the one that was | |||
included in the creation of the push subscription. | included in the creation of the push subscription. | |||
A push service MUST NOT forward the JWT or public key to the user | A push service MUST NOT forward the JWT or public key to the user | |||
agent when delivering the push message. | agent when delivering the push message. | |||
An application server that needs to replace its signing key needs to | An application server that needs to replace its signing key needs to | |||
create a new subscription that is restricted to the updated key. | request the creation of a new subscription by the user agent that is | |||
Application servers need to remember the key that was used when | restricted to the updated key. Application servers need to remember | |||
creating a given subscription. | the key that was used when requesting the creation of a subscription. | |||
5. Security Considerations | 5. Security Considerations | |||
This authentication scheme is vulnerable to replay attacks if an | This authentication scheme is vulnerable to replay attacks if an | |||
attacker can acquire a valid JWT. Applying narrow limits to the | attacker can acquire a valid JWT. Sending requests using HTTPS as | |||
period over which a replayable token can be reused limits the | required by [RFC8030] provides confidentiality. Additionally, | |||
potential value of a stolen token to an attacker and can increase the | applying narrow limits to the period over which a replayable token | |||
difficulty of stealing a token. | can be reused limits the potential value of a stolen token to an | |||
attacker and can increase the difficulty of stealing a token. | ||||
An application server might offer falsified contact information. A | An application server might offer falsified contact information. The | |||
push service operator therefore cannot use the presence of | application server asserts its email address or contact URI without | |||
unvalidated contact information as input to any security-critical | any evidence to support the claim. A push service operator cannot | |||
decision-making process. | use the presence of unvalidated contact information as input to any | |||
security-critical decision-making process. | ||||
Validation of a signature on the JWT requires a non-trivial amount of | Validation of a signature on the JWT requires a non-trivial amount of | |||
computation. For something that might be used to identify legitimate | computation. For something that might be used to identify legitimate | |||
requests under denial of service attack conditions, this is not | requests under denial of service attack conditions, this is not | |||
ideal. Application servers are therefore encouraged to reuse tokens, | ideal. Application servers are therefore encouraged to reuse tokens, | |||
which permits the push service to cache the results of signature | which permits the push service to cache the results of signature | |||
validation. | validation. | |||
An application server that changes its signing key breaks linkability | An application server that changes its signing key breaks linkability | |||
between push messages that it sends under the different keys. A push | between push messages that it sends under the different keys. A push | |||
skipping to change at page 10, line 4 ¶ | skipping to change at page 10, line 14 ¶ | |||
6.1. Vapid Authentication Scheme Registration | 6.1. Vapid Authentication Scheme Registration | |||
This document registers the "vapid" authentication scheme in the | This document registers the "vapid" authentication scheme in the | |||
"Hypertext Transfer Protocol (HTTP) Authentication Scheme Registry" | "Hypertext Transfer Protocol (HTTP) Authentication Scheme Registry" | |||
established in [RFC7235]. | established in [RFC7235]. | |||
Authentication Scheme Name: vapid | Authentication Scheme Name: vapid | |||
Pointer to specification text: Section 3 of this document | Pointer to specification text: Section 3 of this document | |||
Notes: This scheme is origin-server only and does not define a | Notes: This scheme is origin-server only and does not define a | |||
challenge. | challenge. | |||
6.2. Vapid Authentication Scheme Parameters | 6.2. Vapid Authentication Scheme Parameters | |||
This document creates a "Vapid Authentication Scheme Parameters" | This document creates a "Vapid Authentication Scheme Parameters" | |||
registry for parameters to the "vapid" authentication scheme. This | registry for parameters to the "vapid" authentication scheme. These | |||
registry is under the "WebPush Parameters" grouping. The registry | parameters are defined for use in requests (in the Authorization | |||
operates on the "Specification Required" policy [RFC5226]. | header field) and for challenges (in the WWW-Authenticate header | |||
field). This registry is under the "WebPush Parameters" grouping. | ||||
The registry operates on the "Specification Required" policy | ||||
[RFC5226]. | ||||
Registrations MUST include the following information: | Registrations MUST include the following information: | |||
Parameter Name: A name for the parameter, which conforms to the | Parameter Name: A name for the parameter, which conforms to the | |||
"token" grammar [RFC7230] | "token" grammar [RFC7230] | |||
Purpose (optional): A brief identifying the purpose of the | Purpose (optional): A brief identifying the purpose of the | |||
parameter. | parameter. | |||
Header Fields: The header field or header fields where the parameter | ||||
can be used. | ||||
Specification: A link to the specification that defines the format | Specification: A link to the specification that defines the format | |||
and semantics of the parameter. | and semantics of the parameter. | |||
This registry initially contains the following entries: | This registry initially contains the following entries: | |||
+---------------+-------------------------+-------------------------+ | +------------+------------------+---------------+-------------------+ | |||
| Parameter | Purpose | Specification | | | Parameter | Purpose | Header Fields | Specification | | |||
| Name | | | | | Name | | | | | |||
+---------------+-------------------------+-------------------------+ | +------------+------------------+---------------+-------------------+ | |||
| t | JWT authentication | [[RFC-to-be]], Section | | | t | JWT | Authorization | [[RFC-to-be]], | | |||
| | token | 3.1 | | | | authentication | | Section 3.1 | | |||
| | | | | | | token | | | | |||
| k | signing key | [[RFC-to-be]], Section | | | | | | | | |||
| | | 3.2 | | | k | signing key | Authorization | [[RFC-to-be]], | | |||
+---------------+-------------------------+-------------------------+ | | | | | Section 3.2 | | |||
+------------+------------------+---------------+-------------------+ | ||||
6.3. application/webpush-options+json Media Type Registration | 6.3. application/webpush-options+json Media Type Registration | |||
This document registers the "application/webpush-options+json" media | This document registers the "application/webpush-options+json" media | |||
type in the "Media Types" registry following the process described in | type in the "Media Types" registry following the process described in | |||
[RFC6838]. | [RFC6838]. | |||
[[RFC editor: please replace instances of RFCXXXX in this section | ||||
with a reference to the published RFC.]] | ||||
Type name: application | Type name: application | |||
Subtype name: webpush-options+json | Subtype name: webpush-options+json | |||
Required parameters: n/a | Required parameters: none | |||
Optional parameters: n/a | Optional parameters: none | |||
Encoding considerations: binary | ||||
Encoding considerations: binary (JSON is UTF-8-encoded text) | ||||
Security considerations: See [RFC7159] for security considerations | Security considerations: See [RFC7159] for security considerations | |||
specific to JSON. | specific to JSON. | |||
Interoperability considerations: See [RFC7159] for interoperability | Interoperability considerations: See [RFC7159] for interoperability | |||
considerations specific to JSON. | considerations specific to JSON. | |||
Published specification: This document. | Published specification: [[RFCXXXX]]. | |||
Applications that use this media type: Web browsers, via the Web | Applications that use this media type: Web browsers, via the Web | |||
Push Protocol [RFC8030]. | Push Protocol [RFC8030]. | |||
Fragment identifier considerations: None, see [RFC7159]. | Fragment identifier considerations: None, see [RFC7159]. | |||
Additional information: | Additional information: | |||
Deprecated alias names for this type: n/a | Deprecated alias names for this type: n/a | |||
Magic number(s): n/a | Magic number(s): n/a | |||
File extension(s): .json | File extension(s): .json | |||
Macintosh file type code(s): TEXT | Macintosh file type code(s): TEXT | |||
Person & email address to contact for further information: Martin | Person & email address to contact for further information: Martin | |||
Thomson (martin.thomson@gmail.com) | Thomson (martin.thomson@gmail.com) | |||
Intended usage: LIMITED USE | Intended usage: LIMITED USE | |||
skipping to change at page 11, line 36 ¶ | skipping to change at page 12, line 17 ¶ | |||
Macintosh file type code(s): TEXT | Macintosh file type code(s): TEXT | |||
Person & email address to contact for further information: Martin | Person & email address to contact for further information: Martin | |||
Thomson (martin.thomson@gmail.com) | Thomson (martin.thomson@gmail.com) | |||
Intended usage: LIMITED USE | Intended usage: LIMITED USE | |||
Restrictions on usage: For use with the Web Push Protocol [RFC8030]. | Restrictions on usage: For use with the Web Push Protocol [RFC8030]. | |||
Author: See "Authors' Addresses" section of this document. | Author: See "Authors' Addresses" section of [[RFCXXXX]]. | |||
Change controller: Internet Engineering Task Force | Change controller: Internet Engineering Task Force | |||
7. Acknowledgements | 7. Acknowledgements | |||
This document would have been much worse than it currently is if not | This document would have been much worse than it is if not for the | |||
for the contributions of Benjamin Bangert, JR Conlin, Chris Karlof, | contributions of Benjamin Bangert, JR Conlin, Chris Karlof, Costin | |||
Costin Manolache, Adam Roach, and others. | Manolache, Adam Roach, and others. | |||
8. References | 8. References | |||
8.1. Normative References | 8.1. Normative References | |||
[FIPS186] National Institute of Standards and Technology (NIST), | [FIPS186] National Institute of Standards and Technology (NIST), | |||
"Digital Signature Standard (DSS)", NIST PUB 186-4 , July | "Digital Signature Standard (DSS)", NIST PUB 186-4 , July | |||
2013. | 2013. | |||
[RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | |||
Requirement Levels", BCP 14, RFC 2119, | Requirement Levels", BCP 14, RFC 2119, | |||
DOI 10.17487/RFC2119, March 1997, | DOI 10.17487/RFC2119, March 1997, <https://www.rfc- | |||
<http://www.rfc-editor.org/info/rfc2119>. | editor.org/info/rfc2119>. | |||
[RFC2818] Rescorla, E., "HTTP Over TLS", RFC 2818, | [RFC2818] Rescorla, E., "HTTP Over TLS", RFC 2818, | |||
DOI 10.17487/RFC2818, May 2000, | DOI 10.17487/RFC2818, May 2000, <https://www.rfc- | |||
<http://www.rfc-editor.org/info/rfc2818>. | editor.org/info/rfc2818>. | |||
[RFC5226] Narten, T. and H. Alvestrand, "Guidelines for Writing an | [RFC5226] Narten, T. and H. Alvestrand, "Guidelines for Writing an | |||
IANA Considerations Section in RFCs", BCP 26, RFC 5226, | IANA Considerations Section in RFCs", RFC 5226, | |||
DOI 10.17487/RFC5226, May 2008, | DOI 10.17487/RFC5226, May 2008, <https://www.rfc- | |||
<http://www.rfc-editor.org/info/rfc5226>. | editor.org/info/rfc5226>. | |||
[RFC6068] Duerst, M., Masinter, L., and J. Zawinski, "The 'mailto' | [RFC6068] Duerst, M., Masinter, L., and J. Zawinski, "The 'mailto' | |||
URI Scheme", RFC 6068, DOI 10.17487/RFC6068, October 2010, | URI Scheme", RFC 6068, DOI 10.17487/RFC6068, October 2010, | |||
<http://www.rfc-editor.org/info/rfc6068>. | <https://www.rfc-editor.org/info/rfc6068>. | |||
[RFC6454] Barth, A., "The Web Origin Concept", RFC 6454, | [RFC6454] Barth, A., "The Web Origin Concept", RFC 6454, | |||
DOI 10.17487/RFC6454, December 2011, | DOI 10.17487/RFC6454, December 2011, <https://www.rfc- | |||
<http://www.rfc-editor.org/info/rfc6454>. | editor.org/info/rfc6454>. | |||
[RFC6838] Freed, N., Klensin, J., and T. Hansen, "Media Type | [RFC6838] Freed, N., Klensin, J., and T. Hansen, "Media Type | |||
Specifications and Registration Procedures", BCP 13, | Specifications and Registration Procedures", BCP 13, | |||
RFC 6838, DOI 10.17487/RFC6838, January 2013, | RFC 6838, DOI 10.17487/RFC6838, January 2013, | |||
<http://www.rfc-editor.org/info/rfc6838>. | <https://www.rfc-editor.org/info/rfc6838>. | |||
[RFC7159] Bray, T., Ed., "The JavaScript Object Notation (JSON) Data | [RFC7159] Bray, T., Ed., "The JavaScript Object Notation (JSON) Data | |||
Interchange Format", RFC 7159, DOI 10.17487/RFC7159, March | Interchange Format", RFC 7159, DOI 10.17487/RFC7159, March | |||
2014, <http://www.rfc-editor.org/info/rfc7159>. | 2014, <https://www.rfc-editor.org/info/rfc7159>. | |||
[RFC7230] Fielding, R., Ed. and J. Reschke, Ed., "Hypertext Transfer | [RFC7230] Fielding, R., Ed. and J. Reschke, Ed., "Hypertext Transfer | |||
Protocol (HTTP/1.1): Message Syntax and Routing", | Protocol (HTTP/1.1): Message Syntax and Routing", | |||
RFC 7230, DOI 10.17487/RFC7230, June 2014, | RFC 7230, DOI 10.17487/RFC7230, June 2014, | |||
<http://www.rfc-editor.org/info/rfc7230>. | <https://www.rfc-editor.org/info/rfc7230>. | |||
[RFC7235] Fielding, R., Ed. and J. Reschke, Ed., "Hypertext Transfer | [RFC7235] Fielding, R., Ed. and J. Reschke, Ed., "Hypertext Transfer | |||
Protocol (HTTP/1.1): Authentication", RFC 7235, | Protocol (HTTP/1.1): Authentication", RFC 7235, | |||
DOI 10.17487/RFC7235, June 2014, | DOI 10.17487/RFC7235, June 2014, <https://www.rfc- | |||
<http://www.rfc-editor.org/info/rfc7235>. | editor.org/info/rfc7235>. | |||
[RFC7515] Jones, M., Bradley, J., and N. Sakimura, "JSON Web | [RFC7515] Jones, M., Bradley, J., and N. Sakimura, "JSON Web | |||
Signature (JWS)", RFC 7515, DOI 10.17487/RFC7515, May | Signature (JWS)", RFC 7515, DOI 10.17487/RFC7515, May | |||
2015, <http://www.rfc-editor.org/info/rfc7515>. | 2015, <https://www.rfc-editor.org/info/rfc7515>. | |||
[RFC7518] Jones, M., "JSON Web Algorithms (JWA)", RFC 7518, | [RFC7518] Jones, M., "JSON Web Algorithms (JWA)", RFC 7518, | |||
DOI 10.17487/RFC7518, May 2015, | DOI 10.17487/RFC7518, May 2015, <https://www.rfc- | |||
<http://www.rfc-editor.org/info/rfc7518>. | editor.org/info/rfc7518>. | |||
[RFC7519] Jones, M., Bradley, J., and N. Sakimura, "JSON Web Token | [RFC7519] Jones, M., Bradley, J., and N. Sakimura, "JSON Web Token | |||
(JWT)", RFC 7519, DOI 10.17487/RFC7519, May 2015, | (JWT)", RFC 7519, DOI 10.17487/RFC7519, May 2015, | |||
<http://www.rfc-editor.org/info/rfc7519>. | <https://www.rfc-editor.org/info/rfc7519>. | |||
[RFC8030] Thomson, M., Damaggio, E., and B. Raymor, Ed., "Generic | [RFC8030] Thomson, M., Damaggio, E., and B. Raymor, Ed., "Generic | |||
Event Delivery Using HTTP Push", RFC 8030, | Event Delivery Using HTTP Push", RFC 8030, | |||
DOI 10.17487/RFC8030, December 2016, | DOI 10.17487/RFC8030, December 2016, <https://www.rfc- | |||
<http://www.rfc-editor.org/info/rfc8030>. | editor.org/info/rfc8030>. | |||
[RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC | ||||
2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, | ||||
May 2017, <https://www.rfc-editor.org/info/rfc8174>. | ||||
[WEBPUSH-ENCRYPTION] | ||||
Thomson, M., "Message Encryption for Web Push", draft- | ||||
ietf-webpush-encryption-08 (work in progress), February | ||||
2017. | ||||
[X9.62] ANSI, "Public Key Cryptography For The Financial Services | [X9.62] ANSI, "Public Key Cryptography For The Financial Services | |||
Industry: The Elliptic Curve Digital Signature Algorithm | Industry: The Elliptic Curve Digital Signature Algorithm | |||
(ECDSA)", ANSI X9.62 , 1998. | (ECDSA)", ANSI X9.62 , 1998. | |||
8.2. Informative References | 8.2. Informative References | |||
[API] Beverloo, P., Thomson, M., van Ouwerkerk, M., Sullivan, | [API] Beverloo, P., Thomson, M., van Ouwerkerk, M., Sullivan, | |||
B., and E. Fullea, "Push API", May 2017, | B., and E. Fullea, "Push API", May 2017, | |||
<https://w3c.github.io/push-api/>. | <https://w3c.github.io/push-api/>. | |||
[I-D.ietf-webpush-encryption] | ||||
Thomson, M., "Message Encryption for Web Push", draft- | ||||
ietf-webpush-encryption-08 (work in progress), February | ||||
2017. | ||||
[RFC3339] Klyne, G. and C. Newman, "Date and Time on the Internet: | [RFC3339] Klyne, G. and C. Newman, "Date and Time on the Internet: | |||
Timestamps", RFC 3339, DOI 10.17487/RFC3339, July 2002, | Timestamps", RFC 3339, DOI 10.17487/RFC3339, July 2002, | |||
<http://www.rfc-editor.org/info/rfc3339>. | <https://www.rfc-editor.org/info/rfc3339>. | |||
[RFC7517] Jones, M., "JSON Web Key (JWK)", RFC 7517, | [RFC7517] Jones, M., "JSON Web Key (JWK)", RFC 7517, | |||
DOI 10.17487/RFC7517, May 2015, | DOI 10.17487/RFC7517, May 2015, <https://www.rfc- | |||
<http://www.rfc-editor.org/info/rfc7517>. | editor.org/info/rfc7517>. | |||
Authors' Addresses | Authors' Addresses | |||
Martin Thomson | Martin Thomson | |||
Mozilla | Mozilla | |||
Email: martin.thomson@gmail.com | Email: martin.thomson@gmail.com | |||
Peter Beverloo | Peter Beverloo | |||
Email: beverloo@google.com | Email: beverloo@google.com | |||
End of changes. 56 change blocks. | ||||
137 lines changed or deleted | 162 lines changed or added | |||
This html diff was produced by rfcdiff 1.45. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ |