<?xml version='1.0' encoding='utf-8'?>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt"?>
<?rfc toc="yes"?>
<?rfc tocompact="yes"?>
<?rfc tocdepth="4"?>
<?rfc compact="yes"?>
<?rfc subcompact="no"?>
<?rfc sortrefs="yes"?>
<?rfc symrefs="yes"?>
<?rfc iprnotified="no"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" category="std" consensus="true" docName="draft-gould-regext-rdap-server-validation-00" ipr="trust200902" obsoletes="" updates="" submissionType="IETF" xml:lang="en" tocInclude="true" tocDepth="4" sortRefs="true" symRefs="true" version="3">
  <front>
    <title abbrev="RDAP server validation Extension">Registration Data Access Protocol (RDAP) Extension for Server Validation</title>
    <seriesInfo name="Internet-Draft" value="draft-gould-regext-rdap-server-validation-00"/>
     <author fullname="James Gould" initials="J.G" surname="Gould">
      <organization>VeriSign, Inc.</organization>
      <address>
        <postal>
          <street>12061 Bluemont Way</street>
          <city>Reston</city>
          <region>VA</region>
          <code>20190</code>
          <country>US</country>
        </postal>
        <email>jgould@verisign.com</email>
        <uri>http://www.verisign.com</uri>
      </address>
    </author>
    <author fullname="Sandra Gould" initials="S.G" surname="Gould">
      <organization>VeriSign, Inc.</organization>
      <address>
        <postal>
          <street>12061 Bluemont Way</street>
          <city>Reston</city>
          <region>VA</region>
          <code>20190</code>
          <country>US</country>
        </postal>
        <email>sgould@verisign.com</email>
        <uri>http://www.verisign.com</uri>
      </address>
    </author>
    <author fullname="Tanya Sutan-Tanon" initials="T.S" surname="Sutan-Tanon">
      <organization>VeriSign, Inc.</organization>
      <address>
        <postal>
          <street>12061 Bluemont Way</street>
          <city>Reston</city>
          <region>VA</region>
          <code>20190</code>
          <country>US</country>
        </postal>
        <email>thasutantanon@verisign.com</email>
        <uri>http://www.verisign.com</uri>
      </address>
    </author>
    <area>General</area>
    <keyword>RDAP</keyword>
    <keyword>Registration Data Access Protocol</keyword>
    <keyword>JSON</keyword>
    <keyword>Validation</keyword>
    <keyword>Server</keyword>
    <keyword>Server Validation</keyword>
    <keyword>Extension</keyword>
    <abstract>
      <t>
      This document describes an Registration Data Access Protocol (RDAP)
      extension for providing the status of server validations.  Server 
      validations can be done for an extensible set of types, with examples 
      including validating DNS resolution with the type "dns" and 
      validating DNSSEC with the type "dnssec".  The validations
      can be performed synchronously in the provisioning command  
      or asynchronously based on a triggering command or a schedule.  
      The extension will provide the status of the validations, by type, performed 
      by the server in an RDAP lookup response.
      </t>
    </abstract>
  </front>
  <middle>
    <section anchor="introduction" numbered="true" toc="default">
      <name>Introduction</name>
      <t>
      This document describes an Registration Data Access Protocol (RDAP) extension for 
      including server validation information for RDAP object classes, such as the Domain Object Class and the Nameserver Object Class 
      in <xref target="RFC9083"/>.  Server validations can be done for an extensible set of types, with examples 
      including validating DNS resolution with the type "dns" and 
      validating DNSSEC with the type "dnssec".  The validations
      can be performed synchronously in the provisioning command  
      or asynchronously based on a triggering command or a schedule.
      The server validation information is returned in an RDAP lookup response that includes 
      for each validation type the current validation status and the date and time of the 
      last validation.    
      </t>
      <t>
      This document is complementary to the Server Validation Extension for the Extensible Provisioning Protocol (EPP) [I-D.gould-regext-epp-server-validation], 
      but registry operators do not need to implement that extension in their EPP server in order to implement this RDAP extension.
      </t>
    </section>
    <section anchor="conventions" numbered="true" toc="default">
      <name>Conventions Used in This Document</name>
      <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL
      NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED",
      "MAY", and "OPTIONAL" in this document are to be interpreted as
      described in BCP 14 <xref target="RFC2119" format="default"/> <xref target="RFC8174" format="default"/>
      when, and only when, they
      appear in all capitals, as shown here.</t>
      <t>The example RDAP responses don't include all of the RDAP response members, but are only representative of the 
      members that are relavant to this extension.</t>
    </section>
    <section anchor="rdap-conformance" numbered="true" toc="default">
      <name>RDAP Conformance</name>
      <t>Servers implementing this extension MUST include the string &quot;serverValidation&quot; in the &quot;rdapConformance&quot; (<xref target="RFC9083" format="default"/>) array of all relevant RDAP responses.
        The registration of the &quot;serverValidation&quot; extension identifier is described in <xref target="iana-considerations" format="default"/>.</t>
    </section>
    <section anchor="serverValidation_data-member" numbered="true" toc="default">
      <name>"serverValidation_data" Member</name>
      <t>The server validation information is conveyed via a new top-level object member named &quot;serverValidation_data&quot; within the object class that the server validations have been executed for. 

      The "serverValidation_data" member includes a list of server validation objects, where there is up to one per type, containing the following members:</t>
      <ul spacing="normal">
        <li>type -- a REQUIRED type of server validation that is up to server policy.  Example values include "dns" for 
        validation of DNS resolution and "dnssec" for validation of DNSSEC.</li>
        <li>status -- a REQUIRED status of the server validation with the values of "success" to reflect 
        that the last validation was successful and "failed" to reflect that the last validation failed.</li>
        <li>date -- An OPTIONAL date and time when the server validation was last executed.</li>
        <li><t>operation -- An OPTIONAL operation that triggered the validation.  This element is not included if the server validation
        was performed asynchronously without a triggering transform operation.  The possible enumerated list of operation values are:</t>
          <ul spacing="normal">
            <li>create -- Create operation as defined in <xref target="RFC5730"/>.</li>
            <li>delete -- Delete operation as defined in <xref target="RFC5730"/> if the delete operation does not result in 
              an immediate purge of the object.</li>
            <li>renew -- Renew operation as defined in <xref target="RFC5730"/>.</li>
            <li>transfer -- Transfer operation as defined in <xref target="RFC5730"/> that MUST set the 
				    "op" member with one of the possible transfer type values that include "request", "approve", "cancel", or "reject".</li>
            <li>update -- Update operation as defined in <xref target="RFC5730"/>.</li>
            <li>restore -- Restore operation as defined in <xref target="RFC3915"/> that MUST set the 
				    "op" member with one of the possible restore type values that include "request" or "report".</li>
            <li>autoRenew -- Auto renew operation executed by the server.</li>
            <li>autoDelete -- Auto delete operation executed by the server if the auto delete operation does not result in an immediate
				purge of the object.</li>
            <li>custom -- Custom operation that MUST set the "op" attribute with the custom operation name.  
				The custom operations supported is up to server policy.</li>
          </ul>
        </li>
        <li>op -- An OPTIONAL custom operation name or sub-operation of the "operation" member.</li>
        <li>lastSuccess -- An OPTIONAL date and time when the server validation was last successful.  This 
        member should only be returned when the "status" member has the value of "failed" and there was a prior 
        successful validation.</li>
       <li>firstFailed -- An OPTIONAL date and time when the server validation first failed.  This 
        element should only be returned when the "status" member has the value of "failed".</li>
        <li>lastFailed -- An OPTIONAL date and time when the server validation last failed.  This 
        member should only be returned when the "status" member has the value of "success" and there was a prior 
        failed validation.</li>
        <li>reason -- An OPTIONAL array of server validation failure reasons when the "status" member has the value of "failed".
        If present, this element contains the server-specific text to help explain the reason for the failure.</li>
        <li>reasonLang -- An OPTIONAL langauge of the "reason" member text with a default value of "en" (English).</li>
      </ul>
      <figure anchor="domain-dnssec-success-serverValidation" align="left" suppress-title="false">
        <name>Domain object including the &quot;serverValidation_data&quot; member for the successful "dnssec" server validation:</name>
        <sourcecode type="json" markers="false">
{
  "objectClassName": "domain",
  "handle": "XXX",
  "ldhName": "example.com",
  "rdapConformance": ["rdap_level_0", "serverValidation"],
  "serverValidation_data": [
    { 
      "type": "dnssec",
      "status": "success",
      "date": "2026-01-01T12:22:53.0Z"
    }
  ]
}
        </sourcecode>
      </figure>
      <figure anchor="domain-dnssec-failed-serverValidation" align="left" suppress-title="false">
        <name>Domain object including the &quot;serverValidation_data&quot; member for the failed "dnssec" server validation:</name>
        <sourcecode type="json" markers="false">
{
  "objectClassName": "domain",
  "handle": "XXX",
  "ldhName": "example.com",
  "rdapConformance": ["rdap_level_0", "serverValidation"],
  "serverValidation_data": [
    { 
      "type": "dnssec",
      "status": "failed",
      "date": "2026-01-03T07:21:33Z", 
      "lastSuccess": "2025-12-11T07:20:00Z",
      "firstFailed": "2025-12-12T08:19:44Z",
      "reason": [
        "Matching DNSKEY not found for DS keyTag 12345"
      ]
    }
  ]
}
        </sourcecode>
      </figure>
      <figure anchor="domain-dns-dnssec-success-serverValidation" align="left" suppress-title="false">
        <name>Domain object including the &quot;serverValidation_data&quot; member for the successful "dns" and "dnssec" server validation:</name>
        <sourcecode type="json" markers="false">
{
  "objectClassName": "domain",
  "handle": "XXX",
  "ldhName": "example.com",
  "rdapConformance": ["rdap_level_0", "serverValidation"],
  "serverValidation_data": [
    { 
      "type": "dns",
      "status": "success",
      "date": "2026-01-01T12:22:53.0Z",
      "operation": "create"
    },
    {
      "type": "dnssec",
      "status": "success",
      "date": "2026-01-01T12:22:53.0Z",
      "operation": "create",
      "firstFailed": "2026-01-01T06:22:53.0Z"
    }
  ]
}
        </sourcecode>
      </figure>
     <figure anchor="good-domain-dns-dnssec-mixed-serverValidation" align="left" suppress-title="false">
        <name>Domain object including the &quot;serverValidation_data&quot; member for the successful "dns" 
        server validation and a failed "dnssec" server validation:</name>
        <sourcecode type="json" markers="false">
{
  "objectClassName": "domain",
  "handle": "XXX",
  "ldhName": "example.com",
  "rdapConformance": ["rdap_level_0", "serverValidation"],
  "serverValidation_data": [
    { 
      "type": "dns",
      "status": "success",
      "date": "2026-01-01T12:22:53.0Z",
      "operation": "create"
    },
    {
      "type": "dnssec",
      "status": "failed",
      "date": "2026-01-01T12:22:53Z", 
      "firstFailed": "2026-01-01T12:22:53Z", 
      "operation": "create",
      "reason": [
        "Matching DNSKEY not found for DS keyTag 12345",
        "Insecure DNSKEY algorithm for DS keyTag 54321"
      ]
    }
  ]
}
        </sourcecode>
      </figure>
     <figure anchor="good-domain-dnssec-keyexchange-success-serverValidation" align="left" suppress-title="false">
        <name>Domain object including the &quot;serverValidation_data&quot; member for the successful "dnssec" 
        server validation triggered by the custom "keyExchange" operation:</name>
        <sourcecode type="json" markers="false">
{
  "objectClassName": "domain",
  "handle": "XXX",
  "ldhName": "example.com",
  "rdapConformance": ["rdap_level_0", "serverValidation"],
  "serverValidation_data": [
    { 
      "type": "dnssec",
      "status": "success",
      "date": "2026-01-01T12:22:53.0Z",
      "operation": "custom",
      "op": "keyExchange"
    }
  ]
}
        </sourcecode>
      </figure>      
    </section>
    <section anchor="extension-version-identifier" title="Extension Version Identifier">
      <t>This extension supports the Point Versioning defined in <xref target="I-D.ietf-regext-rdap-versioning"/> with 
      a Point Extension Version Identifier of &quot;serverValidation-0.1&quot;.  
      When there are interface changes to the extension, the Point Extension Version Identifier will be incremented, which may not match the draft version number.  
      When the draft becomes a working group document and passes Working Group Last Call (WGLC), the Point Extension Version Identifier will be changed to &quot;serverValidation-1.0&quot;.
      </t>
    </section>
    <section anchor="iana-considerations" numbered="true" toc="default">
      <name>IANA Considerations</name>
      <section anchor="rdap-extensions-registry" numbered="true" toc="default">
        <name>RDAP Extensions Registry</name>
        <t>IANA is requested to register the following value in the RDAP
           Extensions Registry:</t>
        <dl newline="false" spacing="compact">
          <dt>Extension identifier:</dt>
          <dd>serverValidation</dd>
          <dt>Registry operator:</dt>
          <dd>Any</dd>
          <dt>Published specification:</dt>
          <dd>This document.</dd>
          <dt>Contact:</dt>
      	  <dd>IETF &lt;iesg@ietf.org&gt;</dd>
          <dt>Intended usage:</dt>
      	  <dd>This extension identifies RDAP extension for server validation information.</dd>
        </dl>
      </section>
    </section>
    <section anchor="security-considerations" numbered="true" toc="default">
      <name>Security Considerations</name>
      <t>The extension described in this document does not provide any security services beyond those described by <xref target="RFC9083" format="default"/>.</t>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
          <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.8174.xml"/>
          <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.9083.xml"/>
          <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml3/reference.I-D.ietf-regext-rdap-versioning.xml"/>
      </references>
      <references>
        <name>Informative References</name>
          <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.3915.xml"/>
          <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.5730.xml"/>
          <!-- 
          Add once draft-gould-regext-epp-server-validation is posted 
          <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml3/reference.I-D.gould-regext-epp-server-validation.xml"/>
          --> 
      </references>
    </references>
  </back>
</rfc>
