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 | 無 | 是 | 否 | 否 | 否 | 是 | 是 | 是 | 否 |