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