本周,CloudFlare宣布,開始提供Keyless服務(wù),即你把網(wǎng)站放到它們的CDN上,不用提供自己的私鑰,也能使用SSL加密鏈接。 我看了CloudFlare的說明(這里和這里),突然意識到這是絕好的例子,可以用來說明SSL/TLS協(xié)議的運(yùn)行機(jī)制。它配有插圖,很容易看懂。 下面,我就用這些圖片作為例子,配合我半年前寫的《SSL/TLS協(xié)議運(yùn)行機(jī)制的概述》,來解釋SSL協(xié)議。 一、SSL協(xié)議的握手過程開始加密通信之前,客戶端和服務(wù)器首先必須建立連接和交換參數(shù),這個(gè)過程叫做握手(handshake)。 假定客戶端叫做愛麗絲,服務(wù)器叫做鮑勃,整個(gè)握手過程可以用下圖說明(點(diǎn)擊看大圖)。 ![]() 握手階段分成五步。
上面的五步,畫成一張圖,就是下面這樣。 ![]() 二、私鑰的作用握手階段有三點(diǎn)需要注意。
從上面第二點(diǎn)可知,整個(gè)對話過程中(握手階段和其后的對話),服務(wù)器的公鑰和私鑰只需要用到一次。這就是CloudFlare能夠提供Keyless服務(wù)的根本原因。 某些客戶(比如銀行)想要使用外部CDN,加快自家網(wǎng)站的訪問速度,但是出于安全考慮,不能把私鑰交給CDN服務(wù)商。這時(shí),完全可以把私鑰留在自家服務(wù)器,只用來解密對話密鑰,其他步驟都讓CDN服務(wù)商去完成。 ![]() 上圖中,銀行的服務(wù)器只參與第四步,后面的對話都不再會用到私鑰了。 三、DH算法的握手階段整個(gè)握手階段都不加密(也沒法加密),都是明文的。因此,如果有人竊聽通信,他可以知道雙方選擇的加密方法,以及三個(gè)隨機(jī)數(shù)中的兩個(gè)。整個(gè)通話的安全,只取決于第三個(gè)隨機(jī)數(shù)(Premaster secret)能不能被破解。 雖然理論上,只要服務(wù)器的公鑰足夠長(比如2048位),那么Premaster secret可以保證不被破解。但是為了足夠安全,我們可以考慮把握手階段的算法從默認(rèn)的RSA算法,改為 Diffie-Hellman算法(簡稱DH算法)。 采用DH算法后,Premaster secret不需要傳遞,雙方只要交換各自的參數(shù),就可以算出這個(gè)隨機(jī)數(shù)。 ![]() 上圖中,第三步和第四步由傳遞Premaster secret變成了傳遞DH算法所需的參數(shù),然后雙方各自算出Premaster secret。這樣就提高了安全性。 四、session的恢復(fù)握手階段用來建立SSL連接。如果出于某種原因,對話中斷,就需要重新握手。 這時(shí)有兩種方法可以恢復(fù)原來的session:一種叫做session ID,另一種叫做session ticket。 session ID的思想很簡單,就是每一次對話都有一個(gè)編號(session ID)。如果對話中斷,下次重連的時(shí)候,只要客戶端給出這個(gè)編號,且服務(wù)器有這個(gè)編號的記錄,雙方就可以重新使用已有的"對話密鑰",而不必重新生成一把。 ![]() 上圖中,客戶端給出session ID,服務(wù)器確認(rèn)該編號存在,雙方就不再進(jìn)行握手階段剩余的步驟,而直接用已有的對話密鑰進(jìn)行加密通信。 session ID是目前所有瀏覽器都支持的方法,但是它的缺點(diǎn)在于session ID往往只保留在一臺服務(wù)器上。所以,如果客戶端的請求發(fā)到另一臺服務(wù)器,就無法恢復(fù)對話。session ticket就是為了解決這個(gè)問題而誕生的,目前只有Firefox和Chrome瀏覽器支持。 ![]() 上圖中,客戶端不再發(fā)送session ID,而是發(fā)送一個(gè)服務(wù)器在上一次對話中發(fā)送過來的session ticket。這個(gè)session ticket是加密的,只有服務(wù)器才能解密,其中包括本次對話的主要信息,比如對話密鑰和加密方法。當(dāng)服務(wù)器收到session ticket以后,解密后就不必重新生成對話密鑰了。 (完) |
|