1.基本概念
SSL:(Secure Socket Layer,安全套接字層),位於可靠的面向鏈接的網絡層協議和應用層協議之間的一種協議層。SSL經過互相認證、使用數字簽名確保完整性、使用加密確保私密性,以實現客戶端和服務器之間的安全通信。該協議由兩層組成:SSL記錄協議和SSL握手協議。html
TLS:(Transport Layer Security,傳輸層安全協議),用於兩個應用程序之間提供保密性和數據完整性。該協議由兩層組成:TLS記錄協議和TLS握手協議。nginx
TLS是在SSL的基礎上標準化的產物,目前SSL3.0與TLS1.0保持一致的,兩者是並列關係,只是你們習慣稱呼SSL。註明的web服務nginx默認支持的就是TLS1.0、TLS1.一、TLS1.2協議。web
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_47651session
第二步:服務器將其SSL版本號、服務器生成的隨機數(稍後用於生成「對話密鑰」),確認使用的加密方法(如RSA公鑰加密)發送給客戶端,以下圖所示:
app
第三步: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的數據包,以下圖所示: