To secure the transfer process using secure authorization information as described in
Section 4, the client and server need to implement steps where the authorization information is set only when a transfer is actively in process and ensure that the authorization information is stored securely and transported only over secure channels. The steps for management of the authorization information for transfers include the following:
-
The registrant requests to register the object with the registrar. The registrar sends the <create> command with an empty authorization information value to the registry, as described in Section 5.1.
-
The registrant requests from the losing registrar the authorization information to provide to the gaining registrar.
-
The losing registrar generates a secure random authorization information value and sends it to the registry, as described in Section 5.2, and then provides it to the registrant.
-
The registrant provides the authorization information value to the gaining registrar.
-
The gaining registrar optionally verifies the authorization information with the <info> command to the registry, as described in Section 5.3.
-
The gaining registrar sends the transfer request with the authorization information to the registry, as described in Section 5.4.
-
If the transfer completes successfully, the registry automatically unsets the authorization information; otherwise, the losing registrar unsets the authorization information when the TTL expires; see Section 5.2.
The following sections outline the practices of the EPP commands and responses between the registrar and the registry that supports secure authorization information for transfer.
For a <create> command, the registry
MUST allow the passing of an empty authorization information value and
MAY disallow the passing of a non-empty authorization information value. By having an empty authorization information value on create, the object is initially not involved in the transfer process. Any EPP object extension that supports setting the authorization information with an "eppcom:pwAuthInfoType" element can pass an empty authorization information value. Examples of such extensions are found in [
RFC 5731] and [
RFC 5733].
Example of passing an empty authorization information value in a domain name <create> command [
RFC 5731]:
C:<?xml version="1.0" encoding="UTF-8" standalone="no"?>
C:<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
C: <command>
C: <create>
C: <domain:create
C: xmlns:domain="urn:ietf:params:xml:ns:domain-1.0">
C: <domain:name>example.com</domain:name>
C: <domain:authInfo>
C: <domain:pw/>
C: </domain:authInfo>
C: </domain:create>
C: </create>
C: <clTRID>ABC-12345</clTRID>
C: </command>
C:</epp>
Example of passing an empty authorization information value in a contact <create> command [
RFC 5733]:
C:<?xml version="1.0" encoding="UTF-8" standalone="no"?>
C:<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
C: <command>
C: <create>
C: <contact:create
C: xmlns:contact="urn:ietf:params:xml:ns:contact-1.0">
C: <contact:id>sh8013</contact:id>
C: <contact:postalInfo type="int">
C: <contact:name>John Doe</contact:name>
C: <contact:addr>
C: <contact:city>Dulles</contact:city>
C: <contact:cc>US</contact:cc>
C: </contact:addr>
C: </contact:postalInfo>
C: <contact:email>jdoe@example.com</contact:email>
C: <contact:authInfo>
C: <contact:pw/>
C: </contact:authInfo>
C: </contact:create>
C: </create>
C: <clTRID>ABC-12345</clTRID>
C: </command>
C:</epp>
For an <update> command, the registry
MUST allow the setting and unsetting of the authorization information. The registrar sets the authorization information by first generating a strong, random authorization information value, based on the information provided in
Section 4.1, and setting it in the registry in the <update> command. The importance of generating strong authorization information values cannot be overstated: secure transfers are very important to the Internet to mitigate damage in the form of theft, fraud, and other abuse. It is critical that registrars only use strong, randomly generated authorization information values.
Because of this, registries may validate the randomness of the authorization information based on the length and character set required by the registry -- for example, validating that an authorization value contains a combination of uppercase, lowercase, and non-alphanumeric characters in an attempt to assess the strength of the value and returning an EPP error result of 2202 ("Invalid authorization information") [
RFC 5730] if the check fails.
Such checks are, by their nature, heuristic and imperfect, and may identify well-chosen authorization information values as being not sufficiently strong. Registrars, therefore, must be prepared for an error response of 2202 and respond by generating a new value and trying again, possibly more than once.
Often, the registrar has the "clientTransferProhibited" status set, so to start the transfer process, the "clientTransferProhibited" status needs to be removed, and the strong, random authorization information value needs to be set. The registrar
MUST define a TTL, as described in
Section 4.2, and if the TTL expires, the registrar will unset the authorization information.
Example of removing the "clientTransferProhibited" status and setting the authorization information in a domain name <update> command [
RFC 5731]:
C:<?xml version="1.0" encoding="UTF-8" standalone="no"?>
C:<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
C: <command>
C: <update>
C: <domain:update
C: xmlns:domain="urn:ietf:params:xml:ns:domain-1.0">
C: <domain:name>example.com</domain:name>
C: <domain:rem>
C: <domain:status s="clientTransferProhibited"/>
C: </domain:rem>
C: <domain:chg>
C: <domain:authInfo>
C: <domain:pw>LuQ7Bu@w9?%+_HK3cayg$55$LSft3MPP
C: </domain:pw>
C: </domain:authInfo>
C: </domain:chg>
C: </domain:update>
C: </update>
C: <clTRID>ABC-12345-XYZ</clTRID>
C: </command>
C:</epp>
When the registrar-defined TTL expires, the sponsoring registrar
MUST cancel the transfer process by unsetting the authorization information value and
MAY add back statuses like the "clientTransferProhibited" status. Any EPP object extension that supports setting the authorization information with an "eppcom:pwAuthInfoType" element can pass an empty authorization information value. Examples of such extensions are found in [
RFC 5731] and [
RFC 5733]. Setting an empty authorization information value unsets the authorization information. [
RFC 5731] supports an explicit mechanism of unsetting the authorization information, by passing the <domain:null> authorization information value. The registry
MUST support unsetting the authorization information by accepting an empty authorization information value and accepting an explicit unset element if it is supported by the object extension.
Example of adding the "clientTransferProhibited" status and unsetting the authorization information explicitly in a domain name <update> command [
RFC 5731]:
C:<?xml version="1.0" encoding="UTF-8" standalone="no"?>
C:<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
C: <command>
C: <update>
C: <domain:update
C: xmlns:domain="urn:ietf:params:xml:ns:domain-1.0">
C: <domain:name>example.com</domain:name>
C: <domain:add>
C: <domain:status s="clientTransferProhibited"/>
C: </domain:add>
C: <domain:chg>
C: <domain:authInfo>
C: <domain:null/>
C: </domain:authInfo>
C: </domain:chg>
C: </domain:update>
C: </update>
C: <clTRID>ABC-12345-XYZ</clTRID>
C: </command>
C:</epp>
Example of unsetting the authorization information with an empty authorization information value in a domain name <update> command [
RFC 5731]:
C:<?xml version="1.0" encoding="UTF-8" standalone="no"?>
C:<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
C: <command>
C: <update>
C: <domain:update
C: xmlns:domain="urn:ietf:params:xml:ns:domain-1.0">
C: <domain:name>example.com</domain:name>
C: <domain:add>
C: <domain:status s="clientTransferProhibited"/>
C: </domain:add>
C: <domain:chg>
C: <domain:authInfo>
C: <domain:pw/>
C: </domain:authInfo>
C: </domain:chg>
C: </domain:update>
C: </update>
C: <clTRID>ABC-12345-XYZ</clTRID>
C: </command>
C:</epp>
Example of unsetting the authorization information with an empty authorization information value in a contact <update> command [
RFC 5733]:
C:<?xml version="1.0" encoding="UTF-8" standalone="no"?>
C:<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
C: <command>
C: <update>
C: <contact:update
C: xmlns:contact="urn:ietf:params:xml:ns:contact-1.0">
C: <contact:id>sh8013</contact:id>
C: <contact:chg>
C: <contact:authInfo>
C: <contact:pw/>
C: </contact:authInfo>
C: </contact:chg>
C: </contact:update>
C: </update>
C: <clTRID>ABC-12345-XYZ</clTRID>
C: </command>
C:</epp>
For an <info> command, the registry
MUST allow the passing of a non-empty authorization information value for verification. The gaining registrar can pre-verify the authorization information provided by the registrant prior to submitting the transfer request with the use of the <info> command. The registry compares the hash of the passed authorization information with the hashed authorization information value stored for the object. When the authorization information is not set or the passed authorization information does not match the previously set value, the registry
MUST return an EPP error result code of 2202 [
RFC 5730].
Example of passing a non-empty authorization information value in a domain name <info> command [
RFC 5731] to verify the authorization information value:
C:<?xml version="1.0" encoding="UTF-8" standalone="no"?>
C:<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
C: <command>
C: <info>
C: <domain:info
C: xmlns:domain="urn:ietf:params:xml:ns:domain-1.0">
C: <domain:name>example.com</domain:name>
C: <domain:authInfo>
C: <domain:pw>LuQ7Bu@w9?%+_HK3cayg$55$LSft3MPP
C: </domain:pw>
C: </domain:authInfo>
C: </domain:info>
C: </info>
C: <clTRID>ABC-12345</clTRID>
C: </command>
C:</epp>
The info response in object extensions, such as those defined in [
RFC 5731] and [
RFC 5733],
MUST NOT include the optional authorization information element with a non-empty authorization value. The authorization information is stored as a hash in the registry, so returning the plain-text authorization information is not possible, unless valid plain-text authorization information is passed in the <info> command. The registry
MUST NOT return any indication of whether the authorization information is set or unset to the non-sponsoring registrar by not returning the authorization information element in the response. The registry
MAY return an indication to the sponsoring registrar that the authorization information is set by using an empty authorization information value. The registry
MAY return an indication to the sponsoring registrar that the authorization information is unset by not returning the authorization information element.
Example of returning an empty authorization information value in a domain name info response [
RFC 5731] to indicate to the sponsoring registrar that the authorization information is set:
S:<?xml version="1.0" encoding="UTF-8" standalone="no"?>
S:<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
S: <response>
S: <result code="1000">
S: <msg>Command completed successfully</msg>
S: </result>
S: <resData>
S: <domain:infData
S: xmlns:domain="urn:ietf:params:xml:ns:domain-1.0">
S: <domain:name>example.com</domain:name>
S: <domain:roid>EXAMPLE1-REP</domain:roid>
S: <domain:status s="ok"/>
S: <domain:clID>ClientX</domain:clID>
S: <domain:authInfo>
S: <domain:pw/>
S: </domain:authInfo>
S: </domain:infData>
S: </resData>
S: <trID>
S: <clTRID>ABC-12345</clTRID>
S: <svTRID>54322-XYZ</svTRID>
S: </trID>
S: </response>
S:</epp>
For a <transfer> request command, the registry
MUST allow the passing of a non-empty authorization information value to authorize a transfer. The registry compares the hash of the passed authorization information with the hashed authorization information value stored for the object. When the authorization information is not set or the passed authorization information does not match the previously set value, the registry
MUST return an EPP error result code of 2202 [
RFC 5730]. Whether the transfer occurs immediately or is pending is up to server policy. When the transfer occurs immediately, the registry
MUST return the EPP success result code of 1000 ("Command completed successfully") [
RFC 5730], and when the transfer is pending, the registry
MUST return the EPP success result code of 1001 ("Command completed successfully; action pending"). The losing registrar
MUST be informed of a successful transfer request using an EPP <poll> message.
Example of passing a non-empty authorization information value in a domain name <transfer> request command [
RFC 5731] to authorize the transfer:
C:<?xml version="1.0" encoding="UTF-8" standalone="no"?>
C:<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
C: <command>
C: <transfer op="request">
C: <domain:transfer
C: xmlns:domain="urn:ietf:params:xml:ns:domain-1.0">
C: <domain:name>example1.com</domain:name>
C: <domain:authInfo>
C: <domain:pw>LuQ7Bu@w9?%+_HK3cayg$55$LSft3MPP
C: </domain:pw>
C: </domain:authInfo>
C: </domain:transfer>
C: </transfer>
C: <clTRID>ABC-12345</clTRID>
C: </command>
C:</epp>
Upon successful completion of the transfer, the registry
MUST automatically unset the authorization information. If the transfer request is not submitted within the
Section 4.2 or the transfer is canceled or rejected, the registrar
MUST unset the authorization information, as described in
Section 5.2.