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

<!DOCTYPE rfc>

<?xml-stylesheet type='text/xsl' href='rfc2629.xslt' ?>
<!-- used by XSLT processors -->
<!-- For a complete list and description of processing instructions (PIs),
     please see http://xml.resource.org/authoring/README.html. -->
<!-- Below are generally applicable Processing Instructions (PIs) that most I-Ds might want to use.
     (Here they are set differently than their defaults in xml2rfc v1.32) -->
<?rfc strict="yes" ?>
<!-- give errors regarding ID-nits and DTD validation -->
<!-- control the table of contents (ToC) -->
<?rfc toc="yes"?>
<!-- generate a ToC -->
<?rfc tocdepth="4"?>
<!-- the number of levels of subsections in ToC. default: 3 -->
<!-- control references -->
<?rfc symrefs="yes"?>
<!-- use symbolic references tags, i.e, [RFC2119] instead of [1] -->
<?rfc sortrefs="yes" ?>
<!-- sort the reference entries alphabetically -->
<!-- control vertical white space
     (using these PIs as follows is recommended by the RFC Editor) -->
<?rfc compact="yes" ?>
<!-- do not start each main section on a new page -->
<?rfc subcompact="no" ?>
<!-- keep one blank line between list items -->
<!-- end of list of popular I-D processing instructions -->

<rfc xmlns:xi="http://www.w3.org/2001/XInclude"
        category="std" consensus="true"
        docName="draft-ietf-dance-client-auth-10"
        ipr="trust200902" updates="6698,7671" obsoletes=""
        submissionType="IETF" xml:lang="en"
        tocInclude="true" tocDepth="4"
        symRefs="true" sortRefs="true" version="3">

  <!-- ***** FRONT MATTER ***** -->

  <front>

    <title abbrev="TLSA client authentication">TLS Client Authentication via DANE TLSA records</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-dance-client-auth-10"/>
    <author fullname="Shumon Huque" initials="S." surname="Huque">
      <organization>Salesforce</organization>
      <address>
        <email>shuque@gmail.com</email>
        <!-- uri and facsimile elements may also be added -->
      </address>
    </author>
    <author fullname="Viktor Dukhovni" initials="V." surname="Dukhovni">
      <organization>OpenSSL Corporation</organization>
      <address>
        <email>ietf-dane@dukhovni.org</email>
        <!-- uri and facsimile elements may also be added -->
      </address>
    </author>

    <date day="2" month="3" year="2026"/>
    <!-- Meta-data Declarations -->

    <area>General</area>
    <workgroup>Internet Engineering Task Force</workgroup>
    <keyword>Internet-Draft</keyword>
    <keyword>DANE</keyword>
    <keyword>DNSSEC</keyword>
    <keyword>Authentication</keyword>
    <keyword>Client Certificate</keyword>
    <keyword>X.509 Certificate</keyword>
    <keyword>Raw Public Key</keyword>

    <abstract>
      <t>The DANE TLSA protocol
      describes how to publish Transport Layer Security (TLS) server
      certificates or public keys in the DNS. This document updates RFC
      6698 and RFC 7671.
      It describes how to use the TLSA record to publish
      client certificates or public keys, and also the rules and
      considerations for using them with TLS. In addition, it defines
      a new TLS extension, DANE CLient Identity, to convey the client's
      domain name identity to the server.
      </t>
    </abstract>

  </front>

  <middle>

    <section numbered="true" toc="default">
      <name>Introduction and Motivation</name>
      <t>
	The Transport Layer Security (TLS)
        <xref target="RFC8446" format="default"/> and DTLS
        <xref target="RFC9147" format="default"/> protocols optionally support the authentication of
        clients using <xref target="RFC5280" format="default">X.509 certificates</xref> or
	<xref target="RFC7250" format="default">raw public keys</xref>. TLS applications
	that perform DANE <xref target="RFC6698"/> <xref target="RFC7671"/>
        authentication of servers using TLSA records
	may also desire to authenticate clients using the same mechanism,
	especially if the client identity is in the form of or can be
	represented by a DNS domain name. Some design patterns from the
	Internet of Things (IoT) plan to make use of this form of
        authentication, where large networks of physical objects identified
        by DNS names may authenticate themselves using TLS to centralized
        device management and control platforms. Other potential applications
        include authenticating the client side of SMTP transport security.
      </t>
      <t>
	In this document, the term TLS is used generically to describe
	both the TLS and
	<xref target="RFC6347" format="default">DTLS (Datagram Transport Layer Security)
        </xref> protocols. The protocol changes described can also be used
        with QUIC since QUIC re-uses the TLS handshake.
      </t>
      <section anchor="reserved-words"><name>Requirements Language</name>
      <t>The key words &quot;MUST&quot;, &quot;MUST NOT&quot;, &quot;REQUIRED&quot;, &quot;SHALL&quot;, &quot;SHALL NOT&quot;,
   &quot;SHOULD&quot;, &quot;SHOULD NOT&quot;, &quot;RECOMMENDED&quot;, &quot;NOT RECOMMENDED&quot;, &quot;MAY&quot;,
   and &quot;OPTIONAL&quot; in this document are to be interpreted as described
   in BCP 14 <xref target="RFC2119"></xref> <xref target="RFC8174"></xref> when, and only when, they
   appear in all capitals, as shown here.</t>
      </section>
    </section>

    <section anchor="owner_format" numbered="true" toc="default">
      <name>Associating Client Identities in DNS TLSA Records</name>
      <t>
        Different applications may have quite different conventions
        for naming clients via domain names. This document thus does not
        proscribe a single format, but mentions a few that may have
        wide applicability.
      </t>

      <section anchor="owner_format1" numbered="true" toc="default">
        <name>Format 1: Service specific client identity</name>

        <t>
          In this format, the owner name of the client TLSA record
          has the following structure:
        </t>
        <artwork name="" type="" align="left" alt=""><![CDATA[

[_service].[client-domain-name]
        ]]></artwork>
        <t>
          The first label identifies the application service name. The
	  remaining labels are composed of the client domain name.
        </t>
        <t>
	  Encoding the application service name into the owner name allows
	  the same client domain name to have different authentication
	  credentials for different application services. There is no need
	  to encode the transport label - the same name form is usable with
	  both TLS and DTLS.
        </t>
        <t>
	  The _service label could be a custom string for an application,
	  but more commonly is expected to be a service name registered in
	  the <xref target="SRVREG" format="default">IANA Service Name Registry</xref>.
        </t>
        <t>
	  The RDATA or data field portion of the TLSA record is formed
	  exactly as specified in <xref target="RFC6698"/> and
        <xref target="RFC7671" format="default"/>, and carries the
	  same meaning.
        </t>
      </section>

      <section anchor="owner_format2" numbered="true" toc="default">
        <name>Format 2: IOT Device Identity</name>
        <t>
          The Device Identity form of the TLSA record has the following structure:
        </t>
        <artwork name="" type="" align="left" alt=""><![CDATA[

[devicename]._device.[org-domain-name]
        ]]></artwork>
        <t>
          The "_device" label interposed between the client device name
          labels and the organization domain labels allows management of
          all client identities to be delegated to a subzone or to another
          party.
        </t>
      </section>
    </section>

    <section numbered="true" toc="default">
      <name>Example TLSA records for clients</name>
      <t>
	The following examples are provided in the textual presentation
	format of the DNS TLSA record.
      </t>

      <section numbered="true" toc="default">
        <name>Format 1: Service Specific Client Identity</name>
        <t>
	  An example TLSA record for the client "device1.example.com." and
	  the application "smtp-client". This record specifies the SHA-256 hash
	  of the subject public key component of the end-entity certificate
	  corresponding to the client. The certificate usage for this record
	  is 3 (DANE-EE) and thus is validated in accordance with section
	  5.1 of RFC 7671.
        </t>
        <artwork name="" type="" align="left" alt=""><![CDATA[

_smtp-client.device1.example.com. IN TLSA (
   3 1 1 d2abde240d7cd3ee6b4b28c54df034b9
         7983a1d16e8a410e4561cb106618e971 )
  	]]></artwork>
      </section>

      <section numbered="true" toc="default">
        <name>Format 2: DevID</name>
        <t>
	  An example TLSA record for the device named "sensor7" managed
          by the organization "example.com" This record specifies the
          SHA-512 hash of the subject public key component of an EE
          certificate corresponding to the client.
        </t>
        <artwork name="" type="" align="left" alt=""><![CDATA[

sensor7._device.example.com. IN TLSA (
   3 1 2 0f8b48ff5fd94117f21b6550aaee89c8
         d8adbc3f433c8e587a85a14e54667b25
         f4dcd8c4ae6162121ea9166984831b57
         b408534451fd1b9702f8de0532ecd03c )
  	]]></artwork>
        <t>
	  The example below shows a wildcard TLSA record mapped to a
          TLSA record with a DANE-TA usage mode. This allows all client
          identifiers matching the wildcard to be authenticated by client
          certificates issued by an organization managed Certification
          Authority.
        </t>
        <artwork name="" type="" align="left" alt=""><![CDATA[

*._device.example.com. IN TLSA (
   2 0 1 20efa254ecd5b646e701211095bc3fe4
         423e21941b0b29efb21da57ec944a9b5 )
  	]]></artwork>
      </section>
    </section>

    <section anchor="auth_model" numbered="true" toc="default">
      <name>Authentication Model</name>
      <t>
	The authentication model assumed in this document is the following:
      </t>
      <t>
	The client is assigned an identity corresponding to a DNS
	domain name.
      </t>
      <t>
	The client has a private and public key pair. Where client
        certificates are being used, the client also has a certificate
        binding the name to its public key.
	The certificate or public key has a corresponding TLSA record
	published in the DNS, which allows it to be authenticated
	directly via the DNS (using the DANE-TA or DANE-EE certificate
	usage modes) or via a PKIX public CA system constraint if the
        client's certificate was issued by a public CA (using  the PKIX-TA
        or PKIX-EE DANE usage modes).
      </t>
    </section>

    <section anchor="cert_id" numbered="true" toc="default">
      <name>Client Identifiers in X.509 certificates</name>
      <t>
	If the TLS DANE Client Identity extension
	(see <xref target="client_signal" format="default"/>) is not being used, the
	client certificate MUST have the client's DNS name
	specified in the Subject Alternative Name extension's dNSName
	type, and only one instance of the dNSName type is permitted.
      </t>
      <t>
	If the client uses a non-empty TLS DANE Client Identity extension,
        then with DANE-EE(3), the subject name need not be present in the
        certificate.
      </t>
    </section>

    <section anchor="client_signal" numbered="true" toc="default">
      <name>Signaling the Client's DANE Identity in TLS</name>
      <t>
	The client MUST explicitly signal that it has a DANE identity.
        The most important reason is that the server needs an explicit
        indication from the client that it has a DANE record, so as to
        avoid unnecessary DNS queries in-band with the TLS handshake.
      </t>
      <t>
        The DANE Client Identity TLS
        extension is used for this purpose. This extension can also
        be used to convey the actual DANE client identity (i.e. domain name)
        that the TLS server should attempt to authenticate. This is required
        when using TLS raw public key authentication, since there is no
        client certificate from which to extract the client's DNS identity.
        It is also required when the client certificate contains multiple
        identities, and only a specific one has a DANE record.
      </t>
    </section>

    <section numbered="true" toc="default">
      <name>TLS DANE Client Identity Extension</name>
      <t>
        The DANE Client Identity Extension type, "dane_clientid",
        will have a value assigned and registered in the IANA
        TLS Extensions registry. Its extension data (if not has the
        following format:
      </t>
      <artwork name="" type="" align="left" alt=""><![CDATA[

opaque ClientName<0..2^8-1>;
        ]]></artwork>
      <t>
        The ClientName field contains the single domain name of
        the client in textual presentation format, as described in
        <xref target="RFC1035" format="default">RFC 1035</xref>,
        omitting the trailing dot. The lower bound length value of 0
        octets indicates that no client name is present.
      </t>
      <t>
        The wire format of a domain name is limited to 255 octets.
        In keeping with the practice of most TLS extensions, this
        extension specifies the use of the textual presentation
        format of domain names instead. In theory, the presentation
        format can exceed 255 characters because it allows the
        expression of any arbitrary octet with the "\DDD" sequence
        of characters (where DDD is the decimal value). Applications
        using this extension (and the DANE TLSA Client Authentication
        protocol more generally) should ensure that client domain names
        being used do not need to resort to the \DDD syntax by limiting
        the alphabet suitably, such as only allowing letters, digits,
        hyphens, and underscores. This ensures that the presentation
        format client domain name will comfortably fit within the 255
        octet limit.
      </t>
      <t>
        A TLS server implementing this specification MUST send
        an empty extension of type "dane_clientid" in its
        CertificateRequest message, to indicate that
        it understands the extension and is capable of performing
        DANE client authentication.
      </t>
      <t>
        A TLS client implementing this specification and intending to
        use DANE client authentication the TLS server, MUST send
        an extension of type "dane_clientid" in its Certificate message.
        Per the TLS protocol, the client is only permitted to send the
        extension if it sees the corresponding empty extension in the
        server's CertificateRequest message. If the client only needs
        to indicate that it has a DANE record and that the client's
        domain name identity can be obtained unambiguously from its
        certificate, then the extension sent can be empty. If the client
        needs to send its domain name identity, then the "extension_data"
        field of the extension MUST contain a "ClientName" data structure
        populated with the domain name.
      </t>
    </section>

    <section anchor="changes" numbered="true" toc="default">
      <name>Changes to Client and Server behavior</name>
      <t>
	A TLS Client conforming to this specification MUST
	have a <xref target="RFC9364">DNSSEC</xref> signed TLSA record
        published corresponding to its DNS name and X.509 certificate or
        public key. The client
	presents this certificate or public key in the TLS handshake
	with the server.
      </t>
      <t>
        A TLS Server implementing this specification performs the
	following steps:

      </t>
      <ol spacing="normal">
        <li>Request a client certificate in the TLS handshake's
	  "Certificate Request" message, that includes an empty DANE
          Client Identity extension.</li>
        <li>The TLS client supplies its certificate in its Certificate
          message, and if implementing this protocol, also
          includes the DANE Client Identity extension in the Certificate
          message.</li>
        <li>If the client has sent a non-empty DANE Client Identity
          extension in its Certificate message, then extract the client's
          domain name from the extension. Otherwise, extract the client
          identity from the Subject Alternative Name extension's dNSName
          type.</li>
        <li>Construct the DNS query name for the corresponding TLSA
	  record. If the TLS DANE client identity extension was present,
	  then this name should be used. Otherwise, the single identity
          from the client certificate is used.</li>
        <li>Look up the TLSA record set in the DNS. The response MUST be
	  cryptographically validated using DNSSEC. The server could
	  perform DNSSEC validation itself, authenticating the full
          chain back to a configured trust anchor (normally the DNS root).
          Alternatively, it could also be configured to trust responses
          obtained via a validating resolver to which it has a secure
          connection, by requiring the Authenticated Data (AD) bit to
          be set in the responses. If DNSSEC validation fails, the server
          MUST either abort the connection with a handshake_failure TLS
          alert, or treat the client as unauthenticated. The option of
          treating the client as unauthenticated should typically be a
          configurable option designed to support the case where client
          authentication for the application in question is optional.
        </li>
        <li>Extract the RDATA of the TLSA records and match them to the
	  presented client certificate according to the rules specified
	  in the DANE TLS protocol <xref target="RFC6698" format="default"/>
          <xref target="RFC7671" format="default"/>.
	  If successfully matched, the client is authenticated and
	  the TLS session proceeds. If unsuccessful, the server MUST
	  again either terminate the session with a handshake_failure
          TLS alert, or if configured to do so, treat the client as
          unauthenticated and proceed with the session.</li>
        <li>If there are multiple records in the TLSA record set,
	  then the client is authenticated as long as at least one of
	  the TLSA records matches, subject to RFC7671 digest agility,
	  which SHOULD be implemented.</li>
      </ol>
      <t>
	If the DANE Client Identity extension is empty, and the
	presented client certificate has multiple distinct reference
	identifier types (e.g. a dNSName, and an rfc822Name) then
	TLS servers configured to perform DANE authentication according
	to this specification should only examine and authenticate the
	dNSName, and only one such dNSName identity should be present
        in the certificate, otherwise the server MUST abort the
        connection with a bad_certificate TLS alert.
      </t>
      <t>
	If the presented client certificate has multiple dNSName
	identities, then the client MUST use a non-empty TLS DANE client
        identity extension to unambiguously indicate one of these
        identities as its client name to the server. If the name in
        the TLS DANE client identity extension does not match one of
        the dNSNames in the certificate, then the server MUST
        abort the connection with a bad_certificate TLS alert.
      </t>
      <t>
	Servers may have their own whitelisting and authorization rules
	for which certificates they accept. For example a TLS server may
	be configured to only allow TLS sessions from clients with
	certificate identities within a specific domain or set of domains.
        If such rules are not met, the TLS server again could terminate
        the connection with a handshake_failure TLS alert.
      </t>
    </section>

    <section anchor="raw_keys" numbered="true" toc="default">
      <name>Raw Public Keys</name>
      <t>
	When using <xref target="RFC7250" format="default">raw public keys in TLS</xref>,
	this specification requires the use of a non-empty TLS DANE Client
	Identity extension. The associated DANE TLSA records employ only
	certificate usage 3 (DANE-EE) and a selector value of 1 (SPKI),
	as described in <xref target="RFC7671" format="default"/>.
      </t>
    </section>
    <section anchor="Acknowledgements" numbered="true" toc="default">
      <name>Acknowledgements</name>
      <t>
        The authors thank the many members of the IETF DANCE and TLS working
        groups for helpful comments and input.
      </t>
    </section>

    <section anchor="Security" numbered="true" toc="default">
      <name>Security Considerations</name>
      <t>
	This document updates RFC 6698 by defining the use of the TLSA
        record for clients. Placing client identities in the DNS may pose
        privacy issues for certain applications, depending on the nature
        of the clients, and the structure and content of the client names.
        Applications employing this protocol should carefully assess those
        potential issues.
      </t>
      <t>
        A design goal of TLS 1.3 is that the client identity is encrypted
        in the Certificate message, and thus protected from disclosure
        on the wire. DANE authentication however relies on the peer (the
        TLS server in this case) looking up the client's DANE record
        in the DNS. Although, protocol specifications and implementions
        to encrypt DNS transport exist, they are very far from ubiquitously
        deployed.  Deployers of DANCE client authentication should thus
        evaluate the risks of the client name being leaked in this manner,
        until encrypted DNS transport becomes the norm.
      </t>
      <t>
        One possible way to address this is for the client to construct
        and send its DANE record and the corresponding full DNSSEC
        authentication chain to the TLS server in a new Certificate
        extension within the handshake. A specification to do this in
        the other direction (from the server to the client) already
        exists: <xref target="RFC9102" format="default">"TLS DNSSEC Chain Extension"</xref>.
        However, there are several challenges when considering such an
        approach from the client end. It is quite a heavy
        weight operation that some constrained clients may have challenges
        with. In order to construct the DANE authentication chain, the
        client would need to perform DNS queries which would still
        leak its identity to the local network environment without
        encrypted DNS. Lastly, there maybe client side network impediments to
        making this work, e.g. middleboxes that prevent DNSSEC enabled
        queries from succeeding - one of the original motivations for
        RFC 9102 in the first place. Nevertheless, if appetite to implement
        this mechanism exists, a future version of this specification could
        define the details.
      </t>
      <t>
        The service specific client identity form lends itself to a
        structure that might make it easy for the same client to have
        multiple identities corresponding to different applications using
        the same public key (e.g. by using wildcards and DANE-EE mode),
        which could make this protocol susceptible to corss protocol
        attacks where traffic is redirected from one service to another.
        Deployers of this protocol should avoid this by not sharing per
        client credentials across distinct applications.
      </t>
    </section>

    <section anchor="IANA" numbered="true" toc="default">
      <name>IANA Considerations</name>
      <t>
        IANA is requested to create the following entry in the "TLS ExtensionTypes Values" registry:
      </t>
      <t>
        Extension Name "dane_clientid" with value TBD, "TLS 1.3" column values set to "CR, CT", "DTLS-Only" column set to "N", and "Recommended" column set to "N".
      </t>
      <t>
        The 'N' designation in the "Recommended" column is because this
        extension has very specific use cases.
      </t>
    </section>

  </middle>

  <!--  *****BACK MATTER ***** -->

  <back>
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
        <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.1035.xml"/>
        <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml"/>
        <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.5280.xml"/>
        <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.6347.xml"/>
        <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.6698.xml"/>
        <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.7250.xml"/>
        <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.7671.xml"/>
        <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml"/>
        <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.8446.xml"/>
        <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.9147.xml"/>
        <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.9364.xml"/>
      </references>
      <references>
        <name>Informative References</name>
        <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.9102.xml"/>
        <reference anchor="SRVREG" target="https://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.txt">
          <front>
            <title>Service Name and Transport Protocol Port Number Registry</title>
            <author fullname="IANA" surname="IANA"/>
          </front>
        </reference>
      </references>
    </references>

  </back>

</rfc>
