原文:http://www.cpplive.com/html/1387.html
普通的TCP通訊無法保證資料的安全,它隨時可能被第三方截獲而泄漏通訊雙方之間的隱私,這顯然是我們不希望看到的,尤其在跟使用者名稱、密碼、個人資訊息息相關的通訊過程(如網上銀行交易、機密檔案傳輸等等)尤其看重資料互動的隱秘性,所以我們常常用SSL協議來建立安全保密的通訊,SSL協議能夠保證互動雙方的資料按密文方式傳輸,第三方在沒有私密金鑰的情況下幾乎無法破解,從而到達保密的目的。究竟SSL是如何互動資料來確保安全的,很多人卻不得而知,為瞭解答大家的疑惑,這裡詳細介紹一下SSL的互動過程。
1、建立TCP串連
由於SSL協議依賴於TCP串連實施,所以在SSL互動之前需要先建立TCP串連。用戶端connect服務端,服務端acccept用戶端,經曆三向交握以後TCP串連建立。
2、用戶端發送SSL請求
用戶端(Client)向服務端(Server)發送自身使用的SSL版本(SSL一共有三個版本)、密碼編譯演算法的相關配置、隨機資料以及其在在SSL協議中需要用到的資訊。
3、服務端處理SSL請求
伺服器(Server)反饋給用戶端(Client)自己的SSL版本、密碼編譯演算法的相關配置、隨機資料以及用自己的私人祕密金鑰加密的SERVER-HELLO資訊。服務端(Server)緊接著將自己的認證(包含公用密鑰)傳遞過去。同時有個可選項目,即服務端(Server)可以要求客服端(Client)發送自己的認證。
4、用戶端驗證服務端身份
客服端(Client)用服務端(Server)傳遞過來認證驗證服務端(Server)的身份,如果身份未驗證通過則結束本次通訊。認證驗證通過後利用服務端(Server)的公用密鑰嘗試解開被其用私人祕密金鑰加密過的SERVER-HELLO資訊,如果解開失敗,說明該SERVER-HELLO必然是假的,故結束本次通訊。
5、用戶端發送公用祕密金鑰加密過的隨機資料
用戶端端(Client)產生隨機資料(sharedsecret),並且把這個隨機資料用服務端(Server)發送過來的的公用祕密金鑰加密,此次加密過程產生本次握手中的premastersecret(這個步驟是有可能有服務端的參與的,具體情況由他們使用的密碼編譯演算法決定),然後將它(premastersecret)送回給服務端(Server)。如果服務端(Server)要求需要驗證用戶端(Client),那麼客服端(Client)也需要自己把自己的認證(包含公用密鑰)傳遞過去,同時送一些自己簽過名(私人祕密金鑰加密)的資料過去。
6、服務端用私人密鑰解密加密後的隨機資料並協商暗號
Server驗證完client的身份之後,然後用自己的私人密鑰解密得到premastersecret然後雙方利用這個premastersecret來共同協商,得到mastersecret(可理解為premastersecret為雙方協商的暗號,然後使用這個暗號再協商一個mastersecret用來產生真正的工作階段金鑰用來傳輸資料)以此來保證資料的決對安全。
7、服務端跟用戶端利用暗號產生密碼編譯演算法跟密鑰key
雙方用mastersecret一起產生真正的sessionkey,這將是一個對稱式加密的key。這個key還可以用來驗證資料完整性。雙方再交換結束資訊。握手結束。
接下來雙方就可以用協商好的演算法和密鑰key,採用對稱式加密演算法來通訊了。