<?xml version='1.0' encoding='UTF-8'?>

<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-tls-svcb-ech-08" number="9848" updates="" obsoletes="" submissionType="IETF" xml:lang="en" category="std" consensus="true" tocInclude="true" sortRefs="true" symRefs="true" version="3">

  <front>
    <title abbrev="ECH in SVCB">Bootstrapping TLS Encrypted ClientHello with DNS Service Bindings</title>
    <seriesInfo name="RFC" value="9848"/>
    <author initials="B." surname="Schwartz" fullname="Ben Schwartz">
      <organization>Meta Platforms, Inc.</organization>
      <address>
        <email>ietf@bemasc.net</email>
      </address>
    </author>
    <author initials="M." surname="Bishop" fullname="Mike Bishop">
      <organization>Akamai Technologies</organization>
      <address>
        <email>mbishop@evequefou.be</email>
      </address>
    </author>
    <author initials="E." surname="Nygren" fullname="Erik Nygren">
      <organization>Akamai Technologies</organization>
      <address>
        <email>erik+ietf@nygren.org</email>
      </address>
    </author>
    <date month="March" year="2026"/>
    <area>SEC</area>
    <workgroup>tls</workgroup>

<keyword>ech SvcParamKey</keyword>
<keyword>ech SvcParam</keyword>
<keyword>ECH</keyword>
<keyword>SVCB</keyword>
<keyword>HTTPS Resource Records</keyword>
<keyword>TLS SNI</keyword>
<keyword>Encrypted SNI</keyword>
<keyword>Server Name Indication</keyword>
<keyword>Encrypted Server Name Indication</keyword>

    <abstract>
<t>To use TLS Encrypted ClientHello (ECH), the client needs to learn the ECH configuration for a server before it attempts a connection to the server.  This specification provides a mechanism for conveying the ECH configuration information via DNS, using a SVCB or HTTPS resource record (RR).</t>
    </abstract>
  </front>
  <middle>

<section anchor="overview">
      <name>Overview</name>
      <t>The Service Bindings framework <xref target="RFC9460"/> allows server operators to publish a detailed description of their service in the Domain Name System (DNS) (see <xref target="RFC1034"/> and <xref target="BCP219"/>) using SVCB or HTTPS records.  Each SVCB record describes a single "alternative endpoint" and contains a collection of "SvcParams" that can be extended with new kinds of information that may be of interest to a client.  Clients can use the SvcParams to improve the privacy, security, and performance of their connection to this endpoint.</t>
      <t>This specification defines a new SvcParam to enable the use of TLS Encrypted ClientHello <xref target="RFC9849"/> in TLS-based protocols.  This SvcParam can be used in SVCB, HTTPS, or any future SVCB-compatible DNS records and is intended to serve as the primary bootstrap mechanism for ECH.</t>
    </section>
    <section anchor="terminology">
      <name>Terminology</name>
      <t>
    The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>",
    "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
    NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>",
    "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
    "<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are
    to be interpreted as described in BCP&nbsp;14 <xref target="RFC2119"/>
    <xref target="RFC8174"/> when, and only when, they appear in all capitals,
    as shown here. 
</t>
    </section>
    <section anchor="ech-param">
      <name>SvcParam for ECH Configuration</name>
      <t>The "ech" SvcParamKey conveys the ECH configuration of an alternative endpoint.  It is applicable to all schemes that use TLS-based protocols (including DTLS <xref target="RFC9147"/> and QUIC version 1 <xref target="RFC9001"/>) unless otherwise specified.</t>
      <t>In wire format, the value of the parameter is an ECHConfigList (<xref section="4" sectionFormat="of" target="RFC9849"/>), including the redundant length prefix.  In presentation format, the value is the ECHConfigList in Base 64 encoding (<xref section="4" sectionFormat="of" target="RFC4648"/>).  Base 64 is used here to simplify integration with TLS server software.  To enable simpler parsing, this SvcParam <bcp14>MUST NOT</bcp14> contain escape sequences.</t>
<t>This example uses line wrapping per <xref target="RFC8792"/>.</t>
      <figure>
        <name>ECH SvcParam with a public_name of "ech-sites.example.net"</name>
        <sourcecode type=""><![CDATA[
ech="AEj+DQBEAQAgACAdd+scUi0IYFsXnUIU7ko2Nd9+F8M26pAGZVpz/KrWPgAEAAE\
AAWQVZWNoLXNpdGVzLmV4YW1wbGUubmV0AAA="]]></sourcecode>
      </figure>
    </section>
    <section anchor="requirements-for-server-deployments">
      <name>Requirements for Server Deployments</name>
      <t>When publishing a record containing an "ech" parameter, the publisher <bcp14>MUST</bcp14> ensure that all IP addresses of TargetName correspond to servers that have access to the corresponding private key or are authoritative for the public name. (See Sections <xref target="RFC9849" section="6.1.7" sectionFormat="bare"/> and <xref target="RFC9849" section="8.1.1" sectionFormat="bare"/> of <xref target="RFC9849"/> for requirements related to the public name.)  Otherwise, connections will fail entirely.</t>
      <t>These servers <bcp14>SHOULD</bcp14> support a protocol version that is compatible with ECH.  At the time of writing, the compatible versions are TLS 1.3, DTLS 1.3, and QUIC version 1.  If the server does not support a compatible version, each connection attempt will have to be retried, delaying the connection and wasting resources.</t>
    </section>
    <section anchor="ech-client-behavior">
      <name>Requirements for Client Implementations</name>
      <t>This section describes client behavior in using ECH configurations provided in SVCB or HTTPS records.</t>
      <section anchor="disabling-fallback">
        <name>Disabling Fallback</name>
        <t>The SVCB-optional client behavior specified in <xref section="3" sectionFormat="of" target="RFC9460"/> permits clients to fall back to a direct connection if all SVCB options fail.  This behavior is not suitable for ECH, because fallback would negate the privacy benefits of ECH.  Accordingly, ECH-capable, SVCB-optional clients <bcp14>MUST</bcp14> switch to SVCB-reliant connection establishment if SVCB resolution succeeded (as defined in <xref section="3" sectionFormat="of" target="RFC9460"/>) and all alternative endpoints have an "ech" SvcParam.</t>
      </section>
      <section anchor="clienthello-construction">
        <name>ClientHello Construction</name>
        <t>When ECH is in use, the TLS ClientHello is divided into an unencrypted "outer" and an encrypted "inner" ClientHello.  The outer ClientHello is an implementation detail of ECH, and its contents are controlled by the ECHConfig in accordance with <xref target="RFC9849"/>.  The inner ClientHello is used for establishing a connection to the service, so its contents may be influenced by other SVCB parameters.  For example, the requirements related to Application-Layer Protocol Negotiation (ALPN) protocol identifiers in <xref section="7.1.2" sectionFormat="of" target="RFC9460"/> apply only to the inner ClientHello.  Similarly, it is the inner ClientHello whose Server Name Indication (SNI) identifies the desired service.</t>
      </section>
      <section anchor="performance-optimizations">
        <name>Performance Optimizations</name>
        <t>Prior to retrieving the SVCB records, the client does not know whether they contain an "ech" parameter.  As a latency optimization, clients <bcp14>MAY</bcp14> prefetch DNS records that will only be used if this parameter is not present (i.e., only in SVCB-optional mode).</t>
        <t>The "ech" SvcParam alters the contents of the TLS ClientHello if it is present.  Therefore, clients that support ECH <bcp14>MUST NOT</bcp14> issue any TLS ClientHello until after SVCB resolution has completed.  (See <xref section="5.1" sectionFormat="of" target="RFC9460"/>.)</t>
      </section>
    </section>
    <section anchor="interaction-with-http-alt-svc">
      <name>Interaction with HTTP Alt-Svc</name>
      <t>HTTP clients that implement both HTTP Alt-Svc <xref target="RFC7838"/> and the HTTPS record type <xref target="RFC9460"/> can use them together, provided that they only perform connection attempts that are "consistent" with both sets of parameters (<xref section="9.3" sectionFormat="of" target="RFC9460"/>).  At the time of writing, there is no defined parameter related to ECH for Alt-Svc.  Accordingly, a connection attempt that uses ECH is considered "consistent" with an Alt-Svc field value that does not mention ECH.</t>
      <t>Origins that publish an "ech" SvcParam in their HTTPS record <bcp14>SHOULD</bcp14> also publish an HTTPS record with the "ech" SvcParam for every alt-authority offered in its Alt-Svc field values.  Otherwise, clients might reveal the name of the server in an unencrypted ClientHello to an alt-authority.</t>
      <t>If all HTTPS records for an alt-authority contain "ech" SvcParams, the client <bcp14>MUST</bcp14> adopt SVCB-reliant behavior (as in <xref target="disabling-fallback"/>) for that resource record set (RRSet).  This precludes the use of certain connections that Alt-Svc would otherwise allow, as discussed in <xref section="9.3" sectionFormat="of" target="RFC9460"/>.</t>
    </section>
    <section anchor="examples">
      <name>Examples</name>
      <figure>
        <name>Simple Example Zone with the Same Configuration on the Apex and Web Domain</name>
        <sourcecode type="dns-rr"><![CDATA[
$ORIGIN simple.example. ; Simple example zone
@ 300 IN A     192.0.2.1
         AAAA  2001:db8::1
         HTTPS 1 . ech=ABC...
www 300 IN A 192.0.2.1
           AAAA 2001:db8::1
           HTTPS 1 . ech=ABC...]]></sourcecode>
      </figure>
<t>The example above is compatible with clients that do or do not support HTTPS records.</t>
      <figure>
        <name>Service That Allows Clients to Choose Between Two Server Pools with Different ECH Configurations</name>
        <sourcecode type="dns-rr"><![CDATA[
$ORIGIN heterogeneous.example. ; Example zone with 2 pools of servers
pool1 300 IN    A    192.0.2.1
                AAAA 2001:db8:1::a
pool2 300 IN    A    192.0.2.2
                AAAA 2001:db8:2::a
service 300 IN SVCB 1 pool1 ech=ABC...
               SVCB 1 pool2 ech=DEF...
               A 192.0.2.1
               A 192.0.2.2
               AAAA 2001:db8:1::a
               AAAA 2001:db8:2::a]]></sourcecode>
      </figure>

      <figure>
        <name>ECH Usage Pattern for an Aliasing-Based CDN</name>
        <sourcecode type="dns-rr"><![CDATA[
$ORIGIN cdn.example. ; CDN operator zone
pool 300 IN A 192.0.2.1
            AAAA 2001:db8::1
            HTTPS 1 . ech=ABC...

$ORIGIN customer.example. ; CDN customer's zone
@   3600 IN HTTPS 0 pool.cdn.example.
; Apex IP records for compatibility with clients that do not support
; HTTPS records.
@   300  IN A    192.0.2.1
            AAAA 2001:db8::1

www 300  IN CNAME pool.cdn.example.]]></sourcecode>
      </figure>

      <figure>
        <name>A Domain That is Only Reachable Using ECH</name>
        <sourcecode type="dns-rr"><![CDATA[
$ORIGIN secret.example. ; High confidentiality zone
www     3600 IN HTTPS 1 backend ech=ABC... mandatory=ech
backend 300  IN A     192.0.2.1
                AAAA  2001:db8::1]]></sourcecode>
      </figure>

      <figure>
        <name>Multi-CDN Configuration Using Server-Side Selection</name>
        <sourcecode type="dns-rr"><![CDATA[
$ORIGIN cdn1.example. ; First CDN operator zone
pool 300 IN A     192.0.2.1
            AAAA  2001:db8::1
            HTTPS 1 . ech=ABC...

$ORIGIN cdn2.example. ; Second CDN operator zone
pool 300 IN A     192.0.2.2
            AAAA  2001:db8::2
            HTTPS 1 . ech=DEF...

;; Multi-CDN customer zone (version 1)
$ORIGIN customer.example.
@   3600 IN HTTPS 0 pool.cdn1.example.
; Apex IP records for compatibility with clients that do not support
; HTTPS records.
@   300  IN A    192.0.2.1
            AAAA 2001:db8::1
www 3600  IN CNAME pool.cdn1.example.

;; Multi-CDN customer zone (version 2)
@   3600 IN HTTPS 0 pool.cdn2.example.
@   300  IN A    192.0.2.2
            AAAA 2001:db8::2
www 3600  IN CNAME pool.cdn2.example.]]></sourcecode>
      </figure>

      <figure>
        <name>Example of a DNS Server That Supports ECH</name>
        <sourcecode type="dns-rr"><![CDATA[
$ORIGIN dns.example. ; DNS server example.
@    3600 IN A     192.0.2.1
             AAAA  2001:db8::1
             HTTPS 1 . ech=ABC... alpn=h3 dohpath=/q{?dns}

_dns 3600 IN SVCB  1 @ ech=ABC... alpn=dot,doq,h3 dohpath=/q{?dns}]]></sourcecode>
      </figure>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>A SVCB RRSet containing some RRs with "ech" and some without is vulnerable to a downgrade attack: A network intermediary can block connections to the endpoints that support ECH, causing the client to fall back to a non-ECH endpoint.  This configuration is <bcp14>NOT RECOMMENDED</bcp14>, but it may be unavoidable when combining endpoints from different providers or conducting a staged rollout. Zone owners who do use such a mixed configuration <bcp14>SHOULD</bcp14> mark the RRs with "ech" as more preferred (i.e., lower SvcPriority value) than those without, in order to maximize the likelihood that ECH will be used in the absence of an active adversary.</t>

      <t>When Encrypted ClientHello is deployed, the inner TLS SNI is protected from disclosure to attackers. However, there are still many ways that an attacker might infer the SNI. Even in an idealized deployment, ECH's protection is limited to an anonymity set consisting of all the ECH-enabled server domains supported by a given client-facing server that share an ECH configuration. An attacker who can enumerate this set can always guess the encrypted SNI with a probability of at least 1/K, where K is the number of domains in the set. Some attackers may achieve much greater accuracy using traffic analysis, popularity weighting, and other mechanisms (e.g., see <xref target="CLINIC"/>).</t>
      <t>ECH ensures that TLS does not disclose the SNI, but the same information is also present in the DNS queries used to resolve the server's hostname.  This specification does not conceal the server name from the DNS resolver.  If DNS messages are sent between the client and resolver without authenticated encryption, an attacker on this path can also learn the destination server name.  A similar attack applies if the client can be linked to a request from the resolver to a DNS authority.</t>
      <t>An attacker who can prevent SVCB resolution can deny clients any associated security benefits. A hostile recursive resolver can always deny service to SVCB queries, but network intermediaries can often prevent resolution as well, even when the client and recursive resolver validate DNSSEC <xref target="RFC9364"/> and use a secure transport. These downgrade attacks can prevent a client from being aware that "ech" is configured, which could result in the client sending the ClientHello in cleartext. To prevent downgrades, <xref section="3.1" sectionFormat="of" target="RFC9460"/> recommends that clients abandon the connection attempt when such an attack is detected.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>IANA has modified the entry for "ech" in the "DNS SVCB Service Parameter Keys (SvcParamKeys)" registry in the "DNS Service Bindings (SVCB)" registry group as follows:</t>
      <table>
        <thead>
          <tr>
            <th align="left">Number</th>
            <th align="left">Name</th>
            <th align="left">Meaning</th>
            <th align="left">Change Controller</th>
	    <th align="left">Reference</th>	    
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">5</td>
            <td align="left">ech</td>
            <td align="left">TLS Encrypted ClientHello Config</td>
            <td align="left">IETF</td>
            <td align="left">RFC 9848</td>	    
          </tr>
        </tbody>
      </table>
    </section>
  </middle>
  <back>
    <displayreference target="RFC9460" to="SVCB"/>
    <displayreference target="RFC9849" to="ECH"/>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9460.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.1034.xml"/>

        <reference anchor="RFC9849" target="https://www.rfc-editor.org/info/rfc9849">
          <front>
            <title>TLS Encrypted Client Hello</title>
            <author initials="E." surname="Rescorla" fullname="Eric Rescorla">
              <organization>Independent</organization>
            </author>
            <author initials="K." surname="Oku" fullname="Kazuho Oku">
              <organization>Fastly</organization>
            </author>
            <author initials="N." surname="Sullivan" fullname="Nick Sullivan">
              <organization>Cryptography Consulting LLC</organization>
            </author>
            <author initials="C. A." surname="Wood" fullname="Christopher A. Wood">
              <organization>Cloudflare</organization>
            </author>
            <date month="March" year="2026"/>
          </front>
          <seriesInfo name="RFC" value="9849"/>
          <seriesInfo name="DOI" value="10.17487/RFC9849"/>
        </reference>

        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.4648.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9364.xml"/>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="CLINIC">
          <front>
            <title>I Know Why You Went to the Clinic: Risks and Realization of HTTPS Traffic Analysis</title>
            <author fullname="Brad Miller" initials="B." surname="Miller">
              <organization/>
            </author>
            <author fullname="Ling Huang" initials="L." surname="Huang">
              <organization/>
            </author>
            <author fullname="A. D. Joseph" initials="A." surname="Joseph">
              <organization/>
            </author>
            <author fullname="J. D. Tygar" initials="J." surname="Tygar">
              <organization/>
            </author>
            <date year="2014"/>
          </front>
          <seriesInfo name="DOI" value="10.1007/978-3-319-08506-7_8"/>
          <refcontent>Lecture Notes in Computer Science, vol. 8555, pp. 143-163</refcontent>
        </reference>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml9/reference.BCP.0219.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9147.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9001.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7838.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8792.xml"/>	
      </references>
    </references>
  </back>
</rfc>
