這裏說的域名註冊商不是域名分銷或代理商, 進入正題。在此以前先說下項目中用到的幾個知識點。html
a什麼是域名?數據庫
域名(Domain Name),是由一串用點分隔的名字組成的Internet上某一臺計算機或計算機組的名稱,用於在數據傳輸時標識計算機的電子方位(有時也指地理位置,地理上的域名,指代有行政自主權的一個地方區域)。域名是一個IP地址上有「面具」 。一個域名的目的是便於記憶和溝通的一組服務器的地址(網站,電子郵件,FTP等)。域名做爲力所能及難忘的互聯網參與者的名稱,世界上第一個註冊的域名是在1985年1月註冊的,詳細瞭解請看百度百科。api
b如何成爲一個域名註冊商安全
申請註冊商不是經過ICANN服務器
只有申請根域名纔是。通過ICANN認證的企業,須要公司規模、技術實力、服務標準、市場、資金情況等多方面具有較高的標準。從ICANN官方網站了解到,2010年後申請認證的企業,認證標準及難度較以往認證難度增長近一倍。經過ICANN認證後,還要向VeriSign(受ICANN委託的公司,負責.com/.net/.tv域名的註冊管理業務)等管理公司申請相關域名的註冊接口,再次對認證企業進行審覈。很是複雜的程序。dom
c作爲一個域名註冊商還須要幫助客戶解決域名解析,並提供WHOIS查詢.ide
上面說到經過ICANN認證並向(這裏以VeriSign爲例)申請註冊接口後,VeriSign會提供一些測試環境的帳號和資料,只有在測試環境中把諸如域名查詢/域名生成/域名續期/域名轉移等功能實現,最後能過VeriSign測試驗收後纔會進入正式帳號的下發流程。本着有圖纔有真像的原則這裏上一張圖。工具
VerSign的在線客服通常是周1-5在線,他們的中文客服部在澳大利亞的墨爾本,上午10點後纔在線。他們的客服在你要修改敏感信息如IP白名單修改等操做時要經過電話(他只會打你在ICANN上留的電話)進行安全短語確認後才能進行。下面是一些資料.測試
註冊商產品和工具http://www.verisign.com/zh_CN/channel-resources/domain-registry-products/epp-sdks/index.xhtml#chat網站
在線調試https://epptool-ctld.verisign-grs.com/epptool/
RFC 5730:擴展供應協議文檔http://tools.ietf.org/html/rfc5730
由於Verisign只提供JAVA的DEMO,對JAVA不熟,只得用C#來寫。下面這些東西不能少:一臺帶獨立IP的服務器,一個Verisign支持的證書,和他們服務器的鏈接過程請看下圖
這裏用到了雙向認證和非對稱加密。下面是他們的服務器支持的證書類型,不在下面列表的證書可能會被他們的服務器拒絕鏈接。
Verisign supports SSL certificates from the Certificate Authority (CA) providers Symantec, Thawte, GeoTrust, and GoDaddy. All issued certificates must chain up to one of the following supported root CA certificates, grouped by provider:
Symantec
VeriSign Class 2 Public Primary Certification Authority - G3
VeriSign Class 3 Public Primary Certification Authority - G3
VeriSign Class 4 Public Primary Certification Authority - G3
VeriSign Trust Network
VeriSign Universal Root Certification Authority
VeriSign Class 3 Public Primary Certification Authority - G5
Class 1 Public Primary Certification Authority
VeriSign Class 1 Public Primary Certification Authority - G3
Class 3 Public Primary Certification Authority
VeriSign Class 3 Public Primary Certification Authority - G4
Symantec Class 1 Public Primary Certification Authority - G6
Symantec Class 2 Public Primary Certification Authority - G6
Thawte
Thawte Primary Root CA
Thawte Premium Server CA
Thawte Server CA
Thawte Primary Root CA - G2
Thawte Primary Root CA - G3
GeoTrust Primary Certification Authority - G2
GeoTrust
GeoTrust Universal CA
GeoTrust Primary Certification Authority
GeoTrust Universal CA 2
GeoTrust Global CA
GeoTrust Global CA 2
Equifax Secure Certificate Authority
GeoTrust Primary Certification Authority - G3
GoDaddy
Starfield Secure Certification Authority
Go Daddy Root Certificate Authority - G2
Starfield Secure Certification Authority
ValiCert Class 2 Policy Validation Authority
Starfield Class 2 Certification Authority
Starfield Root Certificate Authority - G2
Starfield Services Root Certificate Authority - G2
Go Daddy Class 2 Certification Authority
Starfield Services Root Certificate Authority
當時在驗收測試時也花了很多精力,他們的驗收文檔是英文的,在這裏我發下他們的驗收流程,但願對之後哪位兄弟有幫助
你須要完成全部27個指令,而後把開始時間,結束時間,還有開始OT&E1第一個指令的時間,和OT&E2最後一個指令的時間給咱們。
The start and end times for the test below
The domain name used during the test
The EPP server transaction ID from the operation in Step # 1 below. This is the Epp
Session command for the OT&E1 account.
The EPP server transaction ID from the operation in Step # 27 below. This is the
Epp Quit command for the OT&E2 account.
Extensible Provisioning Protocol
Registrar Acceptance Criteria
1,登陸帳號1
2,用帳號1查詢一個可用域名
3,用帳號1購買一個域名年限2
4,建立子命名服務器1的使用命名服務器添加新建立的域命令你OT&E1賬戶登陸--建立一個域名服務器
5建立子新建立的域的名稱服務器2使用添加名稱空間命令你OT&E1賬戶登陸--再建立一個域名服務器
6更新域鏈接子域名服務器到新建立的域使用OT&E1賬戶登陸域的命令--把這兩個域名服務器加到域名上去
7更新域添加域ClientHold客戶狀態,ClientUpdateProhibited、ClientDeleteProhibited ClientTransferProhibited內部
一個命令用OT&E1賬戶登陸--給域名添加ClientHold,
ClientUpdateProhibited, ClientDeleteProhibited, and ClientTransferProhibited這幾種狀態
8域上執行一個信息來驗證使用STATUS-FULL更新用OT&E1賬戶登陸--用info指令查詢該域名
9更新域刪除域ClientHold客戶狀態,
ClientUpdateProhibited、ClientDeleteProhibited ClientTransferProhibited
用OT&E1賬戶登陸--給域名去除ClientHold,
ClientUpdateProhibited, ClientDeleteProhibited, and ClientTransferProhibited這幾種狀態
10域上執行一個信息來驗證使用STATUS-FULL更新用OT&E1賬戶登陸
11用OT&E1賬戶更新域名密碼
12更新的孩子命名服務器的IP地址1新建立的域的使用OT&E1賬戶登陸--修改域名服務器1的IP地址
13用帳號1發送HELLO
14用帳號1更新域名使用年限+2年
15登陸第二個帳號
16用帳號2查詢INFO徹底狀態
17用帳號2發起域名轉移請求
18用帳號2發起域名轉移查詢
19用帳號1批准域名轉移
20用帳號1執行POLL-REQUEST
21用帳號1執行POLL-ACK
22用帳號1發起域名轉移請求
23用帳號2進行轉移查詢
24用帳號2進行轉移拒絕
25用帳號2進行域名同步,日期爲下個月15號
26退出帳號1
27退出帳號2
這裏講下咱們平時去查一個域名的WHOIS信息是怎麼來的?
基於RFC 954提供的WHOIS協議
http://www.rfc-base.org/txt/rfc-954.txt
域名的查詢主要是基於RFC 954提供的WHOIS協議。在上述過程當中,
咱們其實是訪問了InterNIC站點的WHOIS服務器,
該服務器從WHOIS數據庫中查詢咱們所須要的內容。
WHOIS服務器是一個基於"查詢/響應"的TCP事務服務器,
它運行在SRI-NIC機器上(26.0.0.73或10.0.0.51),向用戶提供internet範圍內的目錄服務。
本地主機上的用戶程序能夠經過Internet訪問該服務器,其過程主要有下面三步:
(1)在TCP服務端口43(十進制)鏈接SRI-NIC服務主機;
(2)發送一個命令,以回車和換行(<CRLF>)結尾;
(3)接受相應命令的返回信息,一旦輸出結束,服務器將關閉鏈接。
命令的格式很是簡單。能夠直接輸入域名
用Socket去鏈接whois提供的服務器。Whois服務的默認端口是43,查詢的話就是把域名往這邊發送過去,
Whois服務器在收到你的請求後就會返回純文本的格式
第一步是查詢終級WhoIS服務器。
第二步根據上面提供的所在Whois服務器而後再進行,進一步的詳細查詢 ,
這時把兩個結果合到一塊兒才能獲得咱們想要的詳細信息。
頂級域名 whois 服務器列表大全
http://www.liqwei.com/network/protocol/2014/916.shtml
文章下面提供一個簡單的whois查詢服務器和一個簡單的whois查詢客戶端
最後講下域名解析,咱們採用的是第三方託管的方案,也就是在咱們平臺上註冊的域名咱們會把DNS地址指向第三方的地址,而後調用他們的API進行解析服務,爲了不廣告嫌疑,這裏不公開咱們使用的第三方DNS服務商,這裏要說的是在接入他們的API過程當中遇到的一些坑,對方API只提供PHP樣例,其中的參數簽名以下:
$apiKey = 'your apiKey'; $apiSecret = 'your apiSecret'; // 參數 $parameters = array( 'apiKey' => $apiKey, 'domain' => 'yourdomain.com', 'timestamp' => time() ); // 按鍵名排序 ksort($parameters); $hashString = ''; foreach($parameters as $key => $value){ $hashString .= ($hashString ? '&' : '') . $key . '=' . $value; } $parameters['hash'] = md5($hashString . $apiSecret); ?>
而後就遇到了用C#寫的MD5加密後的簽名和PHP生成的不匹配等問題,這裏貼下在網上找的可用方案:
/// <summary> /// 計算參數簽名 /// </summary> /// <param name="params">請求參數集,全部參數必須已轉換爲字符串類型</param> /// <param name="secret">簽名密鑰</param> /// <returns>簽名</returns> public static string getSignature(IDictionary<string, string> parameters, string secret) { // 先將參數以其參數名的字典序升序進行排序 IDictionary<string, string> sortedParams = new SortedDictionary<string, string>(parameters); IEnumerator<KeyValuePair<string, string>> iterator = sortedParams.GetEnumerator(); // 遍歷排序後的字典,將全部參數按"key=value"格式拼接在一塊兒 StringBuilder basestring = new StringBuilder(); while (iterator.MoveNext()) { string key = iterator.Current.Key; string value = iterator.Current.Value; if (!string.IsNullOrEmpty(key) && !string.IsNullOrEmpty(value)) { if (!string.IsNullOrEmpty(basestring.ToString())) { basestring.Append("&"); } basestring.Append(key).Append("=").Append(value); } } basestring.Append(secret); return md5(basestring.ToString(), "utf-8").ToLower(); }
public static string md5(string str, string encodingStr) { try { MD5CryptoServiceProvider mmdd5 = new MD5CryptoServiceProvider(); byte[] hashvalue = mmdd5.ComputeHash(Encoding.GetEncoding(encodingStr).GetBytes(str)); mmdd5.Dispose(); return BitConverter.ToString(hashvalue).Replace("-", "").ToLower(); } catch { return String.Empty; } }
夜深了,就先寫這麼多了,之後有空再擴展,有兄弟也作域名註冊商這一塊的能夠多交流一下,搞碗湯圓,睡~