1.客戶端發送Client Hello報文開始SSL通訊。報文包含客戶端支持的SSL的指定版本,加密組件(Cipher Suite)列表(所使用的加密算法及密鑰長度)。
2.服務器可以進行SSL通訊時,會以Server Hello報文作為應答。和客戶端一樣,在報文中包含SSL版本以及加密組件。服務器端加密組件內容是從步驟1接收到客戶端加密組件內篩選出來的。
3.之后服務器發送Certificate報文。報文中包含公開密鑰證書。
4.最后服務器發送Server Hello Done報文通知客戶端,最初階段的SSL握手協商部分結束。
--4a.在客戶端的證書驗證過程為:用數字證書認證機構的公鑰(一般在瀏覽器內置了)對簽名進行解密得到摘要1,使用認證機構同樣的摘要算法對證書源文件計算得到摘要2,比對摘要1和摘要2是否一致即可確認信息是否被篡改。客戶端確認證書有效后就可以從服務器證書取出公開密鑰使用了。
--4b.客戶端隨機生成Pre-master Secret(主要是通過RSA或者Diffie-Hellman算法生成)放入Client Key Exchange報文中。
--4c.使用證書攜帶的公開密鑰對Client Key Exchange報文加密處理。
--4d.用Pre-master secret生成 master secre;還有生成CBC模式的初始向量(CBC模式第一次明文塊做XOR的時候需要用到的初始向量,只要選擇不同的初始向量,相同的密文加密后會形成不同的密文,這是目前應用最廣泛的模式。CBC加密后的密文是上下文相關的,但如果一個分組丟失,后面的分組將全部作廢,即同步錯誤)。
5.SSL第一次握手結束並驗證通過后,客戶端以Client Key Exchange報文作為回應。報文中包含通信加密中使用的一種稱為Pre-master secret的隨機密碼串。該報文已經用步驟3中的公開密鑰進行加密。
--5a.服務器使用Pre-master secret 生成master secret。還有生成CBC模式的初始向量。
Client Hello 和Server Hello階段都會發送各自的Random隨機數給對方,最終都是用來計算Master Secret的。
6.接着客戶端繼續發送Change Cipher Spec報文。該報文會提示服務器,在此報文之后的通信會采用Pre-master secret密鑰加密。
7.客戶端發送Finished報文。該報文包含連接至今全部報文的整體校驗值。這次握手協商是否成功,要以服務器是否能夠正確解密該報文作為判定標准。(已采用Pre-master secret密鑰加密)
8.服務器同樣發送Change Cipher Spec報文。
9.服務器同樣發送Finished報文。
10.服務器和客戶端的Finished報文交換完畢之后,SSL連接建立完成,通信會受到SSL的保護。從此處開始進行應用層協議的通信,即發送HTTP請求。
11.應用層協議通信,即發送HTTP響應。
12.最后由客戶端斷開連接。斷開連接時,發送close notify報文。上圖做了一些省略,這步之后再發送TCP FIN報文來關閉與TCP的通訊。
在以上流程中,應用層發送數據室會附加一種叫MAC的報文摘要。其能夠查知報文是否遭到篡改,從而保護報文的完整性。
參考:
http://kb.cnblogs.com/page/194742/
http://www.jianshu.com/p/b894a7e1c779
https://segmentfault.com/a/1190000002554673
Https SSL/TLS Pre-master Secret到 Master Secret的計算
http://www.linuxidc.com/Linux/2015-07/120230.htm
http://www.enkichen.com/2016/02/26/digital-certificate-based/
還有openssl源碼里的doc/HOWTO