diff options
Diffstat (limited to 'doc/rfc/rfc9460.txt')
-rw-r--r-- | doc/rfc/rfc9460.txt | 2485 |
1 files changed, 2485 insertions, 0 deletions
diff --git a/doc/rfc/rfc9460.txt b/doc/rfc/rfc9460.txt new file mode 100644 index 0000000..fbce84b --- /dev/null +++ b/doc/rfc/rfc9460.txt @@ -0,0 +1,2485 @@ + + + + +Internet Engineering Task Force (IETF) B. Schwartz +Request for Comments: 9460 Meta Platforms, Inc. +Category: Standards Track M. Bishop +ISSN: 2070-1721 E. Nygren + Akamai Technologies + November 2023 + + +Service Binding and Parameter Specification via the DNS (SVCB and HTTPS + Resource Records) + +Abstract + + This document specifies the "SVCB" ("Service Binding") and "HTTPS" + DNS resource record (RR) types to facilitate the lookup of + information needed to make connections to network services, such as + for HTTP origins. SVCB records allow a service to be provided from + multiple alternative endpoints, each with associated parameters (such + as transport protocol configuration), and are extensible to support + future uses (such as keys for encrypting the TLS ClientHello). They + also enable aliasing of apex domains, which is not possible with + CNAME. The HTTPS RR is a variation of SVCB for use with HTTP (see + RFC 9110, "HTTP Semantics"). By providing more information to the + client before it attempts to establish a connection, these records + offer potential benefits to both performance and privacy. + +Status of This Memo + + This is an Internet Standards Track document. + + This document is a product of the Internet Engineering Task Force + (IETF). It represents the consensus of the IETF community. It has + received public review and has been approved for publication by the + Internet Engineering Steering Group (IESG). Further information on + Internet Standards is available in Section 2 of RFC 7841. + + Information about the current status of this document, any errata, + and how to provide feedback on it may be obtained at + https://www.rfc-editor.org/info/rfc9460. + +Copyright Notice + + Copyright (c) 2023 IETF Trust and the persons identified as the + document authors. All rights reserved. + + This document is subject to BCP 78 and the IETF Trust's Legal + Provisions Relating to IETF Documents + (https://trustee.ietf.org/license-info) in effect on the date of + publication of this document. Please review these documents + carefully, as they describe your rights and restrictions with respect + to this document. Code Components extracted from this document must + include Revised BSD License text as described in Section 4.e of the + Trust Legal Provisions and are provided without warranty as described + in the Revised BSD License. + +Table of Contents + + 1. Introduction + 1.1. Goals + 1.2. Overview of the SVCB RR + 1.3. Terminology + 2. The SVCB Record Type + 2.1. Zone-File Presentation Format + 2.2. RDATA Wire Format + 2.3. SVCB Query Names + 2.4. Interpretation + 2.4.1. SvcPriority + 2.4.2. AliasMode + 2.4.3. ServiceMode + 2.5. Special Handling of "." in TargetName + 2.5.1. AliasMode + 2.5.2. ServiceMode + 3. Client Behavior + 3.1. Handling Resolution Failures + 3.2. Clients Using a Proxy + 4. DNS Server Behavior + 4.1. Authoritative Servers + 4.2. Recursive Resolvers + 4.2.1. DNS64 + 4.3. General Requirements + 4.4. EDNS Client Subnet (ECS) + 5. Performance Optimizations + 5.1. Optimistic Pre-connection and Connection Reuse + 5.2. Generating and Using Incomplete Responses + 6. SVCB-Compatible RR Types + 7. Initial SvcParamKeys + 7.1. "alpn" and "no-default-alpn" + 7.1.1. Representation + 7.1.2. Use + 7.2. "port" + 7.3. "ipv4hint" and "ipv6hint" + 7.4. "mandatory" + 8. ServiceMode RR Compatibility and Mandatory Keys + 9. Using Service Bindings with HTTP + 9.1. Query Names for HTTPS RRs + 9.2. Comparison with Alt-Svc + 9.2.1. ALPN Usage + 9.2.2. Untrusted Channels + 9.2.3. Cache Lifetime + 9.2.4. Granularity + 9.3. Interaction with Alt-Svc + 9.4. Requiring Server Name Indication + 9.5. HTTP Strict Transport Security (HSTS) + 9.6. Use of HTTPS RRs in Other Protocols + 10. Zone Structures + 10.1. Structuring Zones for Flexibility + 10.2. Structuring Zones for Performance + 10.3. Operational Considerations + 10.4. Examples + 10.4.1. Protocol Enhancements + 10.4.2. Apex Aliasing + 10.4.3. Parameter Binding + 10.4.4. Multi-CDN Configuration + 10.4.5. Non-HTTP Uses + 11. Interaction with Other Standards + 12. Security Considerations + 13. Privacy Considerations + 14. IANA Considerations + 14.1. SVCB RR Type + 14.2. HTTPS RR Type + 14.3. New Registry for Service Parameters + 14.3.1. Procedure + 14.3.2. Initial Contents + 14.4. Other Registry Updates + 15. References + 15.1. Normative References + 15.2. Informative References + Appendix A. Decoding Text in Zone Files + A.1. Decoding a Comma-Separated List + Appendix B. HTTP Mapping Summary + Appendix C. Comparison with Alternatives + C.1. Differences from the SRV RR Type + C.2. Differences from the Proposed HTTP Record + C.3. Differences from the Proposed ANAME Record + C.4. Comparison with Separate RR Types for AliasMode and + ServiceMode + Appendix D. Test Vectors + D.1. AliasMode + D.2. ServiceMode + D.3. Failure Cases + Acknowledgments and Related Proposals + Authors' Addresses + +1. Introduction + + The SVCB ("Service Binding") and HTTPS resource records (RRs) provide + clients with complete instructions for access to a service. This + information enables improved performance and privacy by avoiding + transient connections to a suboptimal default server, negotiating a + preferred protocol, and providing relevant public keys. + + For example, HTTP clients currently resolve only A and/or AAAA + records for the origin hostname, learning only its IP addresses. If + an HTTP client learns more about the origin before connecting, it may + be able to upgrade "http" URLs to "https", enable HTTP/3 or Encrypted + ClientHello [ECH], or switch to an operationally preferable endpoint. + It is highly desirable to minimize the number of round trips and + lookups required to learn this additional information. + + The SVCB and HTTPS RRs also help when the operator of a service + wishes to delegate operational control to one or more other domains, + e.g., aliasing the origin "https://example.com" to a service operator + endpoint at "svc.example.net". While this case can sometimes be + handled by a CNAME, that does not cover all use cases. CNAME is also + inadequate when the service operator needs to provide a bound + collection of consistent configuration parameters through the DNS + (such as network location, protocol, and keying information). + + This document first describes the SVCB RR as a general-purpose RR + that can be applied directly and efficiently to a wide range of + services (Section 2). It also describes the rules for defining other + SVCB-compatible RR types (Section 6), starting with the HTTPS RR type + (Section 9), which provides improved efficiency and convenience with + HTTP by avoiding the need for an Attrleaf label [Attrleaf] + (Section 9.1). + + The SVCB RR has two modes: 1) "AliasMode", which simply delegates + operational control for a resource and 2) "ServiceMode", which binds + together configuration information for a service endpoint. + ServiceMode provides additional key=value parameters within each + RDATA set. + +1.1. Goals + + The goal of the SVCB RR is to allow clients to resolve a single + additional DNS RR in a way that: + + * Provides alternative endpoints that are authoritative for the + service, along with parameters associated with each of these + endpoints. + + * Does not assume that all alternative endpoints have the same + parameters or capabilities, or are even operated by the same + entity. This is important, as DNS does not provide any way to tie + together multiple RRsets for the same name. For example, if + "www.example.com" is a CNAME alias that switches between one of + three Content Delivery Networks (CDNs) or hosting environments, + successive queries for that name may return records that + correspond to different environments. + + * Enables CNAME-like functionality at a zone apex (such as + "example.com") for participating protocols and generally enables + extending operational authority for a service identified by a + domain name to other instances with alternate names. + + Additional goals specific to HTTPS RRs and the HTTP use cases + include: + + * Connecting directly to HTTP/3 (QUIC transport) alternative + endpoints [HTTP/3]. + + * Supporting non-default TCP and UDP ports. + + * Enabling SRV-like benefits (e.g., apex aliasing, as mentioned + above) for HTTP, where SRV [SRV] has not been widely adopted. + + * Providing an indication signaling that the "https" scheme should + be used instead of "http" for all HTTP requests to this host and + port, similar to HTTP Strict Transport Security [HSTS] (see + Section 9.5). + + * Enabling the conveyance of Encrypted ClientHello keys [ECH] + associated with an alternative endpoint. + +1.2. Overview of the SVCB RR + + This subsection briefly describes the SVCB RR with forward references + to the full exposition of each component. (As discussed in + Section 6, this all applies equally to the HTTPS RR, which shares the + same encoding, format, and high-level semantics.) + + The SVCB RR has two modes: 1) AliasMode (Section 2.4.2), which + aliases a name to another name and 2) ServiceMode (Section 2.4.3), + which provides connection information bound to a service endpoint + domain. Placing both forms in a single RR type allows clients to + fetch the relevant information with a single query (Section 2.3). + + The SVCB RR has two required fields and one optional field. The + fields are: + + SvcPriority (Section 2.4.1): The priority of this record (relative + to others, with lower values preferred). A value of 0 indicates + AliasMode. + + TargetName: The domain name of either the alias target (for + AliasMode) or the alternative endpoint (for ServiceMode). + + SvcParams (optional): A list of key=value pairs describing the + alternative endpoint at TargetName (only used in ServiceMode and + otherwise ignored). SvcParams are described in Section 2.1. + + Cooperating DNS recursive resolvers will perform subsequent record + resolution (for SVCB, A, and AAAA records) and return them in the + Additional section of the response (Section 4.2). Clients either use + responses included in the Additional section returned by the + recursive resolver or perform necessary SVCB, A, and AAAA record + resolutions (Section 3). DNS authoritative servers can attach in- + bailiwick SVCB, A, AAAA, and CNAME records in the Additional section + to responses for a SVCB query (Section 4.1). + + In ServiceMode, the SvcParams of the SVCB RR provide an extensible + data model for describing alternative endpoints that are + authoritative for a service, along with parameters associated with + each of these alternative endpoints (Section 7). + + For HTTP use cases, the HTTPS RR (Section 9) enables many of the + benefits of Alt-Svc [AltSvc] without waiting for a full HTTP + connection initiation (multiple round trips) before learning of the + preferred alternative, and without necessarily revealing the user's + intended destination to all entities along the network path. + +1.3. Terminology + + Terminology in this document is based on the common case where the + SVCB record is used to access a resource identified by a URI whose + authority field contains a DNS hostname as the host. + + * The "service" is the information source identified by the + authority and scheme of the URI, capable of providing access to + the resource. For "https" URIs, the "service" corresponds to an + "origin" [RFC6454]. + + * The "service name" is the host portion of the authority. + + * The "authority endpoint" is the authority's hostname and a port + number implied by the scheme or specified in the URI. + + * An "alternative endpoint" is a hostname, port number, and other + associated instructions to the client on how to reach an instance + of a service. + + Additional DNS terminology intends to be consistent with [DNSTerm]. + + SVCB is a contraction of "service binding". The SVCB RR, HTTPS RR, + and future RR types that share SVCB's formats and registry are + collectively known as SVCB-compatible RR types. The contraction + "SVCB" is also used to refer to this system as a whole. + + 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 [RFC2119] [RFC8174] when, and only when, they appear in all + capitals, as shown here. + +2. The SVCB Record Type + + The SVCB DNS RR type (RR type 64) is used to locate alternative + endpoints for a service. + + The algorithm for resolving SVCB records and associated address + records is specified in Section 3. + + Other SVCB-compatible RR types can also be defined as needed (see + Section 6). In particular, the HTTPS RR (RR type 65) provides + special handling for the case of "https" origins as described in + Section 9. + + SVCB RRs are extensible by a list of SvcParams, which are pairs + consisting of a SvcParamKey and a SvcParamValue. Each SvcParamKey + has a presentation name and a registered number. Values are in a + format specific to the SvcParamKey. Each SvcParam has a specified + presentation format (used in zone files) and wire encoding (e.g., + domain names, binary data, or numeric values). The initial + SvcParamKeys and their formats are defined in Section 7. + +2.1. Zone-File Presentation Format + + The presentation format <RDATA> of the record ([RFC1035], + Section 5.1) has the form: + + SvcPriority TargetName SvcParams + + The SVCB record is defined specifically within the Internet ("IN") + Class ([RFC1035], Section 3.2.4). + + SvcPriority is a number in the range 0-65535, TargetName is a + <domain-name> ([RFC1035], Section 5.1), and the SvcParams are a + whitespace-separated list with each SvcParam consisting of a + SvcParamKey=SvcParamValue pair or a standalone SvcParamKey. + SvcParamKeys are registered by IANA (Section 14.3). + + Each SvcParamKey SHALL appear at most once in the SvcParams. In + presentation format, SvcParamKeys are lowercase alphanumeric strings. + Key names contain 1-63 characters from the ranges "a"-"z", "0"-"9", + and "-". In ABNF [RFC5234], + + alpha-lc = %x61-7A ; a-z + SvcParamKey = 1*63(alpha-lc / DIGIT / "-") + SvcParam = SvcParamKey ["=" SvcParamValue] + SvcParamValue = char-string ; See Appendix A. + value = *OCTET ; Value before key-specific parsing + + The SvcParamValue is parsed using the character-string decoding + algorithm (Appendix A), producing a value. The value is then + validated and converted into wire format in a manner specific to each + key. + + When the optional "=" and SvcParamValue are omitted, the value is + interpreted as empty. + + Arbitrary keys can be represented using the unknown-key presentation + format "keyNNNNN" where NNNNN is the numeric value of the key type + without leading zeros. A SvcParam in this form SHALL be parsed as + specified above, and the decoded value SHALL be used as its wire- + format encoding. + + For some SvcParamKeys, the value corresponds to a list or set of + items. Presentation formats for such keys SHOULD use a comma- + separated list (Appendix A.1). + + SvcParams in presentation format MAY appear in any order, but keys + MUST NOT be repeated. + +2.2. RDATA Wire Format + + The RDATA for the SVCB RR consists of: + + * a 2-octet field for SvcPriority as an integer in network byte + order. + + * the uncompressed, fully qualified TargetName, represented as a + sequence of length-prefixed labels per Section 3.1 of [RFC1035]. + + * the SvcParams, consuming the remainder of the record (so smaller + than 65535 octets and constrained by the RDATA and DNS message + sizes). + + When the list of SvcParams is non-empty, it contains a series of + SvcParamKey=SvcParamValue pairs, represented as: + + * a 2-octet field containing the SvcParamKey as an integer in + network byte order. (See Section 14.3.2 for the defined values.) + + * a 2-octet field containing the length of the SvcParamValue as an + integer between 0 and 65535 in network byte order. + + * an octet string of this length whose contents are the + SvcParamValue in a format determined by the SvcParamKey. + + SvcParamKeys SHALL appear in increasing numeric order. + + Clients MUST consider an RR malformed if: + + * the end of the RDATA occurs within a SvcParam. + + * SvcParamKeys are not in strictly increasing numeric order. + + * the SvcParamValue for a SvcParamKey does not have the expected + format. + + Note that the second condition implies that there are no duplicate + SvcParamKeys. + + If any RRs are malformed, the client MUST reject the entire RRset and + fall back to non-SVCB connection establishment. + +2.3. SVCB Query Names + + When querying the SVCB RR, a service is translated into a QNAME by + prepending the service name with a label indicating the scheme, + prefixed with an underscore, resulting in a domain name like + "_examplescheme.api.example.com.". This follows the Attrleaf naming + pattern [Attrleaf], so the scheme MUST be registered appropriately + with IANA (see Section 11). + + Protocol mapping documents MAY specify additional underscore-prefixed + labels to be prepended. For schemes that specify a port + (Section 3.2.3 of [URI]), one reasonable possibility is to prepend + the indicated port number if a non-default port number is specified. + This document terms this behavior "Port Prefix Naming" and uses it in + the examples throughout. + + See Section 9.1 for information regarding HTTPS RR behavior. + + When a prior CNAME or SVCB record has aliased to a SVCB record, each + RR SHALL be returned under its own owner name, as in ordinary CNAME + processing ([RFC1034], Section 3.6.2). For details, see the + recommendations regarding aliases for clients (Section 3), servers + (Section 4), and zones (Section 10). + + Note that none of these forms alter the origin or authority for + validation purposes. For example, TLS clients MUST continue to + validate TLS certificates for the original service name. + + As an example, the owner of "example.com" could publish this record: + + _8443._foo.api.example.com. 7200 IN SVCB 0 svc4.example.net. + + This record would indicate that "foo://api.example.com:8443" is + aliased to "svc4.example.net". The owner of "example.net", in turn, + could publish this record: + + svc4.example.net. 7200 IN SVCB 3 svc4.example.net. ( + alpn="bar" port="8004" ) + + This record would indicate that these services are served on port + number 8004, which supports the protocol "bar" and its associated + transport in addition to the default transport protocol for "foo://". + + (Parentheses are used to ignore a line break in DNS zone-file + presentation format, per Section 5.1 of [RFC1035].) + +2.4. Interpretation + +2.4.1. SvcPriority + + When SvcPriority is 0, the SVCB record is in AliasMode + (Section 2.4.2). Otherwise, it is in ServiceMode (Section 2.4.3). + + Within a SVCB RRset, all RRs SHOULD have the same mode. If an RRset + contains a record in AliasMode, the recipient MUST ignore any + ServiceMode records in the set. + + RRsets are explicitly unordered collections, so the SvcPriority field + is used to impose an ordering on SVCB RRs. A smaller SvcPriority + indicates that the domain owner recommends the use of this record + over ServiceMode RRs with a larger SvcPriority value. + + When receiving an RRset containing multiple SVCB records with the + same SvcPriority value, clients SHOULD apply a random shuffle within + a priority level to the records before using them, to ensure uniform + load balancing. + +2.4.2. AliasMode + + In AliasMode, the SVCB record aliases a service to a TargetName. + SVCB RRsets SHOULD only have a single RR in AliasMode. If multiple + AliasMode RRs are present, clients or recursive resolvers SHOULD pick + one at random. + + The primary purpose of AliasMode is to allow aliasing at the zone + apex, where CNAME is not allowed (see, for example, [RFC1912], + Section 2.4). In AliasMode, the TargetName will be the name of a + domain that resolves to SVCB, AAAA, and/or A records. (See Section 6 + for aliasing of SVCB-compatible RR types.) Unlike CNAME, AliasMode + records do not affect the resolution of other RR types and apply only + to a specific service, not an entire domain name. + + The AliasMode TargetName SHOULD NOT be equal to the owner name, as + this would result in a loop. In AliasMode, recipients MUST ignore + any SvcParams that are present. Zone-file parsers MAY emit a warning + if an AliasMode record has SvcParams. The use of SvcParams in + AliasMode records is currently not defined, but a future + specification could extend AliasMode records to include SvcParams. + + For example, the operator of "foo://example.com:8080" could point + requests to a service operating at "foosvc.example.net" by + publishing: + + _8080._foo.example.com. 3600 IN SVCB 0 foosvc.example.net. + + Using AliasMode maintains a separation of concerns: the owner of + "foosvc.example.net" can add or remove ServiceMode SVCB records + without requiring a corresponding change to "example.com". Note that + if "foosvc.example.net" promises to always publish a SVCB record, + this AliasMode record can be replaced by a CNAME at the same owner + name. + + AliasMode is especially useful for SVCB-compatible RR types that do + not require an underscore prefix, such as the HTTPS RR type. For + example, the operator of "https://example.com" could point requests + to a server at "svc.example.net" by publishing this record at the + zone apex: + + example.com. 3600 IN HTTPS 0 svc.example.net. + + Note that the SVCB record's owner name MAY be the canonical name of a + CNAME record, and the TargetName MAY be the owner of a CNAME record. + Clients and recursive resolvers MUST follow CNAMEs as normal. + + To avoid unbounded alias chains, clients and recursive resolvers MUST + impose a limit on the total number of SVCB aliases they will follow + for each resolution request. This limit MUST NOT be zero, i.e., + implementations MUST be able to follow at least one AliasMode record. + The exact value of this limit is left to implementations. + + Zones that require following multiple AliasMode records could + encounter compatibility and performance issues. + + As legacy clients will not know to use this record, service operators + will likely need to retain fallback AAAA and A records alongside this + SVCB record, although in a common case the target of the SVCB record + might offer better performance, and therefore would be preferable for + clients implementing this specification to use. + + AliasMode records only apply to queries for the specific RR type. + For example, a SVCB record cannot alias to an HTTPS record or vice + versa. + +2.4.3. ServiceMode + + In ServiceMode, the TargetName and SvcParams within each RR associate + an alternative endpoint for the service with its connection + parameters. + + Each protocol scheme that uses SVCB MUST define a protocol mapping + that explains how SvcParams are applied for connections of that + scheme. Unless specified otherwise by the protocol mapping, clients + MUST ignore any SvcParam that they do not recognize. + + Some SvcParams impose requirements on other SvcParams in the RR. A + ServiceMode RR is called "self-consistent" if its SvcParams all + comply with each other's requirements. Clients MUST reject any RR + whose recognized SvcParams are not self-consistent and MAY reject the + entire RRset. To help zone operators avoid this condition, zone-file + implementations SHOULD enforce self-consistency as well. + +2.5. Special Handling of "." in TargetName + + If TargetName has the value "." (represented in the wire format as a + zero-length label), special rules apply. + +2.5.1. AliasMode + + For AliasMode SVCB RRs, a TargetName of "." indicates that the + service is not available or does not exist. This indication is + advisory: clients encountering this indication MAY ignore it and + attempt to connect without the use of SVCB. + +2.5.2. ServiceMode + + For ServiceMode SVCB RRs, if TargetName has the value ".", then the + owner name of this record MUST be used as the effective TargetName. + If the record has a wildcard owner name in the zone file, the + recipient SHALL use the response's synthesized owner name as the + effective TargetName. + + Here, for example, "svc2.example.net" is the effective TargetName: + + example.com. 7200 IN HTTPS 0 svc.example.net. + svc.example.net. 7200 IN CNAME svc2.example.net. + svc2.example.net. 7200 IN HTTPS 1 . port=8002 + svc2.example.net. 300 IN A 192.0.2.2 + svc2.example.net. 300 IN AAAA 2001:db8::2 + +3. Client Behavior + + "SVCB resolution" is the process of enumerating and ordering the + available endpoints for a service, as performed by the client. SVCB + resolution is implemented as follows: + + 1. Let $QNAME be the service name plus appropriate prefixes for the + scheme (see Section 2.3). + + 2. Issue a SVCB query for $QNAME. + + 3. If an AliasMode SVCB record is returned for $QNAME (after + following CNAMEs as normal), set $QNAME to its TargetName + (without additional prefixes) and loop back to Step 2, subject to + chain length limits and loop detection heuristics (see + Section 3.1). + + 4. If one or more "compatible" (Section 8) ServiceMode records are + returned, these represent the alternative endpoints. Sort the + records by ascending SvcPriority. + + 5. Otherwise, SVCB resolution has failed, and the list of available + endpoints is empty. + + This procedure does not rely on any recursive or authoritative DNS + server to comply with this specification or have any awareness of + SVCB. + + A client is called "SVCB-optional" if it can connect without the use + of ServiceMode records; otherwise, it is called "SVCB-reliant". + Clients for pre-existing protocols (e.g., HTTP) SHALL implement SVCB- + optional behavior (except as noted in Section 3.1 or when modified by + future specifications). + + SVCB-optional clients SHOULD issue in parallel any other DNS queries + that might be needed for connection establishment if the SVCB record + is absent, in order to minimize delay in that case and enable the + optimizations discussed in Section 5. + + Once SVCB resolution has concluded, whether successful or not, if at + least one AliasMode record was processed, SVCB-optional clients SHALL + append to the list of endpoints an endpoint consisting of the final + value of $QNAME, the authority endpoint's port number, and no + SvcParams. (This endpoint will be attempted before falling back to + non-SVCB connection modes. This ensures that SVCB-optional clients + will make use of an AliasMode record whose TargetName has A and/or + AAAA records but no SVCB records.) + + The client proceeds with connection establishment using this list of + endpoints. Clients SHOULD try higher-priority alternatives first, + with fallback to lower-priority alternatives. Clients resolve AAAA + and/or A records for the selected TargetName and MAY choose between + them using an approach such as Happy Eyeballs [HappyEyeballsV2]. + + If the client is SVCB-optional and connecting using this list of + endpoints has failed, the client now attempts to use non-SVCB + connection modes. + + Some important optimizations are discussed in Section 5 to avoid + additional latency in comparison to ordinary AAAA/A lookups. + +3.1. Handling Resolution Failures + + If DNS responses are cryptographically protected (e.g., using DNSSEC + or TLS [DoT] [DoH]) and SVCB resolution fails due to an + authentication error, SERVFAIL response, transport error, or timeout, + the client SHOULD abandon its attempt to reach the service, even if + the client is SVCB-optional. Otherwise, an active attacker could + mount a downgrade attack by denying the user access to the SvcParams. + + A SERVFAIL error can occur if the domain is DNSSEC-signed, the + recursive resolver is DNSSEC-validating, and the attacker is between + the recursive resolver and the authoritative DNS server. A transport + error or timeout can occur if an active attacker between the client + and the recursive resolver is selectively dropping SVCB queries or + responses, based on their size or other observable patterns. + + If the client enforces DNSSEC validation on A/AAAA responses, it + SHOULD apply the same validation policy to SVCB. Otherwise, an + attacker could defeat the A/AAAA protection by forging SVCB responses + that direct the client to other IP addresses. + + If DNS responses are not cryptographically protected, clients MAY + treat SVCB resolution failure as fatal or nonfatal. + + If the client is unable to complete SVCB resolution due to its chain + length limit, the client MUST fall back to the authority endpoint, as + if the service's SVCB record did not exist. + +3.2. Clients Using a Proxy + + Clients using a domain-oriented transport proxy like HTTP CONNECT + ([RFC7231], Section 4.3.6) or SOCKS5 [RFC1928] have the option of + using named destinations, in which case the client does not perform + any A or AAAA queries for destination domains. If the client is + configured to use named destinations with a proxy that does not + provide SVCB query capability (e.g., through an affiliated DNS + resolver), the client would have to perform SVCB resolution + separately, likely disclosing the destinations to additional parties + and not just the proxy. Clients in this configuration SHOULD arrange + for a separate SVCB resolution procedure with appropriate privacy + properties. If this is not possible, SVCB-optional clients MUST + disable SVCB resolution entirely, and SVCB-reliant clients MUST treat + the configuration as invalid. + + If the client does use SVCB and named destinations, the client SHOULD + follow the standard SVCB resolution process, selecting the smallest- + SvcPriority option that is compatible with the client and the proxy. + When connecting using a SVCB record, clients MUST provide the final + TargetName and port to the proxy, which will perform any required A + and AAAA lookups. + + This arrangement has several benefits: + + * Compared to disabling SVCB: + + - It allows the client to use the SvcParams, if present, which + are only usable with a specific TargetName. The SvcParams may + include information that enhances performance (e.g., supported + protocols) and privacy. + + - It allows a service on an apex domain to use aliasing. + + * Compared to providing the proxy with an IP address: + + - It allows the proxy to select between IPv4 and IPv6 addresses + for the server according to its configuration. + + - It ensures that the proxy receives addresses based on its + network geolocation, not the client's. + + - It enables faster fallback for TCP destinations with multiple + addresses of the same family. + +4. DNS Server Behavior + +4.1. Authoritative Servers + + When replying to a SVCB query, authoritative DNS servers SHOULD + return A, AAAA, and SVCB records in the Additional section for any + TargetNames that are in the zone. If the zone is signed, the server + SHOULD also include DNSSEC records authenticating the existence or + nonexistence of these records in the Additional section. + + See Section 4.4 for exceptions. + +4.2. Recursive Resolvers + + Whether the recursive resolver is aware of SVCB or not, the normal + response construction process used for unknown RR types [RFC3597] + generates the Answer section of the response. Recursive resolvers + that are aware of SVCB SHOULD help the client to execute the + procedure in Section 3 with minimum overall latency by incorporating + additional useful information into the Additional section of the + response as follows: + + 1. Incorporate the results of SVCB resolution. If the recursive + resolver's local chain length limit (which may be different from + the client's limit) has been reached, terminate. + + 2. If any of the resolved SVCB records are in AliasMode, choose one + of them at random, and resolve SVCB, A, and AAAA records for its + TargetName. + + * If any SVCB records are resolved, go to Step 1. + + * Otherwise, incorporate the results of A and AAAA resolution, + and terminate. + + 3. All the resolved SVCB records are in ServiceMode. Resolve A and + AAAA queries for each TargetName (or for the owner name if + TargetName is "."), incorporate all the results, and terminate. + + In this procedure, "resolve" means the resolver's ordinary recursive + resolution procedure, as if processing a query for that RRset. This + includes following any aliases that the resolver would ordinarily + follow (e.g., CNAME, DNAME [DNAME]). Errors or anomalies in + obtaining additional records MAY cause this process to terminate but + MUST NOT themselves cause the resolver to send a failure response. + + See Section 2.4.2 for additional safeguards for recursive resolvers + to implement to mitigate loops. + + See Section 5.2 for possible optimizations of this procedure. + +4.2.1. DNS64 + + DNS64 resolvers synthesize responses to AAAA queries for names that + only have an A record (Section 5.1.7 of [RFC6147]). SVCB-aware DNS64 + resolvers SHOULD apply the same synthesis logic when resolving AAAA + records for the TargetName for inclusion in the Additional section + (Step 2 in Section 4.2) and MAY omit the A records from this section. + + DNS64 resolvers MUST NOT extrapolate the AAAA synthesis logic to the + IP hints in the SvcParams (Section 7.3). Modifying the IP hints + would break DNSSEC validation for the SVCB record and would not + improve performance when the above recommendation is implemented. + +4.3. General Requirements + + Recursive resolvers MUST be able to convey SVCB records with + unrecognized SvcParamKeys. Resolvers MAY accomplish this by treating + the entire SvcParams portion of the record as opaque, even if the + contents are invalid. If a recognized SvcParamKey is followed by a + value that is invalid according to the SvcParam's specification, a + recursive resolver MAY report an error such as SERVFAIL instead of + returning the record. For complex value types whose interpretation + might differ between implementations or have additional future + allowed values added (e.g., URIs or "alpn"), resolvers SHOULD limit + validation to specified constraints. + + When responding to a query that includes the DNSSEC OK bit [RFC3225], + DNSSEC-capable recursive and authoritative DNS servers MUST accompany + each RRset in the Additional section with the same DNSSEC-related + records that they would send when providing that RRset as an Answer + (e.g., RRSIG, NSEC, NSEC3). + + According to Section 5.4.1 of [RFC2181], "Unauthenticated RRs + received and cached from ... the additional data section ... should + not be cached in such a way that they would ever be returned as + answers to a received query. They may be returned as additional + information where appropriate." Recursive resolvers therefore MAY + cache records from the Additional section for use in populating + Additional section responses and MAY cache them for general use if + they are authenticated by DNSSEC. + +4.4. EDNS Client Subnet (ECS) + + The EDNS Client Subnet (ECS) option [RFC7871] allows recursive + resolvers to request IP addresses that are suitable for a particular + client IP range. SVCB records may contain IP addresses (in ipv*hint + SvcParams) or direct users to a subnet-specific TargetName, so + recursive resolvers SHOULD include the same ECS option in SVCB + queries as in A/AAAA queries. + + According to Section 7.3.1 of [RFC7871], "Any records from [the + Additional section] MUST NOT be tied to a network." Accordingly, + when processing a response whose QTYPE is SVCB-compatible, resolvers + SHOULD treat any records in the Additional section as having SOURCE + PREFIX-LENGTH set to zero and SCOPE PREFIX-LENGTH as specified in the + ECS option. Authoritative servers MUST omit such records if they are + not suitable for use by any stub resolvers that set SOURCE PREFIX- + LENGTH to zero. This will cause the resolver to perform a follow-up + query that can receive a properly tailored ECS. (This is similar to + the usage of CNAME with the ECS option as discussed in [RFC7871], + Section 7.2.1.) + + Authoritative servers that omit Additional records can avoid the + added latency of a follow-up query by following the advice in + Section 10.2. + +5. Performance Optimizations + + For optimal performance (i.e., minimum connection setup time), + clients SHOULD implement a client-side DNS cache. Responses in the + Additional section of a SVCB response SHOULD be placed in cache + before performing any follow-up queries. With this behavior, and + with conforming DNS servers, using SVCB does not add network latency + to connection setup. + + To improve performance when using a non-conforming recursive + resolver, clients SHOULD issue speculative A and/or AAAA queries in + parallel with each SVCB query, based on a predicted value of + TargetName (see Section 10.2). + + After a ServiceMode RRset is received, clients MAY try more than one + option in parallel and MAY prefetch A and AAAA records for multiple + TargetNames. + +5.1. Optimistic Pre-connection and Connection Reuse + + If an address response arrives before the corresponding SVCB + response, the client MAY initiate a connection as if the SVCB query + returned NODATA but MUST NOT transmit any information that could be + altered by the SVCB response until it arrives. For example, future + SvcParamKeys could be defined that alter the TLS ClientHello. + + Clients implementing this optimization SHOULD wait for 50 + milliseconds before starting optimistic pre-connection, as per the + guidance in [HappyEyeballsV2]. + + A SVCB record is consistent with a connection if the client would + attempt an equivalent connection when making use of that record. If + a SVCB record is consistent with an active or in-progress connection + C, the client MAY prefer that record and use C as its connection. + For example, suppose the client receives this SVCB RRset for a + protocol that uses TLS over TCP: + + _1234._bar.example.com. 300 IN SVCB 1 svc1.example.net. ( + ipv6hint=2001:db8::1 port=1234 ) + SVCB 2 svc2.example.net. ( + ipv6hint=2001:db8::2 port=1234 ) + + If the client has an in-progress TCP connection to + [2001:db8::2]:1234, it MAY proceed with TLS on that connection, even + though the other record in the RRset has higher priority. + + If none of the SVCB records are consistent with any active or in- + progress connection, clients proceed with connection establishment as + described in Section 3. + +5.2. Generating and Using Incomplete Responses + + When following the procedure in Section 4.2, recursive resolvers MAY + terminate the procedure early and produce a reply that omits some of + the associated RRsets. This is REQUIRED when the chain length limit + is reached (Step 1 in Section 4.2) but might also be appropriate when + the maximum response size is reached or when responding before fully + chasing dependencies would improve performance. When omitting + certain RRsets, recursive resolvers SHOULD prioritize information for + smaller-SvcPriority records. + + As discussed in Section 3, clients MUST be able to fetch additional + information that is required to use a SVCB record, if it is not + included in the initial response. As a performance optimization, if + some of the SVCB records in the response can be used without + requiring additional DNS queries, the client MAY prefer those + records, regardless of their priorities. + +6. SVCB-Compatible RR Types + + An RR type is called "SVCB-compatible" if it permits an + implementation that is identical to SVCB in its: + + * RDATA presentation format + + * RDATA wire format + + * IANA registry used for SvcParamKeys + + * Authoritative server Additional section processing + + * Recursive resolution process + + * Relevant Class (i.e., Internet ("IN") [RFC1035]) + + This allows authoritative and recursive DNS servers to apply + identical processing to all SVCB-compatible RR types. + + All other behaviors described as applying to the SVCB RR also apply + to all SVCB-compatible RR types unless explicitly stated otherwise. + When following an AliasMode record (Section 2.4.2) of RR type $T, the + follow-up query to the TargetName MUST also be for type $T. + + This document defines one SVCB-compatible RR type (other than SVCB + itself): the HTTPS RR type (Section 9), which avoids Attrleaf label + prefixes [Attrleaf] in order to improve compatibility with wildcards + and CNAMEs, which are widely used with HTTP. + + Standards authors should consider carefully whether to use SVCB or + define a new SVCB-compatible RR type, as this choice cannot easily be + reversed after deployment. + +7. Initial SvcParamKeys + + A few initial SvcParamKeys are defined here. These keys are useful + for the "https" scheme, and most are expected to be generally + applicable to other schemes as well. + + Each new protocol mapping document MUST specify which keys are + applicable and safe to use. Protocol mappings MAY alter the + interpretation of SvcParamKeys but MUST NOT alter their presentation + or wire formats. + +7.1. "alpn" and "no-default-alpn" + + The "alpn" and "no-default-alpn" SvcParamKeys together indicate the + set of Application-Layer Protocol Negotiation (ALPN) protocol + identifiers [ALPN] and associated transport protocols supported by + this service endpoint (the "SVCB ALPN set"). + + As with Alt-Svc [AltSvc], each ALPN protocol identifier is used to + identify the application protocol and associated suite of protocols + supported by the endpoint (the "protocol suite"). The presence of an + ALPN protocol identifier in the SVCB ALPN set indicates that this + service endpoint, described by TargetName and the other parameters + (e.g., "port"), offers service with the protocol suite associated + with this ALPN identifier. + + Clients filter the set of ALPN identifiers to match the protocol + suites they support, and this informs the underlying transport + protocol used (such as QUIC over UDP or TLS over TCP). ALPN protocol + identifiers that do not uniquely identify a protocol suite (e.g., an + Identification Sequence that can be used with both TLS and DTLS) are + not compatible with this SvcParamKey and MUST NOT be included in the + SVCB ALPN set. + +7.1.1. Representation + + ALPNs are identified by their registered "Identification Sequence" + (alpn-id), which is a sequence of 1-255 octets. + + alpn-id = 1*255OCTET + + For "alpn", the presentation value SHALL be a comma-separated list + (Appendix A.1) of one or more alpn-ids. Zone-file implementations + MAY disallow the "," and "\" characters in ALPN IDs instead of + implementing the value-list escaping procedure, relying on the opaque + key format (e.g., key1=\002h2) in the event that these characters are + needed. + + The wire-format value for "alpn" consists of at least one alpn-id + prefixed by its length as a single octet, and these length-value + pairs are concatenated to form the SvcParamValue. These pairs MUST + exactly fill the SvcParamValue; otherwise, the SvcParamValue is + malformed. + + For "no-default-alpn", the presentation and wire-format values MUST + be empty. When "no-default-alpn" is specified in an RR, "alpn" must + also be specified in order for the RR to be "self-consistent" + (Section 2.4.3). + + Each scheme that uses this SvcParamKey defines a "default set" of + ALPN IDs that are supported by nearly all clients and servers; this + set MAY be empty. To determine the SVCB ALPN set, the client starts + with the list of alpn-ids from the "alpn" SvcParamKey, and it adds + the default set unless the "no-default-alpn" SvcParamKey is present. + +7.1.2. Use + + To establish a connection to the endpoint, clients MUST + + 1. Let SVCB-ALPN-Intersection be the set of protocols in the SVCB + ALPN set that the client supports. + + 2. Let Intersection-Transports be the set of transports (e.g., TLS, + DTLS, QUIC) implied by the protocols in SVCB-ALPN-Intersection. + + 3. For each transport in Intersection-Transports, construct a + ProtocolNameList containing the Identification Sequences of all + the client's supported ALPN protocols for that transport, without + regard to the SVCB ALPN set. + + For example, if the SVCB ALPN set is ["http/1.1", "h3"] and the + client supports HTTP/1.1, HTTP/2, and HTTP/3, the client could + attempt to connect using TLS over TCP with a ProtocolNameList of + ["http/1.1", "h2"] and could also attempt a connection using QUIC + with a ProtocolNameList of ["h3"]. + + Once the client has constructed a ClientHello, protocol negotiation + in that handshake proceeds as specified in [ALPN], without regard to + the SVCB ALPN set. + + Clients MAY implement a fallback procedure, using a less-preferred + transport if more-preferred transports fail to connect. This + fallback behavior is vulnerable to manipulation by a network attacker + who blocks the more-preferred transports, but it may be necessary for + compatibility with existing networks. + + With this procedure in place, an attacker who can modify DNS and + network traffic can prevent a successful transport connection but + cannot otherwise interfere with ALPN protocol selection. This + procedure also ensures that each ProtocolNameList includes at least + one protocol from the SVCB ALPN set. + + Clients SHOULD NOT attempt connection to a service endpoint whose + SVCB ALPN set does not contain any supported protocols. + + To ensure consistency of behavior, clients MAY reject the entire SVCB + RRset and fall back to basic connection establishment if all of the + compatible RRs indicate "no-default-alpn", even if connection could + have succeeded using a non-default ALPN protocol. + + Zone operators SHOULD ensure that at least one RR in each RRset + supports the default transports. This enables compatibility with the + greatest number of clients. + +7.2. "port" + + The "port" SvcParamKey defines the TCP or UDP port that should be + used to reach this alternative endpoint. If this key is not present, + clients SHALL use the authority endpoint's port number. + + The presentation value of the SvcParamValue is a single decimal + integer between 0 and 65535 in ASCII. Any other value (e.g., an + empty value) is a syntax error. To enable simpler parsing, this + SvcParamValue MUST NOT contain escape sequences. + + The wire format of the SvcParamValue is the corresponding 2-octet + numeric value in network byte order. + + If a port-restricting firewall is in place between some client and + the service endpoint, changing the port number might cause that + client to lose access to the service, so operators should exercise + caution when using this SvcParamKey to specify a non-default port. + +7.3. "ipv4hint" and "ipv6hint" + + The "ipv4hint" and "ipv6hint" keys convey IP addresses that clients + MAY use to reach the service. If A and AAAA records for TargetName + are locally available, the client SHOULD ignore these hints. + Otherwise, clients SHOULD perform A and/or AAAA queries for + TargetName per Section 3, and clients SHOULD use the IP address in + those responses for future connections. Clients MAY opt to terminate + any connections using the addresses in hints and instead switch to + the addresses in response to the TargetName query. Failure to use A + and/or AAAA response addresses could negatively impact load balancing + or other geo-aware features and thereby degrade client performance. + + The presentation value SHALL be a comma-separated list (Appendix A.1) + of one or more IP addresses of the appropriate family in standard + textual format [RFC5952] [RFC4001]. To enable simpler parsing, this + SvcParamValue MUST NOT contain escape sequences. + + The wire format for each parameter is a sequence of IP addresses in + network byte order (for the respective address family). Like an A or + AAAA RRset, the list of addresses represents an unordered collection, + and clients SHOULD pick addresses to use in a random order. An empty + list of addresses is invalid. + + When selecting between IPv4 and IPv6 addresses to use, clients may + use an approach such as Happy Eyeballs [HappyEyeballsV2]. When only + "ipv4hint" is present, NAT64 clients may synthesize IPv6 addresses as + specified in [RFC7050] or ignore the "ipv4hint" key and wait for AAAA + resolution (Section 3). For best performance, server operators + SHOULD include an "ipv6hint" parameter whenever they include an + "ipv4hint" parameter. + + These parameters are intended to minimize additional connection + latency when a recursive resolver is not compliant with the + requirements in Section 4 and SHOULD NOT be included if most clients + are using compliant recursive resolvers. When TargetName is the + service name or the owner name (which can be written as "."), server + operators SHOULD NOT include these hints, because they are unlikely + to convey any performance benefit. + +7.4. "mandatory" + + See Section 8. + +8. ServiceMode RR Compatibility and Mandatory Keys + + In a ServiceMode RR, a SvcParamKey is considered "mandatory" if the + RR will not function correctly for clients that ignore this + SvcParamKey. Each SVCB protocol mapping SHOULD specify a set of keys + that are "automatically mandatory", i.e., mandatory if they are + present in an RR. The SvcParamKey "mandatory" is used to indicate + any mandatory keys for this RR, in addition to any automatically + mandatory keys that are present. + + A ServiceMode RR is considered "compatible" by a client if the client + recognizes all the mandatory keys and their values indicate that + successful connection establishment is possible. Incompatible RRs + are ignored (see step 5 of the procedure defined in Section 3). + + The presentation value SHALL be a comma-separated list (Appendix A.1) + of one or more valid SvcParamKeys, either by their registered name or + in the unknown-key format (Section 2.1). Keys MAY appear in any + order but MUST NOT appear more than once. For self-consistency + (Section 2.4.3), listed keys MUST also appear in the SvcParams. + + To enable simpler parsing, this SvcParamValue MUST NOT contain escape + sequences. + + For example, the following is a valid list of SvcParams: + + ipv6hint=... key65333=ex1 key65444=ex2 mandatory=key65444,ipv6hint + + In wire format, the keys are represented by their numeric values in + network byte order, concatenated in strictly increasing numeric + order. + + This SvcParamKey is always automatically mandatory and MUST NOT + appear in its own value-list. Other automatically mandatory keys + SHOULD NOT appear in the list either. (Including them wastes space + and otherwise has no effect.) + +9. Using Service Bindings with HTTP + + The use of any protocol with SVCB requires a protocol-specific + mapping specification. This section specifies the mapping for the + "http" and "https" URI schemes [HTTP]. + + To enable special handling for HTTP use cases, the HTTPS RR type is + defined as a SVCB-compatible RR type, specific to the "https" and + "http" schemes. Clients MUST NOT perform SVCB queries or accept SVCB + responses for "https" or "http" schemes. + + The presentation format of the record is: + + Name TTL IN HTTPS SvcPriority TargetName SvcParams + + All the SvcParamKeys defined in Section 7 are permitted for use in + HTTPS RRs. The default set of ALPN IDs is the single value + "http/1.1". The "automatically mandatory" keys (Section 8) are + "port" and "no-default-alpn". (As described in Section 8, clients + must either implement these keys or ignore any RR in which they + appear.) Clients that restrict the destination port in "https" URIs + (e.g., using the "bad ports" list from [FETCH]) SHOULD apply the same + restriction to the "port" SvcParam. + + The presence of an HTTPS RR for an origin also indicates that clients + should connect securely and use the "https" scheme, as discussed in + Section 9.5. This allows HTTPS RRs to apply to pre-existing "http" + scheme URLs, while ensuring that the client uses a secure and + authenticated connection. + + The HTTPS RR parallels the concepts introduced in "HTTP Alternative + Services" [AltSvc]. Clients and servers that implement HTTPS RRs are + not required to implement Alt-Svc. + +9.1. Query Names for HTTPS RRs + + The HTTPS RR uses Port Prefix Naming (Section 2.3), with one + modification: if the scheme is "https" and the port is 443, then the + client's original QNAME is equal to the service name (i.e., the + origin's hostname), without any prefix labels. + + By removing the Attrleaf labels [Attrleaf] used in SVCB, this + construction enables offline DNSSEC signing of wildcard domains, + which are commonly used with HTTP. Using the service name as the + owner name of the HTTPS record, without prefixes, also allows the + targets of existing CNAME chains (e.g., CDN hosts) to start returning + HTTPS RR responses without requiring origin domains to configure and + maintain an additional delegation. + + The procedure for following HTTPS AliasMode RRs and CNAME aliases is + unchanged from SVCB (as described in Sections 2.4.2 and 3). + + Clients always convert "http" URLs to "https" before performing an + HTTPS RR query using the process described in Section 9.5, so domain + owners MUST NOT publish HTTPS RRs with a prefix of "_http". + + Note that none of these forms alter the HTTPS origin or authority. + For example, clients MUST continue to validate TLS certificate + hostnames based on the origin. + +9.2. Comparison with Alt-Svc + + Publishing a ServiceMode HTTPS RR in DNS is intended to be similar to + transmitting an Alt-Svc field value over HTTP, and receiving an HTTPS + RR is intended to be similar to receiving that field value over HTTP. + However, there are some differences in the intended client and server + behavior. + +9.2.1. ALPN Usage + + Unlike Alt-Svc field values, HTTPS RRs can contain multiple ALPN IDs. + The meaning and use of these IDs are discussed in Section 7.1.2. + +9.2.2. Untrusted Channels + + HTTPS records do not require or provide any assurance of + authenticity. (DNSSEC signing and verification, which would provide + such assurance, are OPTIONAL.) The DNS resolution process is modeled + as an untrusted channel that might be controlled by an attacker, so + Alt-Svc parameters that cannot be safely received in this model MUST + NOT have a corresponding defined SvcParamKey. For example, there is + no SvcParamKey corresponding to the Alt-Svc "persist" parameter, + because this parameter is not safe to accept over an untrusted + channel. + +9.2.3. Cache Lifetime + + There is no SvcParamKey corresponding to the Alt-Svc "ma" (max age) + parameter. Instead, server operators encode the expiration time in + the DNS TTL. + + The appropriate TTL value might be different from the "ma" value used + for Alt-Svc, depending on the desired efficiency and agility. Some + DNS caches incorrectly extend the lifetime of DNS records beyond the + stated TTL, so server operators cannot rely on HTTPS RRs expiring on + time. Shortening the TTL to compensate for incorrect caching is NOT + RECOMMENDED, as this practice impairs the performance of correctly + functioning caches and does not guarantee faster expiration from + incorrect caches. Instead, server operators SHOULD maintain + compatibility with expired records until they observe that nearly all + connections have migrated to the new configuration. + +9.2.4. Granularity + + Sending Alt-Svc over HTTP allows the server to tailor the Alt-Svc + field value specifically to the client. When using an HTTPS RR, + groups of clients will necessarily receive the same SvcParams. + Therefore, HTTPS RRs are not suitable for uses that require single- + client granularity. + +9.3. Interaction with Alt-Svc + + Clients that implement support for both Alt-Svc and HTTPS records and + are making a connection based on a cached Alt-Svc response SHOULD + retrieve any HTTPS records for the Alt-Svc alt-authority and ensure + that their connection attempts are consistent with both the Alt-Svc + parameters and any received HTTPS SvcParams. If present, the HTTPS + record's TargetName and port are used for connection establishment + (per Section 3). For example, suppose that "https://example.com" + sends an Alt-Svc field value of: + + Alt-Svc: h2="alt.example:443", h2="alt2.example:443", h3=":8443" + + The client would retrieve the following HTTPS records: + + alt.example. IN HTTPS 1 . alpn=h2,h3 foo=... + alt2.example. IN HTTPS 1 alt2b.example. alpn=h3 foo=... + _8443._https.example.com. IN HTTPS 1 alt3.example. ( + port=9443 alpn=h2,h3 foo=... ) + + Based on these inputs, the following connection attempts would always + be allowed: + + * HTTP/2 to alt.example:443 + + * HTTP/3 to alt3.example:9443 + + * Fallback to the client's non-Alt-Svc connection behavior + + The following connection attempts would not be allowed: + + * HTTP/3 to alt.example:443 (not consistent with Alt-Svc) + + * Any connection to alt2b.example (no ALPN ID consistent with both + the HTTPS record and Alt-Svc) + + * HTTPS over TCP to any port on alt3.example (not consistent with + Alt-Svc) + + Suppose that "foo" is a SvcParamKey that renders the client SVCB- + reliant. The following Alt-Svc-only connection attempts would be + allowed only if the client does not support "foo", as they rely on + SVCB-optional fallback behavior: + + * HTTP/2 to alt2.example:443 + + * HTTP/3 to example.com:8443 + + Alt-authorities SHOULD carry the same SvcParams as the origin unless + a deviation is specifically known to be safe. As noted in + Section 2.4 of [AltSvc], clients MAY disallow any Alt-Svc connection + according to their own criteria, e.g., disallowing Alt-Svc + connections that lack support for privacy features that are available + on the authority endpoint. + +9.4. Requiring Server Name Indication + + Clients MUST NOT use an HTTPS RR response unless the client supports + the TLS Server Name Indication (SNI) extension and indicates the + origin name in the TLS ClientHello (which might be encrypted via a + future specification such as [ECH]). This supports the conservation + of IP addresses. + + Note that the TLS SNI (and also the HTTP "Host" or ":authority") will + indicate the origin, not the TargetName. + +9.5. HTTP Strict Transport Security (HSTS) + + An HTTPS RR directs the client to communicate with this host only + over a secure transport, similar to HSTS [HSTS]. Prior to making an + "http" scheme request, the client SHOULD perform a lookup to + determine if any HTTPS RRs exist for that origin. To do so, the + client SHOULD construct a corresponding "https" URL as follows: + + 1. Replace the "http" scheme with "https". + + 2. If the "http" URL explicitly specifies port 80, specify port 443. + + 3. Do not alter any other aspect of the URL. + + This construction is equivalent to Section 8.3 of [HSTS], Step 5. + + If an HTTPS RR query for this "https" URL returns any AliasMode HTTPS + RRs or any compatible ServiceMode HTTPS RRs (see Section 8), the + client SHOULD behave as if it has received an HTTP 307 (Temporary + Redirect) status code with this "https" URL in the "Location" field. + (Receipt of an incompatible ServiceMode RR does not trigger the + redirect behavior.) Because HTTPS RRs are received over an often- + insecure channel (DNS), clients MUST NOT place any more trust in this + signal than if they had received a 307 (Temporary Redirect) response + over cleartext HTTP. + + Publishing an HTTPS RR can potentially lead to unexpected results or + a loss in functionality in cases where the "http" resource neither + redirects to the "https" resource nor references the same underlying + resource. + + When an "https" connection fails due to an error in the underlying + secure transport, such as an error in certificate validation, some + clients currently offer a "user recourse" that allows the user to + bypass the security error and connect anyway. When making an "https" + scheme request to an origin with an HTTPS RR, either directly or via + the above redirect, such a client MAY remove the user recourse + option. Origins that publish HTTPS RRs therefore MUST NOT rely on + user recourse for access. For more information, see Sections 8.4 and + 12.1 of [HSTS]. + +9.6. Use of HTTPS RRs in Other Protocols + + All HTTP connections to named origins are eligible to use HTTPS RRs, + even when HTTP is used as part of another protocol or without an + explicit HTTP-related URI scheme (Section 4.2 of [HTTP]). For + example, clients that support HTTPS RRs and implement [WebSocket] + using the altered opening handshake from [FETCH-WEBSOCKETS] SHOULD + use HTTPS RRs for the requestURL. + + When HTTP is used in a context where URLs or redirects are not + applicable (e.g., connections to an HTTP proxy), clients that find a + corresponding HTTPS RR SHOULD implement security upgrade behavior + equivalent to that specified in Section 9.5. + + Such protocols MAY define their own SVCB mappings, which MAY be + defined to take precedence over HTTPS RRs. + +10. Zone Structures + +10.1. Structuring Zones for Flexibility + + Each ServiceMode RRset can only serve a single scheme. The scheme is + indicated by the owner name and the RR type. For the generic SVCB RR + type, this means that each owner name can only be used for a single + scheme. The underscore prefixing requirement (Section 2.3) ensures + that this is true for the initial query, but it is the responsibility + of zone owners to choose names that satisfy this constraint when + using aliases, including CNAME and AliasMode records. + + When using the generic SVCB RR type with aliasing, zone owners SHOULD + choose alias target names that indicate the scheme in use (e.g., + "foosvc.example.net" for "foo" schemes). This will help to avoid + confusion when another scheme needs to be added to the configuration. + When multiple port numbers are in use, it may be helpful to repeat + the prefix labels in the alias target name (e.g., + "_1234._foo.svc.example.net"). + +10.2. Structuring Zones for Performance + + To avoid a delay for clients using a non-conforming recursive + resolver, domain owners SHOULD minimize the use of AliasMode records + and SHOULD choose TargetName according to a predictable convention + that is known to the client, so that clients can issue A and/or AAAA + queries for TargetName in advance (see Section 5). Unless otherwise + specified, the convention is to set TargetName to the service name + for an initial ServiceMode record, or to "." if it is reached via an + alias. + + $ORIGIN example.com. ; Origin + foo 3600 IN CNAME foosvc.example.net. + _8080._foo.foo 3600 IN CNAME foosvc.example.net. + bar 300 IN AAAA 2001:db8::2 + _9090._bar.bar 3600 IN SVCB 1 bar key65444=... + + $ORIGIN example.net. ; Service provider zone + foosvc 3600 IN SVCB 1 . key65333=... + foosvc 300 IN AAAA 2001:db8::1 + + Figure 1: "foo://foo.example.com:8080" Is Available at + "foosvc.example.net", but "bar://bar.example.com:9090" Is Served + Locally + + Domain owners SHOULD avoid using a TargetName that is below a DNAME, + as this is likely unnecessary and makes responses slower and larger. + Also, zone structures that require following more than eight aliases + (counting both AliasMode and CNAME records) are NOT RECOMMENDED. + +10.3. Operational Considerations + + Some authoritative DNS servers may not allow A or AAAA records on + names starting with an underscore (e.g., [BIND-CHECK-NAMES]). This + could create an operational issue when the TargetName contains an + Attrleaf label, or when using a TargetName of "." if the owner name + contains an Attrleaf label. + +10.4. Examples + +10.4.1. Protocol Enhancements + + Consider a simple zone of the form: + + $ORIGIN simple.example. ; Simple example zone + @ 300 IN A 192.0.2.1 + AAAA 2001:db8::1 + + The domain owner could add this record: + + @ 7200 IN HTTPS 1 . alpn=h3 + + This record would indicate that "https://simple.example" supports + QUIC in addition to HTTP/1.1 over TLS over TCP (the implicit + default). The record could also include other information (e.g., a + non-standard port). For "https://simple.example:8443", the record + would be: + + _8443._https 7200 IN HTTPS 1 . alpn=h3 + + These records also respectively tell clients to replace the scheme + with "https" when loading "http://simple.example" or + "http://simple.example:8443". + +10.4.2. Apex Aliasing + + Consider a zone that is using CNAME aliasing: + + $ORIGIN aliased.example. ; A zone that is using a hosting service + ; Subdomain aliased to a high-performance server pool + www 7200 IN CNAME pool.svc.example. + ; Apex domain on fixed IPs because CNAME is not allowed at the apex + @ 300 IN A 192.0.2.1 + IN AAAA 2001:db8::1 + + With HTTPS RRs, the owner of aliased.example could alias the apex by + adding one additional record: + + @ 7200 IN HTTPS 0 pool.svc.example. + + With this record in place, HTTPS-RR-aware clients will use the same + server pool for aliased.example and www.aliased.example. (They will + also upgrade "http://aliased.example/..." to "https".) Non-HTTPS-RR- + aware clients will just ignore the new record. + + Similar to CNAME, HTTPS RRs have no impact on the origin name. When + connecting, clients will continue to treat the authoritative origins + as "https://www.aliased.example" and "https://aliased.example", + respectively, and will validate TLS server certificates accordingly. + +10.4.3. Parameter Binding + + Suppose that svc.example's primary server pool supports HTTP/3 but + its backup server pool does not. This can be expressed in the + following form: + + $ORIGIN svc.example. ; A hosting provider + pool 7200 IN HTTPS 1 . alpn=h2,h3 + HTTPS 2 backup alpn=h2 port=8443 + pool 300 IN A 192.0.2.2 + AAAA 2001:db8::2 + backup 300 IN A 192.0.2.3 + AAAA 2001:db8::3 + + This configuration is entirely compatible with the "apex aliasing" + example, whether the client supports HTTPS RRs or not. If the client + does support HTTPS RRs, all connections will be upgraded to HTTPS, + and clients will use HTTP/3 if they can. Parameters are "bound" to + each server pool, so each server pool can have its own protocol, port + number, etc. + +10.4.4. Multi-CDN Configuration + + The HTTPS RR is intended to support HTTPS services operated by + multiple independent entities, such as different CDNs or different + hosting providers. This includes the case where a service is + migrated from one operator to another, as well as the case where the + service is multiplexed between multiple operators for performance, + redundancy, etc. + + This example shows such a configuration, with www.customer.example + having different DNS responses to different queries, either over time + or due to logic within the authoritative DNS server: + + ; This zone contains/returns different CNAME records + ; at different points in time. The RRset for "www" can + ; only ever contain a single CNAME. + + ; Sometimes the zone has: + $ORIGIN customer.example. ; A multi-CDN customer domain + www 900 IN CNAME cdn1.svc1.example. + + ; and other times it contains: + $ORIGIN customer.example. + www 900 IN CNAME customer.svc2.example. + + ; and yet other times it contains: + $ORIGIN customer.example. + www 900 IN CNAME cdn3.svc3.example. + + ; With the following remaining constant and always included: + $ORIGIN customer.example. ; A multi-CDN customer domain + ; The apex is also aliased to www to match its configuration. + @ 7200 IN HTTPS 0 www + ; Non-HTTPS-aware clients use non-CDN IPs. + A 203.0.113.82 + AAAA 2001:db8:203::2 + + ; Resolutions following the cdn1.svc1.example + ; path use these records. + ; This CDN uses a different alternative service for HTTP/3. + $ORIGIN svc1.example. ; domain for CDN 1 + cdn1 1800 IN HTTPS 1 h3pool alpn=h3 + HTTPS 2 . alpn=h2 + A 192.0.2.2 + AAAA 2001:db8:192::4 + h3pool 300 IN A 192.0.2.3 + AAAA 2001:db8:192:7::3 + + ; Resolutions following the customer.svc2.example + ; path use these records. + ; Note that this CDN only supports HTTP/2. + $ORIGIN svc2.example. ; domain operated by CDN 2 + customer 300 IN HTTPS 1 . alpn=h2 + 60 IN A 198.51.100.2 + A 198.51.100.3 + A 198.51.100.4 + AAAA 2001:db8:198::7 + AAAA 2001:db8:198::12 + + ; Resolutions following the cdn3.svc3.example + ; path use these records. + ; Note that this CDN has no HTTPS records. + $ORIGIN svc3.example. ; domain operated by CDN 3 + cdn3 60 IN A 203.0.113.8 + AAAA 2001:db8:113::8 + + Note that in the above example, the different CDNs have different + configurations and different capabilities, but clients will use HTTPS + RRs as a bound-together unit. + + Domain owners should be cautious when using a multi-CDN + configuration, as it introduces a number of complexities highlighted + by this example: + + * If CDN 1 supports a desired protocol or feature and CDN 2 does + not, the client is vulnerable to downgrade by a network adversary + who forces clients to get CDN 2 records. + + * Aliasing the apex to its subdomain simplifies the zone file but + likely increases resolution latency, especially when using a non- + HTTPS-aware recursive resolver. An alternative would be to alias + the zone apex directly to a name managed by a CDN. + + * The A, AAAA, and HTTPS resolutions are independent lookups, so + resolvers may observe and follow different CNAMEs to different + CDNs. Clients may thus find that the A and AAAA responses do not + correspond to the TargetName in the HTTPS response; these clients + will need to perform additional queries to retrieve the correct IP + addresses. Including ipv6hint and ipv4hint will reduce the + performance impact of this case. + + * If not all CDNs publish HTTPS records, clients will sometimes + receive NODATA for HTTPS queries (as with cdn3.svc3.example above) + but could receive A/AAAA records from a different CDN. Clients + will attempt to connect to this CDN without the benefit of its + HTTPS records. + +10.4.5. Non-HTTP Uses + + For protocols other than HTTP, the SVCB RR and an Attrleaf label + [Attrleaf] will be used. For example, to reach an example resource + of "baz://api.example.com:8765", the following SVCB record would be + used to alias it to "svc4-baz.example.net.", which in turn could + return AAAA/A records and/or SVCB records in ServiceMode: + + _8765._baz.api.example.com. 7200 IN SVCB 0 svc4-baz.example.net. + + HTTPS RRs use similar Attrleaf labels if the origin contains a non- + default port. + +11. Interaction with Other Standards + + This standard is intended to reduce connection latency and improve + user privacy. Server operators implementing this standard SHOULD + also implement TLS 1.3 [RFC8446] and Online Certificate Status + Protocol (OCSP) Stapling (i.e., Certificate Status Request in + Section 8 of [RFC6066]), both of which confer substantial performance + and privacy benefits when used in combination with SVCB records. + + To realize the greatest privacy benefits, this proposal is intended + for use over a privacy-preserving DNS transport (like DNS over TLS + [DoT] or DNS over HTTPS [DoH]). However, performance improvements, + and some modest privacy improvements, are possible without the use of + those standards. + + Any specification for the use of SVCB with a protocol MUST have an + entry for its scheme under the SVCB RR type in the IANA DNS + "Underscored and Globally Scoped DNS Node Names" registry [Attrleaf]. + The scheme MUST have an entry in the "Uniform Resource Identifier + (URI) Schemes" registry [RFC7595] and MUST have a defined + specification for use with SVCB. + +12. Security Considerations + + SVCB/HTTPS RRs permit distribution over untrusted channels, and + clients are REQUIRED to verify that the alternative endpoint is + authoritative for the service (similar to Section 2.1 of [AltSvc]). + Therefore, DNSSEC signing and validation are OPTIONAL for publishing + and using SVCB and HTTPS RRs. + + Clients MUST ensure that their DNS cache is partitioned for each + local network, or flushed on network changes, to prevent a local + adversary in one network from implanting a forged DNS record that + allows them to track users or hinder their connections after they + leave that network. + + 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 and use a secure transport. These downgrade + attacks can prevent the "https" upgrade provided by the HTTPS RR + (Section 9.5) and can disable any other protections coordinated via + SvcParams. To prevent downgrades, Section 3.1 recommends that + clients abandon the connection attempt when such an attack is + detected. + + A hostile DNS intermediary might forge AliasMode "." records + (Section 2.5.1) as a way to block clients from accessing particular + services. Such an adversary could already block entire domains by + forging erroneous responses, but this mechanism allows them to target + particular protocols or ports within a domain. Clients that might be + subject to such attacks SHOULD ignore AliasMode "." records. + + A hostile DNS intermediary or authoritative server can return SVCB + records indicating any IP address and port number, including IP + addresses inside the local network and port numbers assigned to + internal services. If the attacker can influence the client's + payload (e.g., TLS session ticket contents) and an internal service + has a sufficiently lax parser, the attacker could gain access to the + internal service. (The same concerns apply to SRV records, HTTP Alt- + Svc, and HTTP redirects.) As a mitigation, SVCB mapping documents + SHOULD indicate any port number restrictions that are appropriate for + the supported transports. + +13. Privacy Considerations + + Standard address queries reveal the user's intent to access a + particular domain. This information is visible to the recursive + resolver, and to many other parties when plaintext DNS transport is + used. SVCB queries, like queries for SRV records and other specific + RR types, additionally reveal the user's intent to use a particular + protocol. This is not normally sensitive information, but it should + be considered when adding SVCB support in a new context. + +14. IANA Considerations + +14.1. SVCB RR Type + + IANA has registered the following new DNS RR type in the "Resource + Record (RR) TYPEs" registry on the "Domain Name System (DNS) + Parameters" page: + + Type: SVCB + Value: 64 + Meaning: General-purpose service binding + Reference: RFC 9460 + +14.2. HTTPS RR Type + + IANA has registered the following new DNS RR type in the "Resource + Record (RR) TYPEs" registry on the "Domain Name System (DNS) + Parameters" page: + + Type: HTTPS + Value: 65 + Meaning: SVCB-compatible type for use with HTTP + Reference: RFC 9460 + +14.3. New Registry for Service Parameters + + IANA has created the "Service Parameter Keys (SvcParamKeys)" registry + in the "Domain Name System (DNS) Parameters" category on a new page + entitled "DNS Service Bindings (SVCB)". This registry defines the + namespace for parameters, including string representations and + numeric SvcParamKey values. This registry is shared with other SVCB- + compatible RR types, such as the HTTPS RR. + +14.3.1. Procedure + + A registration MUST include the following fields: + + Number: Wire-format numeric identifier (range 0-65535) + Name: Unique presentation name + Meaning: A short description + Reference: Location of specification or registration source + Change Controller: Person or entity, with contact information if + appropriate + + The characters in the registered Name field entry MUST be lowercase + alphanumeric or "-" (Section 2.1). The name MUST NOT start with + "key" or "invalid". + + The registration policy for new entries is Expert Review ([RFC8126], + Section 4.5). The designated expert MUST ensure that the reference + is stable and publicly available and that it specifies how to convert + the SvcParamValue's presentation format to wire format. The + reference MAY be any individual's Internet-Draft or a document from + any other source with similar assurances of stability and + availability. An entry MAY specify a reference of the form "Same as + (other key name)" if it uses the same presentation and wire formats + as an existing key. + + This arrangement supports the development of new parameters while + ensuring that zone files can be made interoperable. + +14.3.2. Initial Contents + + The "Service Parameter Keys (SvcParamKeys)" registry has been + populated with the following initial registrations: + + +===========+=================+================+=========+==========+ + | Number | Name | Meaning |Reference|Change | + | | | | |Controller| + +===========+=================+================+=========+==========+ + | 0 | mandatory | Mandatory |RFC 9460,|IETF | + | | | keys in this |Section 8| | + | | | RR | | | + +-----------+-----------------+----------------+---------+----------+ + | 1 | alpn | Additional |RFC 9460,|IETF | + | | | supported |Section | | + | | | protocols |7.1 | | + +-----------+-----------------+----------------+---------+----------+ + | 2 | no-default-alpn | No support |RFC 9460,|IETF | + | | | for default |Section | | + | | | protocol |7.1 | | + +-----------+-----------------+----------------+---------+----------+ + | 3 | port | Port for |RFC 9460,|IETF | + | | | alternative |Section | | + | | | endpoint |7.2 | | + +-----------+-----------------+----------------+---------+----------+ + | 4 | ipv4hint | IPv4 address |RFC 9460,|IETF | + | | | hints |Section | | + | | | |7.3 | | + +-----------+-----------------+----------------+---------+----------+ + | 5 | ech | RESERVED |N/A |IETF | + | | | (held for | | | + | | | Encrypted | | | + | | | ClientHello) | | | + +-----------+-----------------+----------------+---------+----------+ + | 6 | ipv6hint | IPv6 address |RFC 9460,|IETF | + | | | hints |Section | | + | | | |7.3 | | + +-----------+-----------------+----------------+---------+----------+ + |65280-65534| N/A | Reserved for |RFC 9460 |IETF | + | | | Private Use | | | + +-----------+-----------------+----------------+---------+----------+ + | 65535 | N/A | Reserved |RFC 9460 |IETF | + | | | ("Invalid | | | + | | | key") | | | + +-----------+-----------------+----------------+---------+----------+ + + Table 1 + +14.4. Other Registry Updates + + Per [Attrleaf], the following entry has been added to the DNS + "Underscored and Globally Scoped DNS Node Names" registry: + + +=========+============+===========+ + | RR Type | _NODE NAME | Reference | + +=========+============+===========+ + | HTTPS | _https | RFC 9460 | + +---------+------------+-----------+ + + Table 2 + +15. References + +15.1. Normative References + + [ALPN] Friedl, S., Popov, A., Langley, A., and E. Stephan, + "Transport Layer Security (TLS) Application-Layer Protocol + Negotiation Extension", RFC 7301, DOI 10.17487/RFC7301, + July 2014, <https://www.rfc-editor.org/info/rfc7301>. + + [Attrleaf] Crocker, D., "Scoped Interpretation of DNS Resource + Records through "Underscored" Naming of Attribute Leaves", + BCP 222, RFC 8552, DOI 10.17487/RFC8552, March 2019, + <https://www.rfc-editor.org/info/rfc8552>. + + [DoH] Hoffman, P. and P. McManus, "DNS Queries over HTTPS + (DoH)", RFC 8484, DOI 10.17487/RFC8484, October 2018, + <https://www.rfc-editor.org/info/rfc8484>. + + [DoT] Hu, Z., Zhu, L., Heidemann, J., Mankin, A., Wessels, D., + and P. Hoffman, "Specification for DNS over Transport + Layer Security (TLS)", RFC 7858, DOI 10.17487/RFC7858, May + 2016, <https://www.rfc-editor.org/info/rfc7858>. + + [HappyEyeballsV2] + Schinazi, D. and T. Pauly, "Happy Eyeballs Version 2: + Better Connectivity Using Concurrency", RFC 8305, + DOI 10.17487/RFC8305, December 2017, + <https://www.rfc-editor.org/info/rfc8305>. + + [HTTP] Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, + Ed., "HTTP Semantics", STD 97, RFC 9110, + DOI 10.17487/RFC9110, June 2022, + <https://www.rfc-editor.org/info/rfc9110>. + + [RFC1034] Mockapetris, P., "Domain names - concepts and facilities", + STD 13, RFC 1034, DOI 10.17487/RFC1034, November 1987, + <https://www.rfc-editor.org/info/rfc1034>. + + [RFC1035] Mockapetris, P., "Domain names - implementation and + specification", STD 13, RFC 1035, DOI 10.17487/RFC1035, + November 1987, <https://www.rfc-editor.org/info/rfc1035>. + + [RFC1928] Leech, M., Ganis, M., Lee, Y., Kuris, R., Koblas, D., and + L. Jones, "SOCKS Protocol Version 5", RFC 1928, + DOI 10.17487/RFC1928, March 1996, + <https://www.rfc-editor.org/info/rfc1928>. + + [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate + Requirement Levels", BCP 14, RFC 2119, + DOI 10.17487/RFC2119, March 1997, + <https://www.rfc-editor.org/info/rfc2119>. + + [RFC2181] Elz, R. and R. Bush, "Clarifications to the DNS + Specification", RFC 2181, DOI 10.17487/RFC2181, July 1997, + <https://www.rfc-editor.org/info/rfc2181>. + + [RFC3225] Conrad, D., "Indicating Resolver Support of DNSSEC", + RFC 3225, DOI 10.17487/RFC3225, December 2001, + <https://www.rfc-editor.org/info/rfc3225>. + + [RFC3597] Gustafsson, A., "Handling of Unknown DNS Resource Record + (RR) Types", RFC 3597, DOI 10.17487/RFC3597, September + 2003, <https://www.rfc-editor.org/info/rfc3597>. + + [RFC4001] Daniele, M., Haberman, B., Routhier, S., and J. + Schoenwaelder, "Textual Conventions for Internet Network + Addresses", RFC 4001, DOI 10.17487/RFC4001, February 2005, + <https://www.rfc-editor.org/info/rfc4001>. + + [RFC5234] Crocker, D., Ed. and P. Overell, "Augmented BNF for Syntax + Specifications: ABNF", STD 68, RFC 5234, + DOI 10.17487/RFC5234, January 2008, + <https://www.rfc-editor.org/info/rfc5234>. + + [RFC5952] Kawamura, S. and M. Kawashima, "A Recommendation for IPv6 + Address Text Representation", RFC 5952, + DOI 10.17487/RFC5952, August 2010, + <https://www.rfc-editor.org/info/rfc5952>. + + [RFC6066] Eastlake 3rd, D., "Transport Layer Security (TLS) + Extensions: Extension Definitions", RFC 6066, + DOI 10.17487/RFC6066, January 2011, + <https://www.rfc-editor.org/info/rfc6066>. + + [RFC6147] Bagnulo, M., Sullivan, A., Matthews, P., and I. van + Beijnum, "DNS64: DNS Extensions for Network Address + Translation from IPv6 Clients to IPv4 Servers", RFC 6147, + DOI 10.17487/RFC6147, April 2011, + <https://www.rfc-editor.org/info/rfc6147>. + + [RFC7050] Savolainen, T., Korhonen, J., and D. Wing, "Discovery of + the IPv6 Prefix Used for IPv6 Address Synthesis", + RFC 7050, DOI 10.17487/RFC7050, November 2013, + <https://www.rfc-editor.org/info/rfc7050>. + + [RFC7231] Fielding, R., Ed. and J. Reschke, Ed., "Hypertext Transfer + Protocol (HTTP/1.1): Semantics and Content", RFC 7231, + DOI 10.17487/RFC7231, June 2014, + <https://www.rfc-editor.org/info/rfc7231>. + + [RFC7595] Thaler, D., Ed., Hansen, T., and T. Hardie, "Guidelines + and Registration Procedures for URI Schemes", BCP 35, + RFC 7595, DOI 10.17487/RFC7595, June 2015, + <https://www.rfc-editor.org/info/rfc7595>. + + [RFC7871] Contavalli, C., van der Gaast, W., Lawrence, D., and W. + Kumari, "Client Subnet in DNS Queries", RFC 7871, + DOI 10.17487/RFC7871, May 2016, + <https://www.rfc-editor.org/info/rfc7871>. + + [RFC8126] Cotton, M., Leiba, B., and T. Narten, "Guidelines for + Writing an IANA Considerations Section in RFCs", BCP 26, + RFC 8126, DOI 10.17487/RFC8126, June 2017, + <https://www.rfc-editor.org/info/rfc8126>. + + [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>. + + [RFC8446] Rescorla, E., "The Transport Layer Security (TLS) Protocol + Version 1.3", RFC 8446, DOI 10.17487/RFC8446, August 2018, + <https://www.rfc-editor.org/info/rfc8446>. + + [WebSocket] + Fette, I. and A. Melnikov, "The WebSocket Protocol", + RFC 6455, DOI 10.17487/RFC6455, December 2011, + <https://www.rfc-editor.org/info/rfc6455>. + +15.2. Informative References + + [AltSvc] Nottingham, M., McManus, P., and J. Reschke, "HTTP + Alternative Services", RFC 7838, DOI 10.17487/RFC7838, + April 2016, <https://www.rfc-editor.org/info/rfc7838>. + + [ANAME-DNS-RR] + Finch, T., Hunt, E., van Dijk, P., Eden, A., and W. + Mekking, "Address-specific DNS aliases (ANAME)", Work in + Progress, Internet-Draft, draft-ietf-dnsop-aname-04, 8 + July 2019, <https://datatracker.ietf.org/doc/html/draft- + ietf-dnsop-aname-04>. + + [BIND-CHECK-NAMES] + Internet Systems Consortium, "BIND v9.19.11 Configuration + Reference: "check-names"", September 2023, + <https://bind9.readthedocs.io/en/v9.19.11/ + reference.html#namedconf-statement-check-names>. + + [DNAME] Rose, S. and W. Wijngaards, "DNAME Redirection in the + DNS", RFC 6672, DOI 10.17487/RFC6672, June 2012, + <https://www.rfc-editor.org/info/rfc6672>. + + [DNSTerm] Hoffman, P., Sullivan, A., and K. Fujiwara, "DNS + Terminology", BCP 219, RFC 8499, DOI 10.17487/RFC8499, + January 2019, <https://www.rfc-editor.org/info/rfc8499>. + + [ECH] Rescorla, E., Oku, K., Sullivan, N., and C. A. Wood, "TLS + Encrypted Client Hello", Work in Progress, Internet-Draft, + draft-ietf-tls-esni-17, 9 October 2023, + <https://datatracker.ietf.org/doc/html/draft-ietf-tls- + esni-17>. + + [FETCH] WHATWG, "Fetch Living Standard", October 2023, + <https://fetch.spec.whatwg.org/>. + + [FETCH-WEBSOCKETS] + WHATWG, "WebSockets Living Standard", September 2023, + <https://websockets.spec.whatwg.org/>. + + [HSTS] Hodges, J., Jackson, C., and A. Barth, "HTTP Strict + Transport Security (HSTS)", RFC 6797, + DOI 10.17487/RFC6797, November 2012, + <https://www.rfc-editor.org/info/rfc6797>. + + [HTTP-DNS-RR] + Bellis, R., "A DNS Resource Record for HTTP", Work in + Progress, Internet-Draft, draft-bellis-dnsop-http-record- + 00, 3 November 2018, + <https://datatracker.ietf.org/doc/html/draft-bellis-dnsop- + http-record-00>. + + [HTTP/3] Bishop, M., Ed., "HTTP/3", RFC 9114, DOI 10.17487/RFC9114, + June 2022, <https://www.rfc-editor.org/info/rfc9114>. + + [RFC1912] Barr, D., "Common DNS Operational and Configuration + Errors", RFC 1912, DOI 10.17487/RFC1912, February 1996, + <https://www.rfc-editor.org/info/rfc1912>. + + [RFC6454] Barth, A., "The Web Origin Concept", RFC 6454, + DOI 10.17487/RFC6454, December 2011, + <https://www.rfc-editor.org/info/rfc6454>. + + [SRV] Gulbrandsen, A., Vixie, P., and L. Esibov, "A DNS RR for + specifying the location of services (DNS SRV)", RFC 2782, + DOI 10.17487/RFC2782, February 2000, + <https://www.rfc-editor.org/info/rfc2782>. + + [URI] Berners-Lee, T., Fielding, R., and L. Masinter, "Uniform + Resource Identifier (URI): Generic Syntax", STD 66, + RFC 3986, DOI 10.17487/RFC3986, January 2005, + <https://www.rfc-editor.org/info/rfc3986>. + +Appendix A. Decoding Text in Zone Files + + DNS zone files are capable of representing arbitrary octet sequences + in basic ASCII text, using various delimiters and encodings, + according to an algorithm defined in Section 5.1 of [RFC1035]. The + following summarizes some allowed inputs to that algorithm, using + ABNF: + + ; non-special is VCHAR minus DQUOTE, ";", "(", ")", and "\". + non-special = %x21 / %x23-27 / %x2A-3A / %x3C-5B / %x5D-7E + ; non-digit is VCHAR minus DIGIT. + non-digit = %x21-2F / %x3A-7E + ; dec-octet is a number 0-255 as a three-digit decimal number. + dec-octet = ( "0" / "1" ) 2DIGIT / + "2" ( ( %x30-34 DIGIT ) / ( "5" %x30-35 ) ) + escaped = "\" ( non-digit / dec-octet ) + contiguous = 1*( non-special / escaped ) + quoted = DQUOTE *( contiguous / ( ["\"] WSP ) ) DQUOTE + char-string = contiguous / quoted + + The decoding algorithm allows char-string to represent any *OCTET, + using quoting to group values (e.g., those with internal whitespace), + and escaping to represent each non-printable octet as a single + escaped sequence. In this document, this algorithm is referred to as + "character-string decoding", because Section 5.1 of [RFC1035] uses + this algorithm to produce a <character-string>. Note that while the + length of a <character-string> is limited to 255 octets, the + character-string decoding algorithm can produce output of any length. + +A.1. Decoding a Comma-Separated List + + In order to represent lists of items in zone files, this + specification uses comma-separated lists. When the allowed items in + the list cannot contain "," or "\", this is trivial. (For + simplicity, empty items are not allowed.) A value-list parser that + splits on "," and prohibits items containing "\" is sufficient to + comply with all requirements in this document. This corresponds to + the simple-comma-separated syntax: + + ; item-allowed is OCTET minus "," and "\". + item-allowed = %x00-2B / %x2D-5B / %x5D-FF + simple-item = 1*item-allowed + simple-comma-separated = [simple-item *("," simple-item)] + + For implementations that allow "," and "\" in item values, the + following escaping syntax applies: + + item = 1*OCTET + escaped-item = 1*(item-allowed / "\," / "\\") + comma-separated = [escaped-item *("," escaped-item)] + + Decoding of value-lists happens after character-string decoding. For + example, consider these char-string SvcParamValues: + + "part1,part2,part3\\,part4\\\\" + part1\,\p\a\r\t2\044part3\092,part4\092\\ + + These inputs are equivalent: character-string decoding either of them + would produce the same value: + + part1,part2,part3\,part4\\ + + Applying comma-separated list decoding to this value would produce a + list of three items: + + part1 + part2 + part3,part4\ + +Appendix B. HTTP Mapping Summary + + This table serves as a non-normative summary of the HTTP mapping for + SVCB (Section 9). Future protocol mappings may provide a similar + summary table. + + +--------------------------+----------------------+ + | *Mapped scheme* | "https" | + +--------------------------+----------------------+ + | *Other affected schemes* | "http", "wss", "ws", | + | | (other HTTP-based) | + +--------------------------+----------------------+ + | *RR type* | HTTPS (65) | + +--------------------------+----------------------+ + | *Name prefix* | None for port 443, | + | | else _$PORT._https | + +--------------------------+----------------------+ + | *Automatically mandatory | port, no-default- | + | keys* | alpn | + +--------------------------+----------------------+ + | *SvcParam defaults* | alpn: ["http/1.1"] | + +--------------------------+----------------------+ + | *Special behaviors* | Upgrade from HTTP to | + | | HTTPS | + +--------------------------+----------------------+ + | *Keys that records must | None | + | include* | | + +--------------------------+----------------------+ + + Table 3 + +Appendix C. Comparison with Alternatives + + The SVCB and HTTPS RR types closely resemble, and are inspired by, + some existing record types and proposals. One complaint regarding + all of the alternatives is that web clients have seemed + unenthusiastic about implementing them. The hope here is that an + extensible solution that solves multiple problems will overcome this + inertia and have a path to achieve client implementation. + +C.1. Differences from the SRV RR Type + + An SRV record [SRV] can perform a function similar to that of the + SVCB record, informing a client to look in a different location for a + service. However, there are several differences: + + * SRV records are typically mandatory, whereas SVCB is intended to + be optional when used with pre-existing protocols. + + * SRV records cannot instruct the client to switch or upgrade + protocols, whereas SVCB can signal such an upgrade (e.g., to + HTTP/2). + + * SRV records are not extensible, whereas SVCB and HTTPS RRs can be + extended with new parameters. + + * SRV records specify a "weight" for unbalanced randomized load + balancing. SVCB only supports balanced randomized load balancing, + although weights could be added via a future SvcParam. + +C.2. Differences from the Proposed HTTP Record + + Unlike [HTTP-DNS-RR], this approach is extensible to cover Alt-Svc + and Encrypted ClientHello use cases. Like that proposal, this + addresses the zone-apex CNAME challenge. + + Like that proposal, it remains necessary to continue to include + address records at the zone apex for legacy clients. + +C.3. Differences from the Proposed ANAME Record + + Unlike [ANAME-DNS-RR], this approach is extensible to cover Alt-Svc + and Encrypted ClientHello use cases. This approach also does not + require any changes or special handling on either authoritative or + primary servers, beyond optionally returning in-bailiwick additional + records. + + Like that proposal, this addresses the zone-apex CNAME challenge for + clients that implement this. + + However, with this SVCB proposal, it remains necessary to continue to + include address records at the zone apex for legacy clients. If + deployment of this standard is successful, the number of legacy + clients will fall over time. As the number of legacy clients + declines, the operational effort required to serve these users + without the benefit of SVCB indirection should fall. Server + operators can easily observe how much traffic reaches this legacy + endpoint and may remove the apex's address records if the observed + legacy traffic has fallen to negligible levels. + +C.4. Comparison with Separate RR Types for AliasMode and ServiceMode + + Abstractly, functions of AliasMode and ServiceMode are independent, + so it might be tempting to specify them as separate RR types. + However, this would result in serious performance impairment, because + clients cannot rely on their recursive resolver to follow SVCB + aliases (unlike CNAME). Thus, clients would have to issue queries + for both RR types in parallel, potentially at each step of the alias + chain. Recursive resolvers that implement the specification would, + upon receipt of a ServiceMode query, emit both a ServiceMode query + and an AliasMode query to the authoritative DNS server. Thus, + splitting the RR type would double, or in some cases triple, the load + on clients and servers, and would not reduce implementation + complexity. + +Appendix D. Test Vectors + + These test vectors only contain the RDATA portion of SVCB/HTTPS + records in presentation format, generic format [RFC3597], and wire + format. The wire format uses hexadecimal (\xNN) for each non-ASCII + byte. As the wire format is long, it is broken into several lines. + +D.1. AliasMode + + example.com. HTTPS 0 foo.example.com. + + \# 19 ( + 00 00 ; priority + 03 66 6f 6f 07 65 78 61 6d 70 6c 65 03 63 6f 6d 00 ; target + ) + + \x00\x00 # priority + \x03foo\x07example\x03com\x00 # target + + Figure 2: AliasMode + +D.2. ServiceMode + + example.com. SVCB 1 . + + \# 3 ( + 00 01 ; priority + 00 ; target (root label) + ) + + \x00\x01 # priority + \x00 # target (root label) + + Figure 3: TargetName Is "." + + example.com. SVCB 16 foo.example.com. port=53 + + \# 25 ( + 00 10 ; priority + 03 66 6f 6f 07 65 78 61 6d 70 6c 65 03 63 6f 6d 00 ; target + 00 03 ; key 3 + 00 02 ; length 2 + 00 35 ; value + ) + + \x00\x10 # priority + \x03foo\x07example\x03com\x00 # target + \x00\x03 # key 3 + \x00\x02 # length 2 + \x00\x35 # value + + Figure 4: Specifies a Port + + example.com. SVCB 1 foo.example.com. key667=hello + + \# 28 ( + 00 01 ; priority + 03 66 6f 6f 07 65 78 61 6d 70 6c 65 03 63 6f 6d 00 ; target + 02 9b ; key 667 + 00 05 ; length 5 + 68 65 6c 6c 6f ; value + ) + + \x00\x01 # priority + \x03foo\x07example\x03com\x00 # target + \x02\x9b # key 667 + \x00\x05 # length 5 + hello # value + + Figure 5: A Generic Key and Unquoted Value + + example.com. SVCB 1 foo.example.com. key667="hello\210qoo" + + \# 32 ( + 00 01 ; priority + 03 66 6f 6f 07 65 78 61 6d 70 6c 65 03 63 6f 6d 00 ; target + 02 9b ; key 667 + 00 09 ; length 9 + 68 65 6c 6c 6f d2 71 6f 6f ; value + ) + + \x00\x01 # priority + \x03foo\x07example\x03com\x00 # target + \x02\x9b # key 667 + \x00\x09 # length 9 + hello\xd2qoo # value + + Figure 6: A Generic Key and Quoted Value with a Decimal Escape + + example.com. SVCB 1 foo.example.com. ( + ipv6hint="2001:db8::1,2001:db8::53:1" + ) + + \# 55 ( + 00 01 ; priority + 03 66 6f 6f 07 65 78 61 6d 70 6c 65 03 63 6f 6d 00 ; target + 00 06 ; key 6 + 00 20 ; length 32 + 20 01 0d b8 00 00 00 00 00 00 00 00 00 00 00 01 ; first address + 20 01 0d b8 00 00 00 00 00 00 00 00 00 53 00 01 ; second address + ) + + \x00\x01 # priority + \x03foo\x07example\x03com\x00 # target + \x00\x06 # key 6 + \x00\x20 # length 32 + \x20\x01\x0d\xb8\x00\x00\x00\x00 + \x00\x00\x00\x00\x00\x00\x00\x01 # first address + \x20\x01\x0d\xb8\x00\x00\x00\x00 + \x00\x00\x00\x00\x00\x53\x00\x01 # second address + + Figure 7: Two Quoted IPv6 Hints + + example.com. SVCB 1 example.com. ( + ipv6hint="2001:db8:122:344::192.0.2.33" + ) + \# 35 ( + 00 01 ; priority + 07 65 78 61 6d 70 6c 65 03 63 6f 6d 00 ; target + 00 06 ; key 6 + 00 10 ; length 16 + 20 01 0d b8 01 22 03 44 00 00 00 00 c0 00 02 21 ; address + ) + + \x00\x01 # priority + \x07example\x03com\x00 # target + \x00\x06 # key 6 + \x00\x10 # length 16 + \x20\x01\x0d\xb8\x01\x22\x03\x44 + \x00\x00\x00\x00\xc0\x00\x02\x21 # address + + Figure 8: An IPv6 Hint Using the Embedded IPv4 Syntax + + example.com. SVCB 16 foo.example.org. ( + alpn=h2,h3-19 mandatory=ipv4hint,alpn + ipv4hint=192.0.2.1 + ) + + \# 48 ( + 00 10 ; priority + 03 66 6f 6f 07 65 78 61 6d 70 6c 65 03 6f 72 67 00 ; target + 00 00 ; key 0 + 00 04 ; param length 4 + 00 01 ; value: key 1 + 00 04 ; value: key 4 + 00 01 ; key 1 + 00 09 ; param length 9 + 02 ; alpn length 2 + 68 32 ; alpn value + 05 ; alpn length 5 + 68 33 2d 31 39 ; alpn value + 00 04 ; key 4 + 00 04 ; param length 4 + c0 00 02 01 ; param value + ) + + \x00\x10 # priority + \x03foo\x07example\x03org\x00 # target + \x00\x00 # key 0 + \x00\x04 # param length 4 + \x00\x01 # value: key 1 + \x00\x04 # value: key 4 + \x00\x01 # key 1 + \x00\x09 # param length 9 + \x02 # alpn length 2 + h2 # alpn value + \x05 # alpn length 5 + h3-19 # alpn value + \x00\x04 # key 4 + \x00\x04 # param length 4 + \xc0\x00\x02\x01 # param value + + Figure 9: SvcParamKey Ordering Is Arbitrary in Presentation + Format but Sorted in Wire Format + + example.com. SVCB 16 foo.example.org. alpn="f\\\\oo\\,bar,h2" + example.com. SVCB 16 foo.example.org. alpn=f\\\092oo\092,bar,h2 + + \# 35 ( + 00 10 ; priority + 03 66 6f 6f 07 65 78 61 6d 70 6c 65 03 6f 72 67 00 ; target + 00 01 ; key 1 + 00 0c ; param length 12 + 08 ; alpn length 8 + 66 5c 6f 6f 2c 62 61 72 ; alpn value + 02 ; alpn length 2 + 68 32 ; alpn value + ) + + \x00\x10 # priority + \x03foo\x07example\x03org\x00 # target + \x00\x01 # key 1 + \x00\x0c # param length 12 + \x08 # alpn length 8 + f\oo,bar # alpn value + \x02 # alpn length 2 + h2 # alpn value + + Figure 10: An "alpn" Value with an Escaped Comma and an Escaped + Backslash in Two Presentation Formats + +D.3. Failure Cases + + This subsection contains test vectors that are not compliant with + this document. The various reasons for non-compliance are explained + with each example. + + example.com. SVCB 1 foo.example.com. ( + key123=abc key123=def + ) + + Figure 11: Multiple Instances of the Same SvcParamKey + + example.com. SVCB 1 foo.example.com. mandatory + example.com. SVCB 1 foo.example.com. alpn + example.com. SVCB 1 foo.example.com. port + example.com. SVCB 1 foo.example.com. ipv4hint + example.com. SVCB 1 foo.example.com. ipv6hint + + Figure 12: Missing SvcParamValues That Must Be Non-Empty + + example.com. SVCB 1 foo.example.com. no-default-alpn=abc + + Figure 13: The "no-default-alpn" SvcParamKey Value Must Be Empty + + example.com. SVCB 1 foo.example.com. mandatory=key123 + + Figure 14: A Mandatory SvcParam Is Missing + + example.com. SVCB 1 foo.example.com. mandatory=mandatory + + Figure 15: The "mandatory" SvcParamKey Must Not Be Included in + the Mandatory List + + example.com. SVCB 1 foo.example.com. ( + mandatory=key123,key123 key123=abc + ) + + Figure 16: Multiple Instances of the Same SvcParamKey in the + Mandatory List + +Acknowledgments and Related Proposals + + Over the years, IETF participants have proposed a wide range of + solutions to the "CNAME at the zone apex" challenge, including + [HTTP-DNS-RR], [ANAME-DNS-RR], and others. The authors are grateful + for their work to elucidate the problem and identify promising + strategies to address it, some of which are reflected in this + document. + + Thank you to Ian Swett, Ralf Weber, Jon Reed, Martin Thomson, Lucas + Pardue, Ilari Liusvaara, Tim Wicinski, Tommy Pauly, Chris Wood, David + Benjamin, Mark Andrews, Emily Stark, Eric Orth, Kyle Rose, Craig + Taylor, Dan McArdle, Brian Dickson, Willem Toorop, Pieter Lexis, + Puneet Sood, Olivier Poitrey, Mashooq Muhaimen, Tom Carpay, and many + others for their feedback and suggestions on this document. + +Authors' Addresses + + Ben Schwartz + Meta Platforms, Inc. + Email: ietf@bemasc.net + + + Mike Bishop + Akamai Technologies + Email: mbishop@evequefou.be + + + Erik Nygren + Akamai Technologies + Email: erik+ietf@nygren.org |