在發(fā)現(xiàn)我國(guó) CNNIC ROOT 根證書已經(jīng)悄無(wú)聲息混進(jìn)微軟 Windows 操作系統(tǒng)受信任的根證書頒發(fā)機(jī)構(gòu)和 Firefox 火狐瀏覽器受信任證書列表中的事實(shí)之后(敏感話題,不再過(guò)多談及,只是希望某機(jī)構(gòu)不要做出 MITM 的劣行),我逛了逛 CNNIC 的網(wǎng)站,發(fā)現(xiàn)他們?cè)诿χ茝V"英文/數(shù)字.中國(guó)"域名的推廣。這令我又想起了中文域名這個(gè)話題,以及當(dāng)年 3721 和 CNNIC 的一些變故。當(dāng)然,那些年的那些破事兒不值得一提,值得一提的一個(gè)話題是瀏覽器對(duì)國(guó)際域名(IDN)的支持,和其中涉及到的技術(shù)。 在看了一些".中國(guó)"域名的例子后,發(fā)現(xiàn)新華網(wǎng)(http://www.xinhuanet.com)已經(jīng)注冊(cè)并使用了中文域名"新華網(wǎng).中國(guó)"。于是我使用 IE10 瀏覽器訪問(wèn)了 http://新華網(wǎng).中國(guó) 。 通過(guò)上面的簡(jiǎn)述解釋,不難會(huì)意出,國(guó)際域名指的是瀏覽器地址欄中以非 ASCII 字符集或字母顯示的 Web 地址。這允許各個(gè)國(guó)家的網(wǎng)站使用本地語(yǔ)言和字符集顯示其地址。其實(shí)微軟從 IE7 開始,就已經(jīng)能夠由瀏覽器處理國(guó)際域名了。所謂"處理",就是指瀏覽器將用戶輸入的非英文的域名轉(zhuǎn)換為編碼后的英文格式。好,這里就涉及到一個(gè)問(wèn)題,為什么要編碼轉(zhuǎn)換? 我們知道,域名是訪問(wèn)網(wǎng)站的捷徑,因?yàn)榫W(wǎng)站的 IP 地址太難于記憶,而簡(jiǎn)短且富有語(yǔ)義的域名字符,更加便于記憶和使用。可是要訪問(wèn)到具體的網(wǎng)站,還是得知道該網(wǎng)站的 IP 地址,那么就需要一個(gè)中間機(jī)構(gòu),能將域名轉(zhuǎn)換為對(duì)應(yīng)的 IP 地址。這個(gè)中間結(jié)構(gòu)就是 DNS 域名服務(wù)器,而轉(zhuǎn)換的過(guò)程我們稱之為"解析"。域名服務(wù)器上記錄了注冊(cè)的域名和網(wǎng)站 IP 地址的對(duì)應(yīng)關(guān)系,所以,訪問(wèn)網(wǎng)站時(shí),鍵入的是域名,可域名服務(wù)器已經(jīng)通過(guò)查詢自己記錄的域名-IP映射關(guān)系,對(duì)用戶透明地將域名轉(zhuǎn)化為了 IP 地址,于是用戶最終訪問(wèn)到了這個(gè)網(wǎng)站。(實(shí)際的中間過(guò)程會(huì)比這里簡(jiǎn)述的復(fù)雜,可以解釋得更為詳細(xì)) DNS最早于1983年由 Paul Mockapetris 發(fā)明,原始的技術(shù)規(guī)范在 RFC 882 中發(fā)布。1987年發(fā)布的第1034和1035號(hào)草案修正了DNS技術(shù)規(guī)范,并廢除了之前的第882和883號(hào)草案。在此之后對(duì)因特網(wǎng)標(biāo)準(zhǔn)草案的修改基本上沒(méi)有涉及到DNS技術(shù)規(guī)范部分的改動(dòng)。互聯(lián)網(wǎng)域名一開始就是以英文 ACSII 字符(的子集)命名和提供注冊(cè)的,2008年,ICANN(一個(gè)國(guó)際互聯(lián)網(wǎng)組織,負(fù)責(zé) IP 地址空間分配、協(xié)議標(biāo)識(shí)符指派、通用頂級(jí)域名及國(guó)家和地區(qū)頂級(jí)域名系統(tǒng)管理、根服務(wù)器系統(tǒng)管理)通過(guò)一項(xiàng)決議,允許使用其它語(yǔ)言作為互聯(lián)網(wǎng)頂級(jí)域名的字符。但是通用標(biāo)準(zhǔn)的 DNS 域名解析系統(tǒng)從設(shè)計(jì)到今天,都不能解析非英文 ASCII 字符,這就是為什么要在國(guó)際域名開放注冊(cè)和投入使用后,要將國(guó)際域名編碼轉(zhuǎn)換為 ASCII 字符的原因。簡(jiǎn)言之,就是為了與 DNS 系統(tǒng)兼容。(其實(shí)還有一個(gè)重要原因,是為了防范IDN homograph attack, 即國(guó)際域名同形異義字欺騙攻擊,又稱 IDN 欺騙,本文不贅述。) 既然國(guó)際域名已經(jīng)開始使用,瀏覽器提供這種編碼轉(zhuǎn)換功能,將國(guó)際域名中各個(gè)國(guó)家不同文字形成的域名轉(zhuǎn)換成特定的用一些 ASCII 英文字符表示的域名,是理所應(yīng)當(dāng)?shù)模@樣,用戶便不再需要安裝一些加載項(xiàng)和工具欄來(lái)進(jìn)行轉(zhuǎn)換,就能直接訪問(wèn)國(guó)際域名。世界上有這么多的國(guó)家和語(yǔ)言文字系統(tǒng),將他們各自語(yǔ)言文字的域名轉(zhuǎn)換為英文后,還得確保都是唯一的,就得運(yùn)用同一種編碼規(guī)則,而且這種編碼既然是用于互聯(lián)網(wǎng)的域名解析系統(tǒng)的,就得使轉(zhuǎn)換后的編碼不至于太長(zhǎng),且能夠抵御 IDN 欺騙。現(xiàn)在,這種統(tǒng)一的編碼已經(jīng)存在,它就是 Punycode. Punycode 是一個(gè)根據(jù) RFC 3492 制定的編碼系統(tǒng),主要用于把域名從地方語(yǔ)言所采用的 Unicode 編碼轉(zhuǎn)換成為可用于 DNS 系統(tǒng)的編碼。該編碼根據(jù)由 IANA 提供的域名相異字表制定,它可以在 Unicode 序列和 ASCII 字符串之間進(jìn)行唯一和可逆的轉(zhuǎn)換,轉(zhuǎn)換過(guò)程中,Unicode 序列中的 ASCII 字符保持不變,國(guó)際化字符則用字母和數(shù)字表示。它可以防止 IDN 欺騙。 簡(jiǎn)單地看看 Punycode 的一個(gè)例子,新華網(wǎng).cn 的 Punycode 就是 xn--xkrr14bows.cn, "新華網(wǎng)"三個(gè)字從中文轉(zhuǎn)化為 xn--xkrr14bows,而分隔符"."不變,英文字母"cn"也不變。如果后綴不是".cn", 而是".中國(guó)",那么分隔符"."仍不變,"中國(guó)"編碼為 xn--fiqs8s。既然 DNS 處理的仍舊是不包含國(guó)際字符的 Punycode,國(guó)際字符是通過(guò)瀏覽器轉(zhuǎn)換成 Punycode 的,那我們?cè)L問(wèn) http://xn--xkrr14bows.xn--fiqs8s 等同于訪問(wèn) http://新華網(wǎng).中國(guó)。注意,國(guó)際字符命名的域名和轉(zhuǎn)換后的 Punycode 這兩者是一回事兒,是同一個(gè)域名,而新華網(wǎng)的英文域名 http://www.xinhuanet.com 是另一個(gè)注冊(cè)的域名,只不過(guò)這兩個(gè)域名都指向新華網(wǎng)網(wǎng)站服務(wù)器。根據(jù) Punycode 編碼規(guī)則,英文和數(shù)字不變,因此新華網(wǎng)的英文網(wǎng)址經(jīng)過(guò) Punycode 編碼后,仍是它本身。 可能有聰明的朋友會(huì)問(wèn)到,為什么不升級(jí) DNS 服務(wù)器的 DNS 程序,讓它能直接處理不同語(yǔ)言文字的國(guó)際域名呢?其實(shí)這不是一個(gè)技術(shù)問(wèn)題,而是現(xiàn)實(shí)生活中,有太多的域名服務(wù)器,他們都同時(shí)在支持國(guó)際互聯(lián)網(wǎng)這個(gè)超級(jí)大的生產(chǎn)環(huán)境,如果要升級(jí),就得同時(shí)升級(jí)所有的 DNS 服務(wù)器,才能確保直接解析國(guó)際域名的功能可用,如果升級(jí)了一部分,就會(huì)導(dǎo)致新的服務(wù)問(wèn)題。就像是 Windows 操作系統(tǒng)的新版本始終得保留一些對(duì)舊有系統(tǒng)中程序的兼容性。要徹底淘汰一個(gè)東西,可能需要通過(guò)很多版本對(duì)某一功能進(jìn)行演化之后,讓這個(gè)功能與多年前大不同,并且?guī)缀鯖](méi)有人再用多年前的那套東西后,才能淘汰。這樣的例子還有很多,例如雖然現(xiàn)有的 IPv4 地址都已經(jīng)分配完了,沒(méi)有新地址空間了,但是大家都遷移到 IPv6 還需要很長(zhǎng)的時(shí)間,沒(méi)有人能確切地說(shuō),什么時(shí)候才能徹底淘汰 IPv4 的應(yīng)用。因此,發(fā)明 Punycode 并且讓瀏覽器來(lái)講國(guó)際域名轉(zhuǎn)換為 Punycode 是成本低且高度兼容的做法,因此被實(shí)施。 好了,說(shuō)到這里,您應(yīng)該知道了,國(guó)際域名其實(shí)還是轉(zhuǎn)換為了 ASCII 字符中的一些英文字母、數(shù)字和部分符號(hào)。國(guó)際域名的使用同樣需要向域名注冊(cè)機(jī)構(gòu)申請(qǐng)注冊(cè),其實(shí)域名注冊(cè)機(jī)構(gòu)那里和 DNS 系統(tǒng)中保存的不是國(guó)際字符,而是 Punycode。現(xiàn)代瀏覽器大多都支持將國(guó)際字符按照規(guī)則轉(zhuǎn)化為 Punycode 后再發(fā)送給 DNS 服務(wù)器查詢。而域名中的"."點(diǎn)分隔符只是起到分隔符的作用,如果您鍵入的是中文分隔符句號(hào)"。",一樣不影響。如果您可以正常訪問(wèn) http://新華網(wǎng).中國(guó),或者http://新華網(wǎng)。中國(guó),說(shuō)明您的瀏覽器至少是支持將中文轉(zhuǎn)化為 Punycode 的,不妨試試~(網(wǎng)絡(luò)) |