互聯(lián)網(wǎng)的通信安全,建立在SSL/TLS協(xié)議之上。 本文簡要介紹SSL/TLS協(xié)議的運(yùn)行機(jī)制。文章的重點(diǎn)是設(shè)計(jì)思想和運(yùn)行過程,不涉及具體的實(shí)現(xiàn)細(xì)節(jié)。如果想了解這方面的內(nèi)容,請參閱RFC文檔。 一、作用 不使用SSL/TLS的HTTP通信,就是不加密的通信。所有信息明文傳播,帶來了三大風(fēng)險(xiǎn)。
SSL/TLS協(xié)議是為了解決這三大風(fēng)險(xiǎn)而設(shè)計(jì)的,希望達(dá)到:
互聯(lián)網(wǎng)是開放環(huán)境,通信雙方都是未知身份,這為協(xié)議的設(shè)計(jì)帶來了很大的難度。而且,協(xié)議還必須能夠經(jīng)受所有匪夷所思的攻擊,這使得SSL/TLS協(xié)議變得異常復(fù)雜。 二、歷史 互聯(lián)網(wǎng)加密通信協(xié)議的歷史,幾乎與互聯(lián)網(wǎng)一樣長。
目前,應(yīng)用最廣泛的是TLS 1.0,接下來是SSL 3.0。但是,主流瀏覽器都已經(jīng)實(shí)現(xiàn)了TLS 1.2的支持。 TLS 1.0通常被標(biāo)示為SSL 3.1,TLS 1.1為SSL 3.2,TLS 1.2為SSL 3.3。 三、基本的運(yùn)行過程 SSL/TLS協(xié)議的基本思路是采用公鑰加密法,也就是說,客戶端先向服務(wù)器端索要公鑰,然后用公鑰加密信息,服務(wù)器收到密文后,用自己的私鑰解密。 但是,這里有兩個(gè)問題。 (1)如何保證公鑰不被篡改?
(2)公鑰加密計(jì)算量太大,如何減少耗用的時(shí)間?
因此,SSL/TLS協(xié)議的基本過程是這樣的:
上面過程的前兩步,又稱為"握手階段"(handshake)。 四、握手階段的詳細(xì)過程 "握手階段"涉及四次通信,我們一個(gè)個(gè)來看。需要注意的是,"握手階段"的所有通信都是明文的。 4.1 客戶端發(fā)出請求(ClientHello) 首先,客戶端(通常是瀏覽器)先向服務(wù)器發(fā)出加密通信的請求,這被叫做ClientHello請求。 在這一步,客戶端主要向服務(wù)器提供以下信息。
這里需要注意的是,客戶端發(fā)送的信息之中不包括服務(wù)器的域名。也就是說,理論上服務(wù)器只能包含一個(gè)網(wǎng)站,否則會分不清應(yīng)該向客戶端提供哪一個(gè)網(wǎng)站的數(shù)字證書。這就是為什么通常一臺服務(wù)器只能有一張數(shù)字證書的原因。 對于虛擬主機(jī)的用戶來說,這當(dāng)然很不方便。2006年,TLS協(xié)議加入了一個(gè)Server Name Indication擴(kuò)展,允許客戶端向服務(wù)器提供它所請求的域名。 4.2 服務(wù)器回應(yīng)(SeverHello) 服務(wù)器收到客戶端請求后,向客戶端發(fā)出回應(yīng),這叫做SeverHello。服務(wù)器的回應(yīng)包含以下內(nèi)容。
除了上面這些信息,如果服務(wù)器需要確認(rèn)客戶端的身份,就會再包含一項(xiàng)請求,要求客戶端提供"客戶端證書"。比如,金融機(jī)構(gòu)往往只允許認(rèn)證客戶連入自己的網(wǎng)絡(luò),就會向正式客戶提供USB密鑰,里面就包含了一張客戶端證書。 4.3 客戶端回應(yīng) 客戶端收到服務(wù)器回應(yīng)以后,首先驗(yàn)證服務(wù)器證書。如果證書不是可信機(jī)構(gòu)頒布、或者證書中的域名與實(shí)際域名不一致、或者證書已經(jīng)過期,就會向訪問者顯示一個(gè)警告,由其選擇是否還要繼續(xù)通信。 如果證書沒有問題,客戶端就會從證書中取出服務(wù)器的公鑰。然后,向服務(wù)器發(fā)送下面三項(xiàng)信息。
上面第一項(xiàng)的隨機(jī)數(shù),是整個(gè)握手階段出現(xiàn)的第三個(gè)隨機(jī)數(shù),又稱"pre-master key"。有了它以后,客戶端和服務(wù)器就同時(shí)有了三個(gè)隨機(jī)數(shù),接著雙方就用事先商定的加密方法,各自生成本次會話所用的同一把"會話密鑰"。 至于為什么一定要用三個(gè)隨機(jī)數(shù),來生成"會話密鑰",dog250解釋得很好:
此外,如果前一步,服務(wù)器要求客戶端證書,客戶端會在這一步發(fā)送證書及相關(guān)信息。 4.4 服務(wù)器的最后回應(yīng) 服務(wù)器收到客戶端的第三個(gè)隨機(jī)數(shù)pre-master key之后,計(jì)算生成本次會話所用的"會話密鑰"。然后,向客戶端最后發(fā)送下面信息。
至此,整個(gè)握手階段全部結(jié)束。接下來,客戶端與服務(wù)器進(jìn)入加密通信,就完全是使用普通的HTTP協(xié)議,只不過用"會話密鑰"加密內(nèi)容。 五、參考鏈接
(完) |
|