HTTPS連接建立過程(單向&雙向)
什么是https
SSL(Secure Sockets Layer 安全套接字協議),及其繼任者傳輸層安全(Transport Layer Security,TLS)是為網絡通信提供安全及數據完整性的一種安全協議。TLS與SSL在傳輸層(如TCP)與應用層(如HTTP)之間對網絡連接進行加密。
HTTPS (全稱:Hyper Text Transfer Protocol over SecureSocket Layer),是以安全為目標的 HTTP 通道,在HTTP的基礎上通過傳輸加密和身份認證保證了傳輸過程的安全性 。HTTPS 在HTTP 的基礎下加入SSL 層
- https的基礎是TLS,tls的基本原理是非對稱加密,即加密的密鑰和解密的密鑰是不用的,稱為公鑰和私鑰,使用公鑰加密的內容只能使用私鑰解密,反之亦然,使用私鑰並不能解密私鑰加密的內容
- https連接建立過程分為兩部分
- 身份驗證部分(驗證通信雙方各自的身份)
- 密鑰協商部分(協商出一個雙方都認可的對稱密鑰)
- https的重點如下
- 客戶端及服務器的有效性及真實性,確保沒有第三方監聽,通過CA機構及非對稱加密保證
- tls握手及密鑰協商過程使用非對稱加密,加強身份驗證及防監聽
- 由於非對稱加密的性能極差,所以僅在握手階段使用非對稱加密
- 后續消息通過協商的密鑰進行加密,防篡改和防監聽
TCP連接建立流程
HTTPS單向認證
什么是HTTPS單向認證
- https單向認證至客戶端連接到某個域名或IP時,客戶端需要驗證服務器的身份,
服務器的身份一般通過證書的方式進行驗證,服務器的證書一般都會在權威的CA機構進行簽名,客戶端收到服務器證書后,
會獲取服務器證書對應的ca機構的證書,並用CA證書進行解密
身份認證過程
- 一般使用非對稱加密算法做身份認證
- RSA
- DSA
- ECDSA
密鑰協商過程
- 有多種算法
- RSA 通過非對稱加密保證安全性
- DH類算法 通過 "求解離散對數問題" 保證安全性 只能防監聽,不能防篡改,所以一般會結合非對稱加密算法(RSA,DSA,ECDSA)等做加密
- ECDH類算法 通過 "橢圓曲線離散對數問題" 保證安全性 同上
- DHE DH算法增強 E->ephemeral 指“臨時密鑰”(洋文是“ephemeral key”)即每個會話都選擇新的密鑰
- ECDHE ECDH算法增強 同上
- PSK 預共享密鑰(一般用於內部部署,預置密鑰在系統內部)
- SRP Secure Remote Password,與psk類似,密鑰換成了密碼,還會有一些類似於加鹽,隨機數之類的機制
連接流程
- ECDHE-RSA的連接及認證過程
身份認證
-
Client Hello 發送客戶端支持的加密協議 及TLS版本 客戶端隨機數
- sessionId和sessionTicket均可用於https會話恢復,區別在與sessionId對應的協商信息保存在服務器中,sessionTicket對應的協商信息保存在客戶端中
- 客戶端extension中攜帶session ticket信息表示客戶端支持session ticket
- 關於擴展字段 pre_shared_key 和psk_key_exchange_modes,可以參考http://ddrv.cn/a/17072
- 本例中客戶端不傳遞pre_shared_key指明客戶端不使用PSK(預共享密鑰模式,一般用在個人網絡里面)
-
Sever Hello 發送服務器選擇的加密協議及選擇的TLS版本,服務器隨機數
- 本例中使用的是ECDHE-RSA算法
- 本例中使用的是ECDHE-RSA算法
-
Certificate 服務器發送自己的證書
密鑰協商
-
Server Key Exchange 服務器發送協商對稱密鑰過程中的必要參數
- DH類算法因為沒有使用私鑰進行計算,所以在末尾會使用私鑰對報文本身進行簽名,證明自己擁有私鑰
- DH類算法因為沒有使用私鑰進行計算,所以在末尾會使用私鑰對報文本身進行簽名,證明自己擁有私鑰
-
Server Hello Done
- 指示 Server Hello完成
-
Client Key Exchange 客戶端發送協商密鑰過程中的必要參數(使用服務端證書中的公鑰加密)
- 客戶端收到服務器發送的必要參數,並使用自己的必要參數,計算出一個對稱密鑰
- 客戶端必要參數發送給服務端后,服務端也能通過這些參數以及第5部中的參數計算出一樣的對稱密鑰
-
Client change Cipher Spec
- 更改數據傳輸密鑰通知,表示后續的請求都會使用協商好的對稱密鑰進行加密
-
Encrypted Handshake Message
- 使用對稱密鑰加密過后的握手消息,用來驗證對稱密鑰是否工作
-
New Session Ticket
- 由於之前Client Hello及Server Hello都指明了可以使用Session Ticket,所以服務器下發了一個新的Session Ticket,下次客戶端需要恢復回話時,可以省去協商密鑰的過程
-
Server change Cipher Spec
- 更改數據傳輸密鑰通知,表示后續的請求都會使用協商好的對稱密鑰進行加密
-
Encrypted Handshake Message
- 使用對稱密鑰加密過后的握手消息,用來驗證對稱密鑰是否工作
HTTPS雙向認證
https雙向認證指除了客戶端需要驗證服務器之外,服務器也需要驗證客戶端
連接流程
- 步驟詳解
- 雙向認證過程中的大部分步驟是相同的,只是多了服務器請求客戶端證書以及客戶端發送證書及簽名的過程
- 這里僅解釋不同的部分
- Server Certificate Request
- 服務器請求客戶端證書用於驗證客戶端身份
- Client Certificate
- 客戶端發送自己的證書或證書鏈
- Client Certificate Verify
- 與server key exchange一樣,為了證明自己的身份,客戶端需要使用私鑰對之前的握手信息加密
- 服務器使用客戶端證書公鑰解密,如果一致的話才會通過驗證
nginx中的配置
ssl_certificate /etc/nginx/cert2/server.crt; #服務器證書位置
ssl_certificate_key /etc/nginx/cert2/server.private;#服務器證書私鑰文件位置
ssl_client_certificate /etc/nginx/cert2/ca.crt;#用於客戶端證書校驗的證書文件位置,意為客戶端證書必須由此證書對應的ca機構簽發
ssl_verify_client on;#是否開啟客戶端校驗
ssl_verify_depth 2;#客戶端校驗深度,如果為1的話,代表客戶端證書必須由頂級ca簽發
附錄
算法組合 | 密鑰交換 | 身份認證 | 是否會遭遇中間人攻擊 | 是否具備前向保密 | SSL 2.0 | SSL 3.0 | TLS 1.0 | TLS 1.1 | TLS 1.2 | TLS 1.3(草案) |
---|---|---|---|---|---|---|---|---|---|---|
RSA | RSA | RSA | 否 | 否 | 是 | 是 | 是 | 是 | 是 | 否 |
DH-RSA | DH | RSA | 否 | 否 | 否 | 是 | 是 | 是 | 是 | 否 |
DH-DSA | DH | DSA | 否 | 否 | 否 | 是 | 是 | 是 | 是 | 否 |
DHE-RSA | DHE | RSA | 否 | 是 | 否 | 是 | 是 | 是 | 是 | 是 |
DHE-DSA | DHE | DSA | 否 | 是 | 否 | 是 | 是 | 是 | 是 | 是 |
ECDH-RSA | ECDH | RSA | 否 | 否 | 否 | 否 | 是 | 是 | 是 | 否 |
ECDH-ECDSA | ECDH | ECDSA | 否 | 否 | 否 | 否 | 是 | 是 | 是 | 否 |
ECDHE-RSA | DHE | RSA | 否 | 是 | 否 | 否 | 是 | 是 | 是 | 是 |
ECDHE-ECDSA | DHE | ECDSA | 否 | 是 | 否 | 否 | 是 | 是 | 是 | 是 |
PSK | PSK | PSK | 否 | 否 | 否 | 否 | 是 | 是 | 是 | ? |
PSK-RSA | PSK | RSA | 否 | 否 | 否 | 否 | 是 | 是 | 是 | ? |
DHE-PSK | DHE | PSK | 否 | 是 | 否 | 否 | 是 | 是 | 是 | ? |
ECDHE-PSK | DHE | PSK | 否 | 是 | 否 | 否 | 是 | 是 | 是 | ? |
SRP | SRP | SRP | 否 | 否 | 否 | 否 | 是 | 是 | 是 | ? |
SRP-RSA | SRP | RSA | 否 | 否 | 否 | 否 | 是 | 是 | 是 | ? |
SRP-DSA | SRP | DSA | 否 | 否 | 否 | 否 | 是 | 是 | 是 | ? |
DH-ANON | DH | 無 | 是 | 否 | 否 | 是 | 是 | 是 | 是 | 否 |
ECDH-ANON | ECDH | 無 | 是 | 否 | 否 | 否 | 是 | 是 | 是 | 否 |