1.基本概念
SSL:(Secure Socket Layer,安全套接字層),位於可靠的面向連接的網絡層協議和應用層協議之間的一種協議層。SSL通過互相認證、使用數字簽名確保完整性、使用加密確保私密性,以實現客戶端和服務器之間的安全通訊。該協議由兩層組成:SSL記錄協議和SSL握手協議。
TLS:(Transport Layer Security,傳輸層安全協議),用於兩個應用程序之間提供保密性和數據完整性。該協議由兩層組成:TLS記錄協議和TLS握手協議。
TLS是在SSL的基礎上標准化的產物,目前SSL3.0與TLS1.0保持一致的,二者是並列關系,只是大家習慣稱呼SSL。注明的web服務nginx默認支持的就是TLS1.0、TLS1.1、TLS1.2協議。
SSL/TLS位於傳輸層和應用層之間,應用層數據不再直接傳遞給傳輸層,而是傳遞給SSL層,SSL層對從應用層收到的數據進行加密,並增加自己的SSL頭。
2.握手過程
可分為5步(使用Diffie – Hellman算法):
第一步,瀏覽器給出協議版本號、一個客戶端生成的隨機數(Client random),以及客戶端支持的加密方法。
第二步,服務器確認雙方使用的加密方法,使用的tls版本號和一個隨機數。
第三部,並給出數字證書、以及一個服務器運行Diffie-Hellman算法生成的參數,比如pubkey。
第四部,瀏覽器獲取服務器發來的pubkey,計算出另一個pubkey,發給服務器。
第五部,服務器發給瀏覽器一個session ticket。
3.使用wireshark抓包
訪問虎撲體育(www.hupu.com),如下圖所示:
用wireshark抓包(ip.addr==116.117.158.100&&ssl),如下圖所示:
第一步:查看序列號2426分組,瀏覽器發送一個“Client Hello”消息,內容包括:支持的協議版本,比如TLS 1.2版,客戶端生成的隨機數(稍后用於生成“會話密鑰”),支持的加密算法(如RSA公鑰加密)。如下圖所示:
上圖中,cipher suites部分詳見http://www.oschina.net/question/234345_47651
第二步:服務器將其SSL版本號、服務器生成的隨機數(稍后用於生成“對話密鑰”),確認使用的加密方法(如RSA公鑰加密)發送給客戶端,如下圖所示:
第三步:Certificate:服務器發一個證書給客戶端,該證書用於向客戶端確認服務器的身份。如果配置服務器的SSL需要驗證服務器的身份,會發送該消息。在這個Certificate包中,還告訴我們服務器和瀏覽器是通過Diffie-Hellman算法來生成最終的密鑰(也就是Session key),如下圖所示:
如上圖所示,TLS記錄層為什么分成兩部分(第一部分包括certificate,第二部分包括server key exchange和server hello done),為什么不寫在一個SSL中?
第四步:瀏覽器收到服務器發來的Certificate包來之后,運行Diffie-Hellman算法生成一個pubkey,然后發送給服務器。通過這一步和上面Certificate兩個步驟,服務器和瀏覽器分別交換了pubkey,這樣他們就可以分別生成了一個一樣的session key,如下圖所示:
session key(會話密鑰),是保證用戶跟其它計算機或者兩台計算機之間安全通信會話而隨機產生的加密和解密密鑰。
第五步:完成上面的步驟,可以說TLS的握手階段已經完成了,但是,服務器還會發送一個Session Ticket給瀏覽器。如下圖所示,這個session ticket包含了這個ticket的生命周期等信息。
這個session ticket包有什么做用呢?
握手階段用來建立TLS連接。如果出於某種原因,對話中斷,就需要重新握手。客戶端只需發送一個服務器在上一次對話中發送過來的session ticket。這個session ticket是加密的,只有服務器才能解密,其中包括本次對話的主要信息,比如對話密鑰和加密方法。當服務器收到session ticket以后,解密后就不必重新生成對話密鑰了。就可以繼續使用上一次的連接了。
附上對session ticket的詳細講解:
http://www.jdon.com/performance/speeding-up-https-with-session-resumption.html
http://www.ruanyifeng.com/blog/2014/09/illustration-ssl.html(第四部分)
第六步:之后,服務器和瀏覽器建立了安全的連接,便可以傳數據了,如下圖所示的application data:
上圖中,從序列號2433就可以看出,在第四步完成之后,就可以傳輸數據了,不需要等到第五步完成。
查看序列號2433的數據包,如下圖所示: