<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc2629 version 1.2.13 -->
<?rfc toc="yes"?>
<?rfc sortrefs="yes"?>
<?rfc symrefs="yes"?>
<?rfc-ext html-pretty-print="prettyprint https://cdn.rawgit.com/google/code-prettify/master/loader/run_prettify.js"?>
<!DOCTYPE rfc [
  <!ENTITY MAY "<bcp14>MAY</bcp14>">
  <!ENTITY MUST "<bcp14>MUST</bcp14>">
  <!ENTITY MUST-NOT "<bcp14>MUST NOT</bcp14>">
  <!ENTITY OPTIONAL "<bcp14>OPTIONAL</bcp14>">
  <!ENTITY NOT-RECOMMENDED "<bcp14>NOT RECOMMENDED</bcp14>">
  <!ENTITY RECOMMENDED "<bcp14>RECOMMENDED</bcp14>">
  <!ENTITY REQUIRED "<bcp14>REQUIRED</bcp14>">
  <!ENTITY SHALL "<bcp14>SHALL</bcp14>">
  <!ENTITY SHALL-NOT "<bcp14>SHALL NOT</bcp14>">
  <!ENTITY SHOULD "<bcp14>SHOULD</bcp14>">
  <!ENTITY SHOULD-NOT "<bcp14>SHOULD NOT</bcp14>">
]>
<rfc xmlns:x="http://purl.org/net/xml2rfc/ext"
     category="std"
     ipr="trust200902"
     number="8740"
     submissionType="IETF"
     updates="7540">
   <front>
      <title>Using TLS 1.3 with HTTP/2</title>
      <author fullname="David Benjamin" initials="D." surname="Benjamin">
         <organization>Google LLC</organization>
         <address>
            <email>davidben@google.com</email>
         </address>
      </author>
      <date month="February" year="2020"/>
      <area>Applications and Real-Time</area>
      <workgroup>HTTP</workgroup>
      <abstract>
         <t>This document updates RFC 7540 by forbidding TLS 1.3 post-handshake authentication, as an analog to the existing TLS 1.2 renegotiation restriction.</t>
      </abstract>
   </front>
   <middle>
      <section anchor="introduction" title="Introduction">
         <t>TLS 1.2 <xref target="RFC5246"/> and earlier versions of TLS support renegotiation, a mechanism for changing parameters and keys partway through a connection. This was sometimes used to implement reactive client authentication in HTTP/1.1 <xref target="RFC7230"/>, where the server decides whether or not to request a client certificate based on the HTTP request.</t>
         <t>HTTP/2 <xref target="RFC7540"/> multiplexes multiple HTTP requests over a single connection, which is incompatible with the mechanism above. Clients cannot correlate the certificate request with the HTTP request that triggered it. Thus, <xref target="RFC7540" x:fmt="of" x:sec="9.2.1"/> forbids renegotiation.</t>
         <t>TLS 1.3 <xref target="RFC8446"/> removes renegotiation and replaces it with separate post-handshake authentication and key update mechanisms. Post-handshake authentication has the same problems with multiplexed protocols as TLS 1.2 renegotiation, but the prohibition in <xref target="RFC7540"/> only applies to renegotiation.</t>
         <t>This document updates HTTP/2 <xref target="RFC7540"/> to similarly forbid TLS 1.3 post-handshake authentication.</t>
      </section>
      <section anchor="requirements-language" title="Requirements Language">
         <t>The key words “&MUST;”, “&MUST-NOT;”, “&REQUIRED;”, “&SHALL;”, “&SHALL-NOT;”, “&SHOULD;”, “&SHOULD-NOT;”, “&RECOMMENDED;”, “&NOT-RECOMMENDED;”, “&MAY;”, and “&OPTIONAL;” in this document are to be interpreted as described in BCP 14 <xref target="RFC2119"/>
            <xref target="RFC8174"/> when, and only when, they appear in all capitals, as shown here.</t>
      </section>
      <section anchor="post-handshake-authentication-in-http2"
               title="Post-Handshake Authentication in HTTP/2">
         <t>HTTP/2 servers &MUST-NOT; send post-handshake TLS 1.3 CertificateRequest messages. HTTP/2 clients &MUST; treat such messages as connection errors (see <xref target="RFC7540" x:fmt="of" x:sec="5.4.1"/>) of type PROTOCOL_ERROR.</t>
         <t>
            <xref target="RFC7540"/> permitted renegotiation before the HTTP/2 connection preface to provide confidentiality of the client certificate. TLS 1.3 encrypts the client certificate in the initial handshake, so this is no longer necessary. HTTP/2 servers &MUST-NOT; send post-handshake TLS 1.3 CertificateRequest messages before the connection preface.</t>
         <t>The above applies even if the client offered the <spanx style="verb">post_handshake_auth</spanx> TLS extension. This extension is advertised independently of the selected Application-Layer Protocol Negotiation (ALPN) protocol <xref target="RFC7301"/>, so it is not sufficient to resolve the conflict with HTTP/2. HTTP/2 clients that also offer other ALPN protocols, notably HTTP/1.1, in a TLS ClientHello &MAY; include the <spanx style="verb">post_handshake_auth</spanx> extension to support those other protocols. This does not indicate support in HTTP/2.</t>
      </section>
      <section anchor="other-post-handshake-tls-messages-in-http2"
               title="Other Post-Handshake TLS Messages in HTTP/2">
         <t>
            <xref target="RFC8446"/> defines two other messages that are exchanged after the handshake is complete: KeyUpdate and NewSessionTicket.</t>
         <t>KeyUpdate messages only affect TLS itself and do not require any interaction with the application protocol. HTTP/2 implementations &MUST; support key updates when TLS 1.3 is negotiated.</t>
         <t>NewSessionTicket messages are also permitted. Though these interact with HTTP when early data is enabled, these interactions are defined in <xref target="RFC8470"/> and are allowed for in the design of HTTP/2.</t>
         <t>Unless the use of a new type of TLS message depends on an interaction with the application-layer protocol, that TLS message can be sent after the handshake completes.</t>
      </section>
      <section anchor="security-considerations" title="Security Considerations">
         <t>This document resolves a compatibility concern between HTTP/2 and TLS 1.3 when supporting post-handshake authentication with HTTP/1.1. This lowers the barrier for deploying TLS 1.3, a major security improvement over TLS 1.2.</t>
      </section>
      <section anchor="iana-considerations" title="IANA Considerations">
         <t>This document has no IANA actions.</t>
      </section>
   </middle>
   <back>
      <references title="Normative References">
         <reference anchor="RFC2119">
            <front>
               <title>Key words for use in RFCs to Indicate Requirement Levels</title>
               <author fullname="S. Bradner" initials="S." surname="Bradner"/>
               <date month="March" year="1997"/>
            </front>
            <seriesInfo name="BCP" value="14"/>
            <seriesInfo name="RFC" value="2119"/>
            <seriesInfo name="DOI" value="10.17487/RFC2119"/>
         </reference>
         <reference anchor="RFC5246">
            <front>
               <title>The Transport Layer Security (TLS) Protocol Version 1.2</title>
               <author fullname="T. Dierks" initials="T." surname="Dierks"/>
               <author fullname="E. Rescorla" initials="E." surname="Rescorla"/>
               <date month="August" year="2008"/>
            </front>
            <seriesInfo name="RFC" value="5246"/>
            <seriesInfo name="DOI" value="10.17487/RFC5246"/>
         </reference>
         <reference anchor="RFC7230">
            <front>
               <title>Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing</title>
               <author fullname="R. Fielding"
                       initials="R."
                       role="editor"
                       surname="Fielding"/>
               <author fullname="J. Reschke"
                       initials="J."
                       role="editor"
                       surname="Reschke"/>
               <date month="June" year="2014"/>
            </front>
            <seriesInfo name="RFC" value="7230"/>
            <seriesInfo name="DOI" value="10.17487/RFC7230"/>
         </reference>
         <reference anchor="RFC7301">
            <front>
               <title>Transport Layer Security (TLS) Application-Layer Protocol Negotiation Extension</title>
               <author fullname="S. Friedl" initials="S." surname="Friedl"/>
               <author fullname="A. Popov" initials="A." surname="Popov"/>
               <author fullname="A. Langley" initials="A." surname="Langley"/>
               <author fullname="E. Stephan" initials="E." surname="Stephan"/>
               <date month="July" year="2014"/>
            </front>
            <seriesInfo name="RFC" value="7301"/>
            <seriesInfo name="DOI" value="10.17487/RFC7301"/>
         </reference>
         <reference anchor="RFC7540">
            <front>
               <title>Hypertext Transfer Protocol Version 2 (HTTP/2)</title>
               <author fullname="M. Belshe" initials="M." surname="Belshe"/>
               <author fullname="R. Peon" initials="R." surname="Peon"/>
               <author fullname="M. Thomson"
                       initials="M."
                       role="editor"
                       surname="Thomson"/>
               <date month="May" year="2015"/>
            </front>
            <seriesInfo name="RFC" value="7540"/>
            <seriesInfo name="DOI" value="10.17487/RFC7540"/>
         </reference>
         <reference anchor="RFC8446">
            <front>
               <title>The Transport Layer Security (TLS) Protocol Version 1.3</title>
               <author fullname="E. Rescorla" initials="E." surname="Rescorla"/>
               <date month="August" year="2018"/>
            </front>
            <seriesInfo name="RFC" value="8446"/>
            <seriesInfo name="DOI" value="10.17487/RFC8446"/>
         </reference>
         <reference anchor="RFC8174">
            <front>
               <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
               <author fullname="B. Leiba" initials="B." surname="Leiba"/>
               <date month="May" year="2017"/>
            </front>
            <seriesInfo name="BCP" value="14"/>
            <seriesInfo name="RFC" value="8174"/>
            <seriesInfo name="DOI" value="10.17487/RFC8174"/>
         </reference>
      </references>
      <references title="Informative References">
         <reference anchor="RFC8470">
            <front>
               <title>Using Early Data in HTTP</title>
               <author fullname="M. Thomson" initials="M." surname="Thomson"/>
               <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
               <author fullname="W. Tarreau" initials="W." surname="Tarreau"/>
               <date month="September" year="2018"/>
            </front>
            <seriesInfo name="RFC" value="8470"/>
            <seriesInfo name="DOI" value="10.17487/RFC8470"/>
         </reference>
      </references>
   </back>
</rfc>
