| rfc9149.original.xml | rfc9149.xml | |||
|---|---|---|---|---|
| <?xml version='1.0' encoding='utf-8'?> | <?xml version="1.0" encoding="UTF-8"?> | |||
| <!DOCTYPE rfc SYSTEM "rfc2629.dtd" [ | ||||
| <!ENTITY I-D.ietf-tls-dtls13 SYSTEM "https://xml2rfc.ietf.org/public/rfc/bibxml3 | ||||
| /reference.I-D.ietf-tls-dtls13.xml"> | ||||
| <!ENTITY RFC2119 SYSTEM "https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RF | ||||
| C.2119.xml"> | ||||
| <!ENTITY RFC8174 SYSTEM "https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RF | ||||
| C.8174.xml"> | ||||
| <!ENTITY RFC8446 SYSTEM "https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RF | ||||
| C.8446.xml"> | ||||
| <!ENTITY RFC8305 SYSTEM "https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RF | ||||
| C.8305.xml"> | ||||
| <!ENTITY I-D.ietf-taps-impl SYSTEM "https://xml2rfc.ietf.org/public/rfc/bibxml3/ | ||||
| reference.I-D.ietf-taps-impl.xml"> | ||||
| ]> | ||||
| <rfc submissionType="IETF" docName="draft-ietf-tls-ticketrequests-07" category=" | ||||
| std" ipr="trust200902"> | ||||
| <!-- Generated by id2xml 1.5.0 on 2021-04-02T20:38:38Z --> | ||||
| <?rfc strict="yes"?> | ||||
| <?rfc compact="yes"?> | ||||
| <?rfc subcompact="no"?> | ||||
| <?rfc symrefs="yes"?> | ||||
| <?rfc sortrefs="no"?> | ||||
| <?rfc text-list-symbols="*o+-"?> | ||||
| <?rfc toc="yes"?> | ||||
| <front> | ||||
| <title>TLS Ticket Requests</title> | ||||
| <author initials="T." surname="Pauly" fullname="Tommy Pauly"> | ||||
| <organization>Apple Inc.</organization> | ||||
| <address><postal><street>One Apple Park Way</street> | ||||
| <street>Cupertino, California 95014,</street> | ||||
| <street>United States of America</street> | ||||
| </postal> | ||||
| <email>tpauly@apple.com</email> | ||||
| </address> | ||||
| </author> | ||||
| <author initials="D." surname="Schinazi" fullname="David Schinazi"> | <!DOCTYPE rfc SYSTEM "rfc2629-xhtml.ent"> | |||
| <organization>Google LLC</organization> | ||||
| <address><postal><street>1600 Amphitheatre Parkway</street> | ||||
| <street>Mountain View, California 94043,</street> | ||||
| <street>United States of America</street> | ||||
| </postal> | ||||
| <email>dschinazi.ietf@gmail.com</email> | ||||
| </address> | ||||
| </author> | ||||
| <author initials="C.A." surname="Wood" fullname="Christopher A. Wood"> | <rfc xmlns:xi="http://www.w3.org/2001/XInclude" docName="draft-ietf-tls-ticketre | |||
| <organization>Cloudflare</organization> | quests-07" number="9149" submissionType="IETF" category="std" consensus="true" i | |||
| <address><postal><street>101 Townsend St</street> | pr="trust200902" obsoletes="" updates="" xml:lang="en" symRefs="true" sortRefs=" | |||
| <street>San Francisco,</street> | true" tocInclude="true" | |||
| <street>United States of America</street> | version="3"> | |||
| </postal> | ||||
| <email>caw@heapingbits.net</email> | ||||
| </address> | ||||
| </author> | ||||
| <date year="2020" month="December"/> | <!-- [rfced] FYI: This document normatively references RFC-to-be 9147 | |||
| <abstract><t> | (draft-ietf-tls-dtls13), which will enter AUTH48 soon. If this document | |||
| is ready for publication before RFC-to-be 9147 (i.e., all questions have | ||||
| been addressed and all authors have approved), we will wait to publish | ||||
| until RFC-to-be 9147 is also ready. | ||||
| --> | ||||
| <front> | ||||
| <title>TLS Ticket Requests</title> | ||||
| <seriesInfo name="RFC" value="9149"/> | ||||
| <author initials="T." surname="Pauly" fullname="Tommy Pauly"> | ||||
| <organization>Apple Inc.</organization> | ||||
| <address> | ||||
| <postal> | ||||
| <street>One Apple Park Way</street> | ||||
| <city>Cupertino</city> | ||||
| <region>CA</region> | ||||
| <code>95014</code> | ||||
| <country>United States of America</country> | ||||
| </postal> | ||||
| <email>tpauly@apple.com</email> | ||||
| </address> | ||||
| </author> | ||||
| <author initials="D." surname="Schinazi" fullname="David Schinazi"> | ||||
| <organization>Google LLC</organization> | ||||
| <address> | ||||
| <postal> | ||||
| <street>1600 Amphitheatre Parkway</street> | ||||
| <city>Mountain View</city> | ||||
| <region>CA</region> | ||||
| <code>94043</code> | ||||
| <country>United States of America</country> | ||||
| </postal> | ||||
| <email>dschinazi.ietf@gmail.com</email> | ||||
| </address> | ||||
| </author> | ||||
| <author initials="C.A." surname="Wood" fullname="Christopher A. Wood"> | ||||
| <organization>Cloudflare</organization> | ||||
| <address> | ||||
| <postal> | ||||
| <street>101 Townsend St</street> | ||||
| <city>San Francisco</city> | ||||
| <region>CA</region> | ||||
| <code>94107</code> | ||||
| <country>United States of America</country> | ||||
| </postal> | ||||
| <email>caw@heapingbits.net</email> | ||||
| </address> | ||||
| </author> | ||||
| <date year="2021" month="August"/> | ||||
| <keyword>TLS</keyword> | ||||
| <keyword>Tickets</keyword> | ||||
| <abstract> | ||||
| <t> | ||||
| TLS session tickets enable stateless connection resumption for | TLS session tickets enable stateless connection resumption for | |||
| clients without server-side, per-client, state. Servers vend an | clients without server-side, per-client state. Servers vend an | |||
| arbitrary number of session tickets to clients, at their discretion, | arbitrary number of session tickets to clients, at their discretion, | |||
| upon connection establishment. Clients store and use tickets when | upon connection establishment. Clients store and use tickets when | |||
| resuming future connections. This document describes a mechanism by | resuming future connections. This document describes a mechanism by | |||
| which clients can specify the desired number of tickets needed for | which clients can specify the desired number of tickets needed for | |||
| future connections. This extension aims to provide a means for | future connections. This extension aims to provide a means for | |||
| servers to determine the number of tickets to generate in order to | servers to determine the number of tickets to generate in order to | |||
| reduce ticket waste, while simultaneously priming clients for future | reduce ticket waste while simultaneously priming clients for future | |||
| connection attempts.</t> | connection attempts.</t> | |||
| </abstract> | ||||
| </abstract> | </front> | |||
| <note title="Discussion Venues"><t> | <middle> | |||
| This note is to be removed before publishing as an RFC.</t> | <section anchor="sect-1" numbered="true" toc="default"> | |||
| <name>Introduction</name> | ||||
| <t> | ||||
| Source for this draft and an issue tracker can be found at | ||||
| <eref target="https://github.com/tlswg/draft-ietf-tls-ticketrequest"/>. | ||||
| </t> | ||||
| </note> | ||||
| </front> | ||||
| <middle> | ||||
| <section title="Introduction" anchor="sect-1"><t> | ||||
| As as described in <xref target="RFC8446"/>, TLS servers vend clients an arbi | ||||
| trary | ||||
| number of session tickets at their own discretion in NewSessionTicket | ||||
| messages. There are at least three limitations with this design.</t> | ||||
| <t> | <t> | |||
| As described in <xref target="RFC8446" format="default"/>, TLS servers | ||||
| vend clients an arbitrary number of session tickets at their own discretion | ||||
| in NewSessionTicket messages. There are at least three limitations with | ||||
| this design.</t> | ||||
| <t> | ||||
| First, servers vend some (often hard-coded) number of tickets per | First, servers vend some (often hard-coded) number of tickets per | |||
| connection. Some server implementations return a different default | connection. Some server implementations return a different default number | |||
| number of tickets for session resumption than for the initial | of tickets for session resumption than for the initial connection that | |||
| connection that created the session. No static choice, whether | created the session. No static choice, whether fixed or dependent upon | |||
| fixed, or resumption-dependent is ideal for all situations.</t> | resumption, is ideal for all situations.</t> | |||
| <t> | ||||
| <t> | Second, clients do not have a way of expressing their desired number of | |||
| Second, clients do not have a way of expressing their desired number | tickets, which can impact future connection establishment. For example, | |||
| of tickets, which can impact future connection establishment. For | clients can open parallel TLS connections to the same server for HTTP, or | |||
| example, clients can open parallel TLS connections to the same server | they can race TLS connections across different network interfaces. The | |||
| for HTTP, or race TLS connections across different network | latter is especially useful in transport systems that implement Happy | |||
| interfaces. The latter is especially useful in transport systems | Eyeballs <xref target="RFC8305" format="default"/>. Since clients control | |||
| that implement Happy Eyeballs <xref target="RFC8305"/>. Since clients contro | connection concurrency and resumption, a standard mechanism for requesting | |||
| l | more than one ticket is desirable for avoiding ticket reuse. See <xref | |||
| connection concurrency and resumption, a standard mechanism for | target="RFC8446" sectionFormat="of" section="C.4" format="default"/> for | |||
| requesting more than one ticket is desirable for avoiding ticket | discussion of ticket reuse risks.</t> | |||
| reuse. See <xref target="RFC8446"/>, Appendix C.4 for discussion of ticket r | <t> | |||
| euse | ||||
| risks.</t> | ||||
| <t> | ||||
| Third, all tickets in the client's possession ultimately derive from | Third, all tickets in the client's possession ultimately derive from | |||
| some initial connection. Especially when the client was initially | some initial connection. Especially when the client was initially | |||
| authenticated with a client certificate, that session may need to be | authenticated with a client certificate, that session may need to be | |||
| refreshed from time to time. Consequently, a server may periodically | refreshed from time to time. Consequently, a server may periodically | |||
| force a new connection even when the client presents a valid ticket. | force a new connection even when the client presents a valid ticket. | |||
| When that happens, it is possible that any other tickets derived from | When that happens, it is possible that any other tickets derived from | |||
| the same original session are equally invalid. A client avoids a | the same original session are equally invalid. A client avoids a | |||
| full handshake on subsequent connections if it replaces all stored | full handshake on subsequent connections if it replaces all stored | |||
| tickets with new ones obtained from the just performed full | tickets with new ones obtained from the just-performed full | |||
| handshake. The number of tickets the server should vend for a new | handshake. The number of tickets the server should vend for a new | |||
| connection may therefore need to be larger than the number for | connection may therefore need to be larger than the number for | |||
| routine resumption.</t> | routine resumption.</t> | |||
| <t> | ||||
| <t> | This document specifies a new TLS extension, "ticket_request", that | |||
| This document specifies a new TLS extension - "ticket_request" - that | ||||
| clients can use to express their desired number of session tickets. | clients can use to express their desired number of session tickets. | |||
| Servers can use this extension as a hint for the number of NewSessionTicket | Servers can use this extension as a hint for the number of NewSessionTicket | |||
| messages to vend. This extension is only applicable to TLS 1.3 <xref | messages to vend. This extension is only applicable to TLS 1.3 <xref target= | |||
| target="RFC8446"/>, DTLS 1.3 <xref target="I-D.ietf-tls-dtls13"/>, and | "RFC8446" format="default"/>, DTLS 1.3 <xref target="RFC9147" format="default"/> | |||
| , and | ||||
| future versions of (D)TLS.</t> | future versions of (D)TLS.</t> | |||
| <section anchor="sect-1.1" numbered="true" toc="default"> | ||||
| <name>Requirements Language</name> | ||||
| <section title="Requirements Language" anchor="sect-1.1"><t> The key | <t> | |||
| words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", | The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQU | |||
| "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" | IRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL | |||
| in this document are to be interpreted as described in <xref | NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14> | |||
| target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they | RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>", | |||
| appear in all capitals, as shown here.</t> | "<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to | |||
| be interpreted as | ||||
| </section> | described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> | |||
| when, and only when, they appear in all capitals, as shown here. | ||||
| </section> | </t> | |||
| <section title="Use Cases" anchor="sect-2"><t> | </section> | |||
| </section> | ||||
| <section anchor="sect-2" numbered="true" toc="default"> | ||||
| <name>Use Cases</name> | ||||
| <t> | ||||
| The ability to request one or more tickets is useful for a variety of | The ability to request one or more tickets is useful for a variety of | |||
| purposes:</t> | purposes:</t> | |||
| <t><list style="symbols"><t>Parallel HTTP connections: To improve perform | <dl> | |||
| ance, a client may | ||||
| open parallel connections. To avoid ticket reuse, the client may | ||||
| use distinct tickets on each connection. Clients must therefore | ||||
| bound the number of parallel connections they initiate by the | ||||
| number of tickets in their possession, or risk ticket re-use.</t> | ||||
| <t>Connection racing: Happy Eyeballs V2 <xref target="RFC8305"/> describe | <dt>Parallel HTTP connections: | |||
| s | </dt> | |||
| techniques for performing connection racing. The Transport | <dd>To improve performance, a client may open parallel connections. To avoid | |||
| Services Architecture implementation from <xref target="I-D.ietf-taps-impl | ticket reuse, the client may use distinct tickets on each connection. Clients | |||
| "/> also describes | must therefore bound the number of parallel connections they initiate by the | |||
| how connections can race across interfaces and address families. | number of tickets in their possession or risk ticket reuse. | |||
| In such cases, clients may use more than one ticket while racing | </dd> | |||
| connection attempts in order to establish one successful | ||||
| connection. Having multiple tickets equips clients with enough | ||||
| tickets to initiate connection racing while avoiding ticket re-use | ||||
| and ensuring that their cache of tickets does not empty during | ||||
| such races. Moreover, as some servers may implement single-use | ||||
| tickets, distinct tickets prevent premature ticket invalidation by | ||||
| racing.</t> | ||||
| <t>Less ticket waste: Currently, TLS servers use application-specific, an | <dt>Connection racing: | |||
| d | </dt> | |||
| often implementation-specific, logic to determine how many tickets to | ||||
| issue. By moving the burden of ticket count to clients, servers do not | ||||
| generate wasteful tickets. As an example, clients might only request | ||||
| one ticket during resumption. Moreover, as ticket generation might | ||||
| involve expensive computation, e.g., public key cryptographic | ||||
| operations, avoiding waste is desirable.</t> | ||||
| <t>Decline resumption: Clients can indicate they do not intend to | <dd>Happy Eyeballs V2 <xref target="RFC8305" format="default"/> describes | |||
| resume a connection by sending a ticket request with count of | techniques for performing connection racing. The Transport Services | |||
| zero.</t> | Implementation document <xref target="I-D.ietf-taps-impl" format="default"/> | |||
| also describes how connections can race across interfaces and address | ||||
| families. In such cases, clients may use more than one ticket while racing | ||||
| connection attempts in order to establish one successful connection. Having | ||||
| multiple tickets equips clients with enough tickets to initiate connection | ||||
| racing while avoiding ticket reuse and ensuring that their cache of tickets | ||||
| does not empty during such races. Moreover, as some servers may implement | ||||
| single-use tickets, distinct tickets prevent premature ticket invalidation by | ||||
| racing. | ||||
| </dd> | ||||
| </list> | <dt>Less ticket waste: | |||
| </t> | </dt> | |||
| <dd>Currently, TLS servers use application-specific, and often | ||||
| implementation-specific, logic to determine how many tickets to issue. By | ||||
| moving the burden of ticket count to clients, servers do not generate wasteful | ||||
| tickets. As an example, clients might only request one ticket during | ||||
| resumption. Moreover, as ticket generation might involve expensive | ||||
| computation, e.g., public key cryptographic operations, avoiding waste is | ||||
| desirable. | ||||
| </dd> | ||||
| </section> | <dt>Decline resumption:</dt> | |||
| <dd>Clients can indicate they do not intend to resume a connection by sending | ||||
| a ticket request with count of zero. | ||||
| </dd> | ||||
| <section title="Ticket Requests" anchor="sect-3"><t> | </dl> | |||
| As discussed in <xref target="sect-1"/>, clients may want different numbers o | ||||
| f | </section> | |||
| <section anchor="sect-3" numbered="true" toc="default"> | ||||
| <name>Ticket Requests</name> | ||||
| <t> | ||||
| As discussed in <xref target="sect-1" format="default"/>, clients may want di | ||||
| fferent numbers of | ||||
| tickets for new or resumed connections. Clients may indicate to | tickets for new or resumed connections. Clients may indicate to | |||
| servers their desired number of tickets to receive on a single | servers their desired number of tickets to receive on a single | |||
| connection, in the case of a new or resumed connection, via the | connection, in the case of a new or resumed connection, via the | |||
| following "ticket_request" extension:</t> | following "ticket_request" extension:</t> | |||
| <figure><artwork><![CDATA[ | <!-- [rfced] Please review the <sourcecode> elements in this document and let | |||
| us know if a type from the list at | ||||
| https://www.rfc-editor.org/materials/sourcecode-types.txt should be | ||||
| entered in the "type" attribute of each element. Note that it is okay to | ||||
| leave this attribute empty. | ||||
| --> | ||||
| <sourcecode type="tls-presentation"><![CDATA[ | ||||
| enum { | enum { | |||
| ticket_request(TBD), (65535) | ticket_request(58), (65535) | |||
| } ExtensionType; | } ExtensionType; | |||
| ]]></artwork> | ]]></sourcecode> | |||
| </figure> | <t> | |||
| <t> | Clients <bcp14>MAY</bcp14> send this extension in ClientHello. It contains t | |||
| Clients MAY send this extension in ClientHello. It contains the | he | |||
| following structure:</t> | following structure:</t> | |||
| <sourcecode type="tls-presentation"><![CDATA[ | ||||
| <figure><artwork><![CDATA[ | ||||
| struct { | struct { | |||
| uint8 new_session_count; | uint8 new_session_count; | |||
| uint8 resumption_count; | uint8 resumption_count; | |||
| } ClientTicketRequest; | } ClientTicketRequest; | |||
| ]]></artwork> | ]]></sourcecode> | |||
| </figure> | <dl newline="false" spacing="normal" indent="3"> | |||
| <t><list style="hanging" hangIndent="3"><t hangText="new_session_count"> | <dt>new_session_count:</dt> | |||
| <dd> | ||||
| The number of tickets desired by the client if the server chooses to | The number of tickets desired by the client if the server chooses to | |||
| negotiate a new connection. | negotiate a new connection. | |||
| </t> | </dd> | |||
| <dt>resumption_count:</dt> | ||||
| <t hangText="resumption_count"> | <dd> | |||
| The number of tickets desired by the client if the | The number of tickets desired by the client if the server is willing | |||
| server is willing to resume using a ticket presented in this | to resume using a ticket presented in this ClientHello. | |||
| ClientHello. | </dd> | |||
| </t> | </dl> | |||
| <t> | ||||
| </list> | A client starting a new connection <bcp14>SHOULD</bcp14> set new_session_coun | |||
| </t> | t to | |||
| <t> | ||||
| A client starting a new connection SHOULD set new_session_count to | ||||
| the desired number of session tickets and resumption_count to 0. | the desired number of session tickets and resumption_count to 0. | |||
| Once a client's ticket cache is primed, a resumption_count of 1 is a | Once a client's ticket cache is primed, a resumption_count of 1 is a | |||
| good choice that allows the server to replace each ticket with a new | good choice that allows the server to replace each ticket with a new | |||
| ticket, without over-provisioning the client with excess tickets. | ticket without over-provisioning the client with excess tickets. | |||
| However, clients which race multiple connections and place a separate | However, clients that race multiple connections and place a separate | |||
| ticket in each will ultimately end up with just the tickets from a | ticket in each will ultimately end up with just the tickets from a | |||
| single resumed session. In that case, clients can send a | single resumed session. In that case, clients can send a | |||
| resumption_count equal to the number of connections they are | resumption_count equal to the number of connections they are | |||
| attempting in parallel. (Clients which send a resumption_count less | attempting in parallel. (Clients that send a resumption_count less | |||
| than the number of parallel connection attempts might end up with | than the number of parallel connection attempts might end up with | |||
| zero tickets.)</t> | zero tickets.)</t> | |||
| <t> | ||||
| <t> | ||||
| When a client presenting a previously obtained ticket finds that the | When a client presenting a previously obtained ticket finds that the | |||
| server nevertheless negotiates a new connection, the client SHOULD | server nevertheless negotiates a new connection, the client <bcp14>SHOULD</bc p14> | |||
| assume that any other tickets associated with the same session as the | assume that any other tickets associated with the same session as the | |||
| presented ticket are also no longer valid for resumption. This | presented ticket are also no longer valid for resumption. This | |||
| includes tickets obtained during the initial (new) connection and all | includes tickets obtained during the initial (new) connection and all | |||
| tickets subsequently obtained as part of subsequent resumptions. | tickets subsequently obtained as part of subsequent resumptions. | |||
| Requesting more than one ticket in cases when servers complete a new | Requesting more than one ticket when servers complete a new | |||
| connection helps keep the session cache primed.</t> | connection helps keep the session cache primed.</t> | |||
| <t> | ||||
| <t> | Servers <bcp14>SHOULD NOT</bcp14> send more tickets than requested for the | |||
| Servers SHOULD NOT send more tickets than requested for the | ||||
| connection type selected by the server (new or resumed connection). | connection type selected by the server (new or resumed connection). | |||
| Moreover, servers SHOULD place a limit on the number of tickets they | Moreover, servers <bcp14>SHOULD</bcp14> place a limit on the number of ticket s they | |||
| are willing to send, whether for new or resumed connections, to save | are willing to send, whether for new or resumed connections, to save | |||
| resources. Therefore, the number of NewSessionTicket messages sent | resources. Therefore, the number of NewSessionTicket messages sent | |||
| will typically be the minimum of the server's self-imposed limit and | will typically be the minimum of the server's self-imposed limit and | |||
| the number requested. Servers MAY send additional tickets, typically | the number requested. Servers <bcp14>MAY</bcp14> send additional tickets, ty pically | |||
| using the same limit, if the tickets that are originally sent are | using the same limit, if the tickets that are originally sent are | |||
| somehow invalidated.</t> | somehow invalidated.</t> | |||
| <t> | ||||
| <t> | A server that supports and uses a client "ticket_request" extension | |||
| A server which supports and uses a client "ticket_request" extension | <bcp14>MUST</bcp14> also send the "ticket_request" extension in the | |||
| MUST also send the "ticket_request" extension in the | ||||
| EncryptedExtensions message. It contains the following structure:</t> | EncryptedExtensions message. It contains the following structure:</t> | |||
| <sourcecode type="tls-presentation"> | ||||
| <figure><artwork><![CDATA[ | <![CDATA[struct { | |||
| struct { | ||||
| uint8 expected_count; | uint8 expected_count; | |||
| } ServerTicketRequestHint; | } ServerTicketRequestHint; | |||
| ]]></artwork> | ]]></sourcecode> | |||
| </figure> | <dl newline="false" spacing="normal" indent="3"> | |||
| <t><list style="hanging" hangIndent="3"><t hangText="expected_count"> | <dt>expected_count:</dt> | |||
| <dd> | ||||
| The number of tickets the server expects to send in this connection. | The number of tickets the server expects to send in this connection. | |||
| </t> | </dd> | |||
| </dl> | ||||
| </list> | <t> | |||
| </t> | Servers <bcp14>MUST NOT</bcp14> send the "ticket_request" extension in any ha | |||
| ndshake | ||||
| <t> | ||||
| Servers MUST NOT send the "ticket_request" extension in any handshake | ||||
| message, including ServerHello or HelloRetryRequest messages. A | message, including ServerHello or HelloRetryRequest messages. A | |||
| client MUST abort the connection with an "illegal_parameter" alert if | client <bcp14>MUST</bcp14> abort the connection with an "illegal_parameter" a lert if | |||
| the "ticket_request" extension is present in any server handshake | the "ticket_request" extension is present in any server handshake | |||
| message.</t> | message.</t> | |||
| <t> | ||||
| <t> | ||||
| If a client receives a HelloRetryRequest, the presence (or absence) | If a client receives a HelloRetryRequest, the presence (or absence) | |||
| of the "ticket_request" extension MUST be maintained in the second | of the "ticket_request" extension <bcp14>MUST</bcp14> be maintained in the se cond | |||
| ClientHello message. Moreover, if this extension is present, a | ClientHello message. Moreover, if this extension is present, a | |||
| client MUST NOT change the value of ClientTicketRequest in the second | client <bcp14>MUST NOT</bcp14> change the value of ClientTicketRequest in the second | |||
| ClientHello message.</t> | ClientHello message.</t> | |||
| </section> | ||||
| <section anchor="sect-4" numbered="true" toc="default"> | ||||
| <name>IANA Considerations</name> | ||||
| </section> | <t> | |||
| IANA has added the following entry to the "TLS ExtensionType Values" | ||||
| <section title="IANA Considerations" anchor="sect-4"><t> | registry <xref target="RFC8446" format="default"/> <xref target="RFC8447" | |||
| IANA is requested to create an entry, ticket_request(TBD), in the | format="default"/>:</t> | |||
| existing registry for ExtensionType (defined in <xref target="RFC8446"/>), wi | ||||
| th "TLS 1.3" column values being set to "CH, EE", and "Recommended" column | ||||
| being set to "Y".</t> | ||||
| </section> | <table anchor="iana_table"> | |||
| <name>Addition to TLS ExtensionType Values Registry</name> | ||||
| <thead> | ||||
| <tr> | ||||
| <th>Value</th> | ||||
| <th>Extension Name</th> | ||||
| <th>TLS 1.3</th> | ||||
| <th>DTLS-Only</th> | ||||
| <th>Recommended</th> | ||||
| </tr> | ||||
| </thead> | ||||
| <tbody> | ||||
| <tr> | ||||
| <td>58</td> | ||||
| <td>ticket_request</td> | ||||
| <td>CH, EE</td> | ||||
| <td>N</td> | ||||
| <td>Y</td> | ||||
| </tr> | ||||
| </tbody> | ||||
| </table> | ||||
| <section title="Performance Considerations" anchor="sect-5"><t> | </section> | |||
| <section anchor="sect-5" numbered="true" toc="default"> | ||||
| <name>Performance Considerations</name> | ||||
| <t> | ||||
| Servers can send tickets in NewSessionTicket messages any time after | Servers can send tickets in NewSessionTicket messages any time after | |||
| the server Finished message (see <xref target="RFC8446"/>; Section 4.6.1). A | the server Finished message (see <xref target="RFC8446" section="4.6.1" secti | |||
| server | onFormat="of" format="default"/>). A server | |||
| which chooses to send a large number of tickets to a client can | that chooses to send a large number of tickets to a client can | |||
| potentially harm application performance if the tickets are sent | potentially harm application performance if the tickets are sent | |||
| before application data. For example, if the transport connection | before application data. For example, if the transport connection | |||
| has a constrained congestion window, ticket messages could delay | has a constrained congestion window, ticket messages could delay | |||
| sending application data. To avoid this, servers should prioritize | sending application data. To avoid this, servers should prioritize | |||
| sending application data over tickets when possible.</t> | sending application data over tickets when possible.</t> | |||
| </section> | ||||
| <section anchor="sect-6" numbered="true" toc="default"> | ||||
| <name>Security Considerations</name> | ||||
| <t> | ||||
| Ticket reuse is a security and privacy concern. Moreover, clients must | ||||
| take care when pooling tickets as a means of avoiding or amortizing | ||||
| handshake costs. If servers do not rotate session ticket encryption keys | ||||
| frequently, clients may be encouraged to obtain and use tickets beyond | ||||
| common lifetime windows of, e.g., 24 hours. Despite ticket lifetime hints | ||||
| provided by servers, clients <bcp14>SHOULD</bcp14> dispose of cached | ||||
| tickets after some reasonable amount of time that mimics the session ticket | ||||
| encryption key rotation period. Specifically, as specified in <xref | ||||
| target="RFC8446" sectionFormat="of" section="4.6.1" format="default"/>, | ||||
| clients <bcp14>MUST NOT</bcp14> cache tickets for longer than 7 days.</t> | ||||
| </section> | <t> | |||
| In some cases, a server may send NewSessionTicket messages immediately upon | ||||
| <section title="Security Considerations" anchor="sect-6"><t> | sending the server Finished message rather than waiting for the client | |||
| Ticket re-use is a security and privacy concern. Moreover, clients | Finished message. If the server has not verified the client's ownership of i | |||
| must take care when pooling tickets as a means of avoiding or | ts IP | |||
| amortizing handshake costs. If servers do not rotate session ticket | address, e.g., with the TLS cookie extension (see <xref target="RFC8446" | |||
| encryption keys frequently, clients may be encouraged to obtain and | sectionFormat="of" section="4.2.2" format="default"/>), an attacker may | |||
| use tickets beyond common lifetime windows of, e.g., 24 hours. | take advantage of this behavior to create an amplification attack | |||
| Despite ticket lifetime hints provided by servers, clients SHOULD | proportional to the count value toward a target by performing a (DTLS) key | |||
| dispose of cached tickets after some reasonable amount of time that | exchange over UDP with spoofed packets. Servers <bcp14>SHOULD</bcp14> | |||
| mimics the session ticket encryption key rotation period. | limit the number of NewSessionTicket messages they send until they have | |||
| Specifically, as specified in Section 4.6.1 of <xref target="RFC8446"/>, clie | verified the client's ownership of its IP address.</t> | |||
| nts | <t> | |||
| MUST NOT cache tickets for longer than 7 days.</t> | ||||
| <t> | ||||
| In some cases, a server may send NewSessionTicket messages | ||||
| immediately upon sending the server Finished message rather than | ||||
| waiting for the client Finished. If the server has not verified the | ||||
| client's ownership of its IP address, e.g., with the TLS Cookie | ||||
| extension (see <xref target="RFC8446"/>; Section 4.2.2), an attacker may take | ||||
| advantage of this behavior to create an amplification attack | ||||
| proportional to the count value toward a target by performing a | ||||
| (DTLS) key exchange over UDP with spoofed packets. Servers SHOULD | ||||
| limit the number of NewSessionTicket messages they send until they | ||||
| have verified the client's ownership of its IP address.</t> | ||||
| <t> | ||||
| Servers that do not enforce a limit on the number of NewSessionTicket | Servers that do not enforce a limit on the number of NewSessionTicket | |||
| messages sent in response to a "ticket_request" extension could leave | messages sent in response to a "ticket_request" extension could leave | |||
| themselves open to DoS attacks, especially if ticket creation is | themselves open to DoS attacks, especially if ticket creation is | |||
| expensive.</t> | expensive.</t> | |||
| </section> | ||||
| </section> | </middle> | |||
| <back> | ||||
| <section title="Acknowledgments" anchor="sect-7"><t> | <displayreference target="I-D.ietf-taps-impl" to="TAPS"/> | |||
| The authors would like to thank David Benjamin, Eric Rescorla, Nick | ||||
| Sullivan, Martin Thomson, Hubert Kario, and other members of the TLS | ||||
| Working Group for discussions on earlier versions of this draft. | ||||
| Viktor Dukhovni contributed text allowing clients to send multiple | ||||
| counts in a ticket request.</t> | ||||
| </section> | <references> | |||
| <name>References</name> | ||||
| <references> | ||||
| <name>Normative References</name> | ||||
| </middle> | <!-- [I-D.ietf-tls-dtls13] companion document RFC-to-be 9147 --> | |||
| <back> | <reference anchor='RFC9147'> | |||
| <references title="Normative References"> | <front> | |||
| &I-D.ietf-tls-dtls13; | <title>The Datagram Transport Layer Security (DTLS) Protocol Version 1.3</title> | |||
| &RFC2119; | ||||
| &RFC8174; | ||||
| &RFC8446; | ||||
| </references> | ||||
| <references title="Informative References"> | ||||
| &RFC8305; | ||||
| &I-D.ietf-taps-impl; | ||||
| </references> | ||||
| </back> | ||||
| </rfc> | <author initials='E' surname='Rescorla' fullname='Eric Rescorla'> | |||
| <organization /> | ||||
| </author> | ||||
| <author initials='H' surname='Tschofenig' fullname='Hannes Tschofenig'> | ||||
| <organization /> | ||||
| </author> | ||||
| <author initials='N' surname='Modadugu' fullname='Nagendra Modadugu'> | ||||
| <organization /> | ||||
| </author> | ||||
| <date month='August' year='2021' /> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="9147"/> | ||||
| <seriesInfo name="DOI" value="10.17487/RFC9147"/> | ||||
| </reference> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
| FC.2119.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
| FC.8174.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
| FC.8446.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
| FC.8447.xml"/> | ||||
| </references> | ||||
| <references> | ||||
| <name>Informative References</name> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
| FC.8305.xml"/> | ||||
| <!-- [I-D.ietf-taps-impl] IESG state I-D Exists --> | ||||
| <reference anchor='I-D.ietf-taps-impl'> | ||||
| <front> | ||||
| <title>Implementing Interfaces to Transport Services</title> | ||||
| <author initials='A' surname='Brunstrom' fullname='Anna Brunstrom' role="editor" | ||||
| > | ||||
| <organization /> | ||||
| </author> | ||||
| <author initials='T' surname='Pauly' fullname='Tommy Pauly' role="editor"> | ||||
| <organization /> | ||||
| </author> | ||||
| <author initials='T' surname='Enghardt' fullname='Theresa Enghardt'> | ||||
| <organization /> | ||||
| </author> | ||||
| <author initials='K-J' surname='Grinnemo' fullname='Karl-Johan Grinnemo'> | ||||
| <organization /> | ||||
| </author> | ||||
| <author initials='T' surname='Jones' fullname='Tom Jones'> | ||||
| <organization /> | ||||
| </author> | ||||
| <author initials='P' surname='Tiesel' fullname='Philipp Tiesel'> | ||||
| <organization /> | ||||
| </author> | ||||
| <author initials='C' surname='Perkins' fullname='Colin Perkins'> | ||||
| <organization /> | ||||
| </author> | ||||
| <author initials='M' surname='Welzl' fullname='Michael Welzl'> | ||||
| <organization /> | ||||
| </author> | ||||
| <date month='July' day='12' year='2021' /> | ||||
| </front> | ||||
| <seriesInfo name='Internet-Draft' value='draft-ietf-taps-impl-10' /> | ||||
| </reference> | ||||
| </references> | ||||
| </references> | ||||
| <section anchor="sect-7" numbered="false" toc="default"> | ||||
| <name>Acknowledgements</name> | ||||
| <t> | ||||
| The authors would like to thank <contact fullname="David Benjamin"/>, | ||||
| <contact fullname="Eric Rescorla"/>, <contact fullname="Nick Sullivan"/>, | ||||
| <contact fullname="Martin Thomson"/>, <contact fullname="Hubert Kario"/>, | ||||
| and other members of the TLS Working Group for discussions on earlier draft | ||||
| versions of this document. <contact fullname="Viktor Dukhovni"/> | ||||
| contributed text allowing clients to send multiple counts in a ticket | ||||
| request.</t> | ||||
| </section> | ||||
| </back> | ||||
| </rfc> | ||||
| End of changes. 59 change blocks. | ||||
| 270 lines changed or deleted | 289 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/ | ||||