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