iOS安全之SSL協(xié)議
作用
不使用SSL/TLS的HTTP通信,就是不加密的通信。所有信息明文傳播,帶來(lái)了三大風(fēng)險(xiǎn)。
(1) 竊聽(tīng)風(fēng)險(xiǎn)(eavesdropping):第三方可以獲知通信內(nèi)容。
(2) 篡改風(fēng)險(xiǎn)(tampering):第三方可以修改通信內(nèi)容。
(3) 冒充風(fēng)險(xiǎn)(pretending):第三方可以冒充他人身份參與通信。
SSL/TLS協(xié)議是為了解決這三大風(fēng)險(xiǎn)而設(shè)計(jì)的,希望達(dá)到:
(1) 所有信息都是加密傳播,第三方無(wú)法竊聽(tīng)。
(2) 具有校驗(yàn)機(jī)制,一旦被篡改,通信雙方會(huì)立刻發(fā)現(xiàn)。
(3) 配備身份證書(shū),防止身份被冒充。
互聯(lián)網(wǎng)是開(kāi)放環(huán)境,通信雙方都是未知身份,這為協(xié)議的設(shè)計(jì)帶來(lái)了很大的難度。而且,協(xié)議還必須能夠經(jīng)受所有匪夷所思的攻擊,這使得SSL/TLS協(xié)議變得異常復(fù)雜。
基本的運(yùn)行過(guò)程
SSL/TLS協(xié)議的基本思路是采用公鑰加密法,也就是說(shuō),客戶端先向服務(wù)器端索要公鑰,然后用公鑰加密信息,服務(wù)器收到密文后,用自己的私鑰解密。
這里有兩個(gè)問(wèn)題。
(1)如何保證公鑰不被篡改?
解決方法:將公鑰放在數(shù)字證書(shū)中。只要證書(shū)是可信的,公鑰就是可信的。
(2)公鑰加密計(jì)算量太大,如何減少耗用的時(shí)間?
解決方法:每一次對(duì)話(session),客戶端和服務(wù)器端都生成一個(gè)"對(duì)話密鑰"(session key),用它來(lái)加密信息。由于"對(duì)話密鑰"是對(duì)稱加密,所以運(yùn)算速度非???,而服務(wù)器公鑰只用于加密"對(duì)話密鑰"本身,這樣就減少了加密運(yùn)算的消耗時(shí)間。
因此,SSL/TLS協(xié)議的基本過(guò)程是這樣的:
(1)客戶端向服務(wù)器端索要并驗(yàn)證公鑰。
(2)雙方協(xié)商生成"對(duì)話密鑰"。
(3)雙方采用"對(duì)話密鑰"進(jìn)行加密通信。
上面過(guò)程的前兩步,又稱為"握手階段"(handshake)。
握手階段的詳細(xì)過(guò)程

- 客戶端(通常是瀏覽器)先向服務(wù)器發(fā)出加密通信的請(qǐng)求,這被叫做ClientHello請(qǐng)求。在這一步,客戶端主要向服務(wù)器提供以下信息。
(1) 支持的協(xié)議版本,比如TLS 1.0版。
(2) 一個(gè)客戶端生成的隨機(jī)數(shù),稍后用于生成"對(duì)話密鑰"。
(3) 支持的加密方法,比如RSA公鑰加密。
(4) 支持的壓縮方法。 - 服務(wù)器回應(yīng)(SeverHello)。
服務(wù)器收到客戶端請(qǐng)求后,向客戶端發(fā)出回應(yīng),這叫做SeverHello。服務(wù)器的回應(yīng)包含以下內(nèi)容。
確認(rèn)使用的加密通信協(xié)議版本,比如TLS 1.0版本。如果瀏覽器與服務(wù)器支持的
版本不一致,服務(wù)器關(guān)閉加密通信。
(1) 確認(rèn)使用的加密通信協(xié)議版本,比如TLS 1.0版本。如果瀏覽器與服務(wù)器支持的版本不一致,服務(wù)器關(guān)閉加密通信。
(2)一個(gè)服務(wù)器生成的隨機(jī)數(shù),稍后用于生成"對(duì)話密鑰"。
(3) 確認(rèn)使用的加密方法,比如RSA公鑰加密。
(4)服務(wù)器證書(shū)。 - 客戶端回應(yīng)。
客戶端收到服務(wù)器回應(yīng)以后,首先驗(yàn)證服務(wù)器證書(shū)。如果證書(shū)不是可信機(jī)構(gòu)頒布、或者證書(shū)中的域名與實(shí)際域名不一致、或者證書(shū)已經(jīng)過(guò)期,就會(huì)向訪問(wèn)者顯示一個(gè)警告,由其選擇是否還要繼續(xù)通信。
如果證書(shū)沒(méi)有問(wèn)題,客戶端就會(huì)從證書(shū)中取出服務(wù)器的公鑰。然后,向服務(wù)器發(fā)送下面三項(xiàng)信息。
(1) 一個(gè)隨機(jī)數(shù)。該隨機(jī)數(shù)用服務(wù)器公鑰加密,防止被竊聽(tīng)。
(2) 編碼改變通知,表示隨后的信息都將用雙方商定的加密方法和密鑰發(fā)送。
(3) 客戶端握手結(jié)束通知,表示客戶端的握手階段已經(jīng)結(jié)束。這一項(xiàng)同時(shí)也是前面發(fā)送的所有內(nèi)容的hash值,用來(lái)供服務(wù)器校驗(yàn)。
上面第一項(xiàng)的隨機(jī)數(shù),是整個(gè)握手階段出現(xiàn)的第三個(gè)隨機(jī)數(shù),又稱"pre-master key"。有了它以后,客戶端和服務(wù)器就同時(shí)有了三個(gè)隨機(jī)數(shù),接著雙方就用事先商定的加密方法,各自生成本次會(huì)話所用的同一把"會(huì)話密鑰"。 - 服務(wù)器的最后回應(yīng)。
服務(wù)器收到客戶端的第三個(gè)隨機(jī)數(shù)pre-master key之后,計(jì)算生成本次會(huì)話所用的"會(huì)話密鑰"。然后,向客戶端最后發(fā)送下面信息。
(1) 編碼改變通知,表示隨后的信息都將用雙方商定的加密方法和密鑰發(fā)送。
(2) 服務(wù)器握手結(jié)束通知,表示服務(wù)器的握手階段已經(jīng)結(jié)束。這一項(xiàng)同時(shí)也是前面發(fā)送的所有內(nèi)容的hash值,用來(lái)供客戶端校驗(yàn)。
至此,整個(gè)握手階段全部結(jié)束。接下來(lái),客戶端與服務(wù)器進(jìn)入加密通信,就完全是使用普通的HTTP協(xié)議,只不過(guò)用"會(huì)話密鑰"加密內(nèi)容。