SSL協(xié)議 縮寫 Secure SocketLayer,是一種制定的保證服務(wù)器和客戶端安全通信的一種協(xié)議。最初是由Netscape 在1996年發(fā)布,由于一些安全的原因SSL v1.0和SSL v2.0都沒有公開,直到1996年的SSL v3.0。TLS是SSL v3.0的升級版,目前市面上所有的HTTPS都是用的是TLS,而不是SSL。本文主要分析和講解TLS。
HTTPS(Hyper TextTransfer Protocol over Secure Socket Layer),是一種基于SSL/TLS的HTTP,所有的HTTP數(shù)據(jù)都是在SSL/TLS協(xié)議封裝之上傳輸?shù)摹?/span>HTTPS協(xié)議在HTTP協(xié)議的基礎(chǔ)上,添加了SSL/TLS握手以及數(shù)據(jù)加密傳輸,也屬于應(yīng)用層協(xié)議。所以,研究HTTPS協(xié)議原理,最終其實是研究SSL/TLS協(xié)議。
下面就結(jié)合HTTPS來說明一下TLS
TLS的握手階段是發(fā)生在TCP握手之后。握手實際上是一種協(xié)商的過程,對協(xié)議所必需的一些參數(shù)進行協(xié)商。TLS握手過程分為四步,過程如下:(備注:圖中加方括號的均為可選消息)
Client Hello
由于客戶端(如瀏覽器)對一些加解密算法的支持程度不一樣,但是在TLS協(xié)議傳輸過程中必須使用同一套加解密算法才能保證數(shù)據(jù)能夠正常的加解密。在TLS握手階段,客戶端首先要告知服務(wù)端,自己支持哪些加密算法,所以客戶端需要將本地支持的加密套件(Cipher Suite)的列表傳送給服務(wù)端。除此之外,客戶端還要產(chǎn)生一個隨機數(shù),這個隨機數(shù)一方面需要在客戶端保存,另一方面需要傳送給服務(wù)端,客戶端的隨機數(shù)需要跟服務(wù)端產(chǎn)生的隨機數(shù)結(jié)合起來產(chǎn)生后面要講到的Master Secret。
Server Hello
上圖中,從Server Hello到Server Done,有些服務(wù)端的實現(xiàn)是每條單獨發(fā)送,有服務(wù)端實現(xiàn)是合并到一起發(fā)送。Sever Hello和Server Done都是只有頭沒有內(nèi)容的數(shù)據(jù)。
服務(wù)端在接收到客戶端的ClientHello之后,服務(wù)端需要從中選出一組加密算法與HASH算法,并將自己的身份信息以證書的形式發(fā)回給瀏覽器。證書里面包含了網(wǎng)站地址,加密公鑰,以及證書的頒發(fā)機構(gòu)等信息。這個證書是對于服務(wù)端的一種認(rèn)證。證書是需要申請,并由專門的數(shù)字證書認(rèn)證機構(gòu)(CA)通過非常嚴(yán)格的審核之后頒發(fā)的電子證書。頒發(fā)證書的同時會產(chǎn)生一個私鑰和公鑰。私鑰由服務(wù)端自己保存,不可泄漏。公鑰則是附帶在證書的信息中,可以公開的。證書本身也附帶一個證書電子簽名,這個簽名用來驗證證書的完整性和真實性,可以防止證書被串改。另外,證書還有個有效期。
在服務(wù)端向客戶端發(fā)送的證書中沒有提供足夠的信息的時候,還可以向客戶端發(fā)送一個Server Key Exchange。
此外,對于非常重要的保密數(shù)據(jù),服務(wù)端還需要對客戶端進行驗證,以保證數(shù)據(jù)傳送給了安全的合法的客戶端。服務(wù)端可以向客戶端發(fā)出Cerficate Request消息,要求客戶端發(fā)送證書對客戶端的合法性進行驗證。
跟客戶端一樣,服務(wù)端也需要產(chǎn)生一個隨機數(shù)發(fā)送給客戶端??蛻舳撕头?wù)端都需要使用這兩個隨機數(shù)來產(chǎn)生Master Secret。
最后服務(wù)端會發(fā)送一個ServerHello Done消息給客戶端,表示Server Hello消息結(jié)束了。
Client KeyExchange
如果服務(wù)端需要對客戶端進行驗證,在客戶端收到服務(wù)端的Server Hello消息之后,首先需要向服務(wù)端發(fā)送客戶端的證書,讓服務(wù)端來驗證客戶端的合法性。
在此之前的所有TLS握手信息都是明文傳送的。在收到服務(wù)端的證書等信息之后,客戶端會使用一些加密算法(例如:RSA, Diffie-Hellman)產(chǎn)生一個48個字節(jié)的Key,這個Key叫PreMaster Secret,很多材料上也被稱作PreMaster Key, 最終通過Master secret生成session secret, session secret就是用來對應(yīng)用數(shù)據(jù)進行加解密的。PreMaster secret屬于一個保密的Key,只要截獲PreMaster secret,就可以通過之前明文傳送的隨機數(shù),最終計算出session secret,所以PreMaster secret使用RSA非對稱加密的方式,使用服務(wù)端傳過來的公鑰進行加密,然后傳給服務(wù)端。
Client Certificate 驗證
接著,客戶端需要對接收到的服務(wù)端的證書進行檢查。
a) 驗證證書的合法性(頒發(fā)證書的機構(gòu)是否合法,證書中包含的網(wǎng)站地址是否與正在訪問的地址一致等),如果證書受信任,則瀏覽器欄里面會顯示一個小鎖頭,否則會給出證書不受信的提示。
b) 如果證書受信任,或者是用戶接受了不受信的證書,瀏覽器會生成一串隨機數(shù)的密碼,并用證書中提供的公鑰加密。
c) 使用約定好的HASH計算握手消息,并使用生成的隨機數(shù)對消息進行加密,最后將之前生成的所有信息發(fā)送給網(wǎng)站。
ChangeCipherSpec是一個獨立的協(xié)議,體現(xiàn)在數(shù)據(jù)包中就是一個字節(jié)的數(shù)據(jù),用于告知服務(wù)端,客戶端已經(jīng)切換到之前協(xié)商好的加密套件的狀態(tài),準(zhǔn)備使用之前協(xié)商好的加密套件加密數(shù)據(jù)并傳輸了。
在ChangecipherSpec傳輸完畢之后,客戶端會使用之前協(xié)商好的加密套件和session secret加密一段Finish的數(shù)據(jù)傳送給服務(wù)端,此數(shù)據(jù)是為了在正式傳輸應(yīng)用數(shù)據(jù)之前對剛剛握手建立起來的加解密通道進行驗證。
Server Finish
服務(wù)端在接收到客戶端傳過來的PreMaster加密數(shù)據(jù)之后,使用私鑰對這段加密數(shù)據(jù)進行解密,并對數(shù)據(jù)進行驗證,也會使用跟客戶端同樣的方式生成session secret,一切準(zhǔn)備好之后,會給客戶端發(fā)送一個ChangeCipherSpec,告知客戶端已經(jīng)切換到協(xié)商過的加密套件狀態(tài),準(zhǔn)備使用加密套件和session secret加密數(shù)據(jù)了。之后,服務(wù)端也會使用session secret加密后一段Finish消息發(fā)送給客戶端,以驗證之前通過握手建立起來的加解密通道是否成功。
根據(jù)之前的握手信息,如果客戶端和服務(wù)端都能對Finish信息進行正常加解密且消息正確的被驗證,則說明握手通道已經(jīng)建立成功,接下來,雙方可以使用上面產(chǎn)生的session secret對數(shù)據(jù)進行加密傳輸了。
應(yīng)用數(shù)據(jù)傳輸
這里瀏覽器與網(wǎng)站互相發(fā)送加密的握手消息并驗證,目的是為了保證雙方都獲得了一致的密碼,并且可以正常的加密解密數(shù)據(jù),為后續(xù)真正數(shù)據(jù)的傳輸做一次測試。
在所有的握手階段都完成之后,就可以開始傳送應(yīng)用數(shù)據(jù)了。應(yīng)用數(shù)據(jù)在傳輸之前,首先要附加上MAC secret,然后再對這個數(shù)據(jù)包使用write encryption key進行加密。在服務(wù)端收到密文之后,使用Client write encryption key進行解密,客戶端收到服務(wù)端的數(shù)據(jù)之后使用Serverwrite encryption key進行解密,然后使用各自的write MAC key對數(shù)據(jù)的完整性包括是否被串改進行驗證。
另外,HTTPS一般使用的加密與HASH算法如下:
非對稱加密算法:RSA,DSA/DSS
對稱加密算法:AES,RC4,3DES
HASH算法:MD5,SHA1,SHA256
其中非對稱加密算法用于在握手過程中加密生成的密碼,對稱加密算法用于對真正傳輸?shù)臄?shù)據(jù)進行加密,而HASH算法用于驗證數(shù)據(jù)的完整性。由于瀏覽器生成的密碼是整個數(shù)據(jù)加密的關(guān)鍵,因此在傳輸?shù)臅r候使用了非對稱加密算法對其加密。非對稱加密算法會生成公鑰和私鑰,公鑰只能用于加密數(shù)據(jù),因此可以隨意傳輸,而網(wǎng)站的私鑰用于對數(shù)據(jù)進行解密,所以網(wǎng)站都會非常小心的保管自己的私鑰,防止泄漏。
總結(jié)
講到這里,SSL/TLS的原理,實際上是HTTPS的原理講解完畢。