SSL 縮寫 Secure Socket Layer ,是幾十年前網景公司制定的保證服務器和客戶端安全通信的一種協議,大量使用在http的安全通信中,這里的安全通信有兩層含義:
- 通信雙方身份的認證
- 通信數據的保密
簡單說就是首先要對通信兩端的身份進行認證確保是真實的,接下來就是確保通信雙方交換的數據進行加密確保只有真實的對手方才能看到,任何其他的人即便拿到數據也無法獲得有效信息。這里要注意, SSL 并不包含或實現身份認證的方法和數據加密方法, SSL 只是制定了一套可靠的 C-S 之間的協商辦法,來確定通信雙方如何身份認證和加密。現在 SSL 里頭基本使用 PKI 數字證書方式認證,加密的算法很多,對稱非對稱,這些網上資料很多自己 google 之。
SSL 是如何工作的呢?基本上 SSL 的工作分為兩個階段:握手階段和數據傳輸階段,若通信期間檢測到不安全因素,比如握手時候發現另一端無法支持選擇的協議或加密算法,或者發現數據被篡改,這時通信一方會發送警告消息,不安全因素影響比較大兩端之間的通信就會終止,必須重新協商建立連接。
SSL 協議結構如下:
通過 SSL 分成三個子協議, HandShake( 握手) ChangeCipherSpec( 更改密鑰規格 ), Alert( 告警 ) 。
SSL 的告警協議是用來為通信對方發送一條告警消息,告警分為兩個層次: fatal 和 warning, 如果是 fatal 級別的如 mac 計算出錯或協商密鑰算法失敗則馬上斷開連接,要建立連接的話需要重新握手; warning 類型的消息一般只會記錄日志,并不會斷開連接。
SSL 更換密鑰規格 (change cipher spec) 協議獨立于握手協議,單獨屬于一類,也是其中最簡單的一個。協議由單個消息組成 , 該消息只包含一個值為 1 的單個字節。該消息由客戶端和服務器端各自發出用來通知對方,從這個消息以后要開始使用之前協商好的密鑰套件了,這個消息一般是在握手到發出 Finish 消息之前發出。
SSL 握手協議主要負責如下工作:
- 算法協商:首次通信時,雙方通過握手協議協商密鑰加密算法,數據加密算法和文摘算法。
- 身份驗證:在密鑰協商完成后,客戶端與服務器端通過證書互相驗證對方的身份。
- 確定密鑰:最后使用協商好的密鑰交換算法產生一個只有雙方知道的秘密信息,客戶端和服務器各自根據這個秘密信息計算出加密密鑰,在接下來的記錄協議中用來對應用數據進行加密;
如果說握手協議是 C/S 雙方的協商的話記錄協議就是利用協商結果對上層應用提供兩種服務:
- 機密性:使用協商好的通信密鑰對業務數據加解密;
- 數據完整性:利用協商好的 MAC 算法計算消息 HASH ,防止消息被篡改;
協議規定每個記錄層的協議數據包長度不能超過 2^14(16K) ,因此記錄協議接收到層應用業務數據若超長會將業務數據分塊,壓縮 ( 可選 ) ,計算 MAC ,加密,按上記錄層協議頭發出去。