原理-TLS1.2及之前的版本
協議握手,建立會話
-
客戶端 Hello 消息,攜帶以下信息
- 協議版本,目前有 sslv2,sslv3,tls1.0,tls1.1,tls1.2,tls1.3
- 客戶端產生的隨機數,用於后面生成會話 key
- 客戶端支持加密算法列表,按優先級從高到低排序
-
服務器 Hello 消息,攜帶以下信息
-
ssl 證書
-
服務器選擇的加密算法,根據客戶端發送的加密算法列表,和服務器端支持的加密算法,取交集,取優先級最高的;可能跟具體的軟件實現也有關系
-
服務器端產生的隨機數,用於后面產生會話 key
-
-
客戶端驗證服務器的 ssl 證書
-
協商一些加密算法的參數,比如 橢圓曲線類的加密算法,會協商一些額外的加密相關的參數
-
根據密鑰交換協議和加密算法協議,和服務器端協商出一個 預主密鑰
-
-
生成會話 key
- 從 客戶端隨機數,服務器隨機數,預主密鑰 生成會話 key
-
客戶端和服務器使用 會話 key 通信
密鑰交換協議
- 目前主要的密鑰交換協議,相關的密鑰交換協議又有各自的變體和增強
- RSA
- 靜態的RSA算法,在 TLS1.3 中已經禁止
- DH
- TLS1.3 中全面使用 ECDHE
- PSK
- TLS1.3 新增,用於復用之前的會話 key,減少連接建立時間,但是會缺乏前向安全性
- RSA
- RSA 和 DH 不同的地方,主要是在 如何生成 預主密鑰,參看 https://www.cloudflare.com/zh-cn/learning/ssl/what-happens-in-a-tls-handshake/
加密套件的寫法
- RFC 和 不同的軟件實現,有不同的描述方式,但是實際的 16 進制編碼是一致的
示例參看 https://ciphersuite.info/cs/TLS_PSK_WITH_3DES_EDE_CBC_SHA/ - 加密套件的寫法中,一般主要包括 3 個內容
- 密鑰交換算法,主要用於證書認證,協商加密算法,生成 預主密鑰等
- 又可以細分為
- 密鑰交互算法,如RSA, ECDHE, ECDH, SRP 等
- 證書認證算法,比如 DSA, ECDSA, RSA, PSK 等,DSA 證書在 TLS1.3 中禁用
- 如果不能識別,則使用 openssl ciphers -v 查看,或者上網查詢
- 又可以細分為
- 加密算法,即根據會話 key 加密消息的算法
- 又可細分為
- 加密算法,如 AES-128, AES-256,SEED 等
- 加密模式,如 GCM, CBC, CBC3 等
- 如無法識別,可以使用 openssl ciphers -v 來確認,或者上網查看
- 又可細分為
- 摘要算法,用於對 ssl 會話中的 協議消息,數據消息,計算摘要和簽名,保證信息的完整性
- 密鑰交換算法,主要用於證書認證,協商加密算法,生成 預主密鑰等
- 由於在加密套件的寫法中,對於上述的 3 點沒有明顯的分隔符,因此在解讀不同的加密算法套件,需要自行上網查詢,確認當前加密算法套件中的 密鑰交換算法,加密算法,摘要算法
- 也可以使用 openssl ciphers -v 來查看加密套件,所使用的密鑰交互算法/加密算法/摘要算法
- 使用 curl, haproxy 這些軟件時,要注意,加密算法的參數都是直接傳遞給 ssl 協議實現的后端的
- 目前 linux 上主要使用的 ssl 協議
- openssl, 可以使用 openssl ciphers 查看支持的加密套件
- 目前已知 ubuntu 16.04 上的 haproxy 使用 openssl 編譯
- 加密算法套件的說明,見 man ciphers
- gnutls,可以使用 gnutls-cli -l 查看支持的加密套件
- 目前已知 ubuntu 16.04 上的 curl 使用gnutls 編譯
- openssl, 可以使用 openssl ciphers 查看支持的加密套件
- 在處理 ssl 會話建立失敗時,要注意不同的 ssl 協議實現的區別
- 目前 linux 上主要使用的 ssl 協議