HTTPS協(xié)議應(yīng)運(yùn)而生 解讀其背后的加密算法

早年,HTTP協(xié)議傳輸?shù)臄?shù)據(jù)都是未加密的,也就是明文的,因此使用HTTP協(xié)議傳輸隱私信息非常不安全。為了保證這些隱私數(shù)據(jù)能加密傳輸,對(duì)HTTP協(xié)議傳輸?shù)臄?shù)據(jù)進(jìn)行加密,從而就誕生了HTTPS。通過(guò)HTTPS加密協(xié)議登錄安全界面的數(shù)據(jù)占全網(wǎng)的70%,明顯超越HTTP明文協(xié)議,這無(wú)疑是全網(wǎng)實(shí)行HTTPS安全加密協(xié)議的里程碑。

當(dāng)你在瀏覽器的地址欄上輸入https開(kāi)頭的網(wǎng)址后,瀏覽器和服務(wù)器之間會(huì)在接下來(lái)的幾百毫秒內(nèi)進(jìn)行大量的通信。這些復(fù)雜的步驟的第一步,就是瀏覽器與服務(wù)器之間協(xié)商一個(gè)在后續(xù)通信中使用的密鑰算法。這個(gè)過(guò)程簡(jiǎn)單來(lái)說(shuō)是這樣的:

1. 瀏覽器把自身支持的一系列Cipher Suite(密鑰算法套件,后文簡(jiǎn)稱(chēng)Cipher)[C1,C2,C3, …]發(fā)給服務(wù)器;

2. 服務(wù)器接收到瀏覽器的所有Cipher后,與自己支持的套件作對(duì)比,如果找到雙方都支持的Cipher,則告知瀏覽器;

3. 瀏覽器與服務(wù)器使用匹配的Cipher進(jìn)行后續(xù)通信。如果服務(wù)器沒(méi)有找到匹配的算法,瀏覽器(以Firefox 30為例,后續(xù)例子中使用的瀏覽器均為此版本的Firefox)將給出錯(cuò)誤信息:

HTTPS協(xié)議應(yīng)運(yùn)而生 解讀其背后的加密算法

本文將講述如何探究這一過(guò)程。

1. 瀏覽器

瀏覽器支持哪些Cipher?這取決于瀏覽器支持的SSL/TLS協(xié)議的版本。習(xí)慣上,我們通常把HTTPS與SSL協(xié)議放到一起;事實(shí)上,SSL協(xié)議是Netcape公司于上世紀(jì)90年代中期提出的協(xié)議,自身發(fā)展到3.0版本。1999年該協(xié)議由ITEL接管,進(jìn)行了標(biāo)準(zhǔn)化,改名為T(mén)LS??梢哉f(shuō),TLS 1.0就是SSL 3.1版本。在Wikipedia上并沒(méi)有SSL獨(dú)立的條目,而是會(huì)重定向到TLS,可見(jiàn)兩種協(xié)議關(guān)系之緊密。

目前TLS最新版本是1.2?;ヂ?lián)網(wǎng)上有超過(guò)99%的網(wǎng)站支持TLS 1.0,而支持TLS 1.2的網(wǎng)站尚不足40%。打開(kāi)Firefox瀏覽器,在地址欄中輸入about:config,然后搜索tls.version,會(huì)看到下面的選項(xiàng):

HTTPS協(xié)議應(yīng)運(yùn)而生 解讀其背后的加密算法

其中security.tls.version.min和security.tls.version.max兩項(xiàng)決定了Firefox支持的SSL/TLS版本,根據(jù)Firefox文檔的介紹,這兩項(xiàng)的可選值及其代表的協(xié)議是:

? 0 – SSL 3.0

? 1 – TLS 1.0

? 2 – TLS 1.1

? 3 – TLS 1.2

因此上圖的設(shè)置說(shuō)明當(dāng)前瀏覽器支持協(xié)議的下限是SSL 3.0,上限是TLS 1.2?,F(xiàn)在,如果把security.tls.version.min一項(xiàng)改為3,那么瀏覽器就只支持TLS 1.2了。前文提到,目前只有不足40%的網(wǎng)站支持TLS 1.2,比如Amazon就不在這40%之列,所以此時(shí)訪問(wèn)https://amazon.com,就會(huì)收到“Secure Connection Failed”的錯(cuò)誤信息。

了解了SSL/TLS協(xié)議后,可以使用Wireshark(或類(lèi)似的可以抓去網(wǎng)絡(luò)包的工具)通過(guò)分析網(wǎng)絡(luò)包的信息,來(lái)查看瀏覽器發(fā)送給服務(wù)器的所有Cipher。Wireshark是一款使用簡(jiǎn)單卻非常強(qiáng)大的抓包工具。

瀏覽器會(huì)首先發(fā)起握手協(xié)議,既一個(gè)“ClientHello”消息,在消息體中,可以找到Firefox支持的Cipher。在Wireshark中,按照Protocol協(xié)議排序,然后從TLS 1.2協(xié)議的報(bào)文中找到一個(gè)Info為“Client Hello”的。選中這個(gè),然后在下面的報(bào)文信息窗口中依次找到Secure Sockets Layer -> TLSv1.2 Record Layer -> Handshake Protocal -> Cipher Suites。例子中的第一個(gè)Cipher是TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,一共有23個(gè):

HTTPS協(xié)議應(yīng)運(yùn)而生 解讀其背后的加密算法

如果繼續(xù)找一個(gè)Info為“ServerHello”的報(bào)文,可以在類(lèi)似的位置找到服務(wù)器返回的Cipher,在本例中是TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA:

HTTPS協(xié)議應(yīng)運(yùn)而生 解讀其背后的加密算法

關(guān)于密鑰算法這一長(zhǎng)串名字的含義,后面說(shuō)明。接下來(lái),瀏覽器就要等待服務(wù)器響應(yīng)它的請(qǐng)求。我們來(lái)看一看服務(wù)器端都做了些什么。

2. 服務(wù)器

讓我們以Windows為例。若要查看操作系統(tǒng)支持哪些密鑰算法,可以運(yùn)行g(shù)pedit.msc,依次進(jìn)入”Computer Configuration” -> ”Administrative Templates” -> “Network” -> “SSL Configuration Settings”,這時(shí)可以在窗口右邊看到”SSL Cipher Suite Order”項(xiàng):

HTTPS協(xié)議應(yīng)運(yùn)而生 解讀其背后的加密算法

點(diǎn)擊該項(xiàng)后進(jìn)入”SSL Cipher Suite Order”。這里可以看到操作系統(tǒng)支持的Cipher的集合,以及對(duì)不同Cipher的排序。

HTTPS協(xié)議應(yīng)運(yùn)而生 解讀其背后的加密算法

如果需要調(diào)整這里排序,或者去掉一些弱的Cipher,可以點(diǎn)擊左上角的“Enabled”,然后在“Options”中重寫(xiě)編輯Cipher的列表。如果喜歡命令行,可以通過(guò)下面的Powershell命令修改密鑰算法套件:Set-ItemProperty -path HKLM:\SOFTWARE\Policies\Microsoft\Cryptography\Configuration\SSL\0001002 -name Functions -value "XXX,XXX,XXX"

那么Cipher的這一長(zhǎng)串名字是什么含義呢?其實(shí),每種Cipher的名字里包含了四部分信息,分別是

? 密鑰交換算法,用于決定客戶(hù)端與服務(wù)器之間在握手的過(guò)程中如何認(rèn)證,用到的算法包括RSA,Diffie-Hellman,ECDH,PSK等

? 加密算法,用于加密消息流,該名稱(chēng)后通常會(huì)帶有兩個(gè)數(shù)字,分別表示密鑰的長(zhǎng)度和初始向量的長(zhǎng)度,比如DES 56/56, RC2 56/128, RC4 128/128, AES 128/128, AES 256/256

? 報(bào)文認(rèn)證信息碼(MAC)算法,用于創(chuàng)建報(bào)文摘要,確保消息的完整性(沒(méi)有被篡改),算法包括MD5,SHA等。

? PRF(偽隨機(jī)數(shù)函數(shù)),用于生成“master secret”。

完全搞懂上面的內(nèi)容似乎還需要一本書(shū)的介紹(我已經(jīng)力不從心了)。不過(guò)大致了解一下,有助于理解Cipher的名字,比如前面服務(wù)器發(fā)回給客戶(hù)端的Cipher,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA

從其名字可知,它是

? 基于TLS協(xié)議的;

? 使用ECDHE、RSA作為密鑰交換算法;

? 加密算法是AES(密鑰和初始向量的長(zhǎng)度都是256);

? MAC算法(這里就是哈希算法)是SHA。

熟悉了Cipher名字背后的含義后,讓我們看看像IIS這樣的Web服務(wù)器如何選擇一個(gè)密鑰算法呢?假如瀏覽器發(fā)來(lái)的密鑰算法套件為[C1, C2, C3],而Windows Server支持的套件為[C4, C2, C1, C3]時(shí),C1和C2都是同時(shí)被雙方支持的算法,IIS是優(yōu)先返回C1,還是C2呢?答案是C2。IIS會(huì)遍歷服務(wù)器的密鑰算法套件,取出第一個(gè)C4,發(fā)現(xiàn)瀏覽器并不支持;接下來(lái)取第二個(gè)C2,這個(gè)被瀏覽器支持!于是,IIS選擇了C2算法,并將它包含在一個(gè)“ServerHello”握手協(xié)議中,發(fā)回給客戶(hù)端。這就有了結(jié)果。

3. 選擇

作為瀏覽器的使用者,你可以讓瀏覽器只能訪問(wèn)支持TLS 1.2協(xié)議的站點(diǎn),以獲得更好的安全性,以及更差的體驗(yàn)。作為服務(wù)器的維護(hù)者,似乎將最強(qiáng)壯的Cipher排在前面是正確的選擇。就在前不久,我們開(kāi)發(fā)的一個(gè)Web報(bào)稅系統(tǒng)在一次由第三方進(jìn)行的安全檢查中,被報(bào)出的問(wèn)題之一就是服務(wù)器默認(rèn)的Cipher太弱(RC4-based),于是我們使用了AES-based的Cipher,但是密鑰長(zhǎng)度只是選擇了128,而不是256,背后的擔(dān)憂主要來(lái)自于性能——加密與解密是CPU密集型操作,我們擔(dān)心到報(bào)稅忙季時(shí),過(guò)強(qiáng)的Cipher會(huì)帶來(lái)性能問(wèn)題。