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就可以傳送相關命令了,歡迎大家下載使用。
早期的每一家註冊局(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中必須帶有一個
代表連線的資訊,回應的時候同時也會帶上這個資訊,表示是回應哪一個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就可以傳送相關命令了,歡迎大家下載使用。