HOME | DNS | Extensible Provisioning Protocol(EPP)

Extensible Provisioning Protocol(EPP)

2019/05/14/10:15 , Post in DNS , 評論(0) , 引用(0) , 閱讀(1881) , Via 本站原創
Extensible Provisioning Protocol(EPP)是一個網域名稱註冊的一個標準的協定

早期的每一家註冊局(registry)都有自己的註冊域名的API或是格式

當一家代理註冊商(registrar)要能夠代理不同註冊局的域名時,就會

碰到程式不通用的問題。為了解決這個問題,IETF推出了一個通用格式

Extensible Provisioning Protocol(EPP),他是一種以XML的標準格式

讓registrar在與各家registry溝通時能夠更方便的傳輸資料。

完整的資料傳輸流程大概是這樣,首先client與EPP server端先建立TCP三方

交握連線,接著進行加密憑證的交換(一般是走加密連線啦,應該很少是明文

傳送),連線完成之後,首先是SERVER端或傳送一個HELLO,內容是這個EPP SERVER

的相關資訊,使用的EPP版本,是否有extension以及schema,接著client端每

發送一個request,server端就會回應一個response。client首先必須先作login

,server回應登入成功,後續就夠發送要執行動作的request,當連線結束後,client

需要在發送一個logout的指令,或是直接斷開連線,server仍然會發送一個斷開

連線的Response。

整個EPP的指令大概可以分成兩類,一類是連線用指令(login、logout、greet),

另一類是操作相關物件用(create建立、update更新、delete刪除、transfer移轉

、info查詢資料、check檢查是否存在、renew續用、poll通知)。


一個網域名稱主要分成三個物件,網域名稱(Domain)、聯繫資訊(Contact)、主機資訊(Host)。

當我們要註冊一個網域名稱,因為網域的資料中一定要帶擁有者等相關聯繫資訊

因此必須要先建立個人資料(contact create),接著才能夠註冊網域名稱(domain create),

網域建立成功之後僅表示這個網域名稱已經屬於某個人,但是仍然無法運作,接著要建立

Host(Host create)資訊,也就是指定你的DNS主機,DNS才能夠正常解析,才能夠讓這個域

名能夠真正的發揮作用。

所以一個完整註冊的流程大概是這樣的

檢查contact是否存在(contact check)->不存在則註冊contact(contact create)->檢查contact是否存在

要註冊的域名是否存在(domain check)->不存在則註冊域名(domain create)->建立自己的host主機資訊

(host create)->更新域名設定NS(domain update)

  

xml範例:

REQUEST:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
  <epp xmlns="urn:ietf:params:xml:ns:epp-1.0"  
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="urn:ietf:params:xml:ns:epp-1.0 epp-1.0.xsd">
  <command xmlns="urn:ietf:params:xml:ns:epp-1.0">
    <create>
      <domain:create xmlns:domain="urn:ietf:params:xml:ns:domain-1.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="urn:ietf:params:xml:ns:domain-1.0 domain-1.0.xsd">
        <domain:name>test.com.tw</domain:name>
        <domain:period unit="y">1</domain:period>
        <domain:registrant>test-contact-001</domain:registrant>
        <domain:contact type="admin">test-contact-001</domain:contact>
        <domain:contact type="tech">test-contact-001</domain:contact>
    <domain:contact type="billing">test-contact-001</domain:contact>
        <domain:authInfo>
          <domain:pw>testpass</domain:pw>
        </domain:authInfo>
      </domain:create>
    </create>
    <clTRID>ABC-96803-XYZ</clTRID>
  </command>
</epp>

RESPONSE:

<?xml version="1.0" encoding="UTF-8"?>
<epp xmlns="urn:ietf:params:xml:ns:epp-1.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="urn:ietf:params:xml:ns:epp-1.0 epp-1.0.xsd">
  <response>
    <result code="1000">
      <msg lang="en-US">Command completed successfully</msg>
    </result>
    <resData>
      <domain:creData xmlns:domain="urn:ietf:params:xml:ns:domain-1.0">
        <domain:name>test.com.tw</domain:name>
        <domain:crDate>2019-05-13T16:21:58.0Z</domain:crDate>
        <domain:exDate>2020-05-13T16:21:58.0Z</domain:exDate>
      </domain:creData>
    </resData>
    <trID>
      <clTRID>ABC-96803-XYZ</clTRID>
      <svTRID>1557764518-3829-2515</svTRID>
    </trID>
  </response>
</epp>


以上是一個domain create的範例,相關的XML schema都可以在網路上找的到

可以看到要做的動作基本上是被包在command這個tag中,回應中會有一個

result code,1XXX開頭基本上就是成功,其他開頭就是失敗,這個資料在RFC

中都有說明。

使用者的request中必須帶有一個ABC-96803-XYZ,這是一個

代表連線的資訊,回應的時候同時也會帶上這個資訊,表示是回應哪一個request

同時會加上server的一個唯一的連線ID。

如果註冊商有自己特殊的規定或是資訊,EPP也可以另外增加一個extension的欄位

以DNSSEC為例,XML就會多出一個與create同階層的extension的欄位如下


<?xml version="1.0" encoding="UTF-8" standalone="no"?>
  <epp xmlns="urn:ietf:params:xml:ns:epp-1.0"  
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="urn:ietf:params:xml:ns:epp-1.0 epp-1.0.xsd">
  <command xmlns="urn:ietf:params:xml:ns:epp-1.0">
    <create>
      <domain:create xmlns:domain="urn:ietf:params:xml:ns:domain-1.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="urn:ietf:params:xml:ns:domain-1.0 domain-1.0.xsd">
        <domain:name>test.com.tw</domain:name>
        <domain:period unit="y">1</domain:period>
        <domain:registrant>test-contact-001</domain:registrant>
        <domain:contact type="admin">test-contact-001</domain:contact>
        <domain:contact type="tech">test-contact-001</domain:contact>
    <domain:contact type="billing">test-contact-001</domain:contact>
        <domain:authInfo>
          <domain:pw>testpass</domain:pw>
        </domain:authInfo>
      </domain:create>
    </create>
  <extension>
    secDNS:create xmlns:secDNS="urn:ietf:params:xml:ns:secDNS-1.1"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="urn:ietf:params:xml:ns:secDNS-1.1 secDNS-1.1.xsd">
      <secDNS:dsData>
        <secDNS:keyTag>9765</secDNS:keyTag>
        <secDNS:alg>5</secDNS:alg>
        <secDNS:digestType>1</secDNS:digestType>
        <secDNS:digest>4141674BFF957211D129B0DFE9410AF753559D4B</secDNS:digest>
      </secDNS:dsData>
    </secDNS:create>
  </extension>
    <clTRID>ABC-96803-XYZ</clTRID>
  </command>
</epp>


最後附上筆者從github上下載的php client修改後的一個簡單版的client

解壓縮之後填寫設定檔settings.ini,執行php request.php就可以傳送相關命令了,歡迎大家下載使用。

發表評論

暱稱

網址

電郵

開啟HTML 開啟UBB 開啟表情 隱藏 記住我 [登入] [註冊]