首頁 > 曲藝

一文徹底搞明白Http以及Https

作者:由 51CTO 發表于 曲藝日期:2021-05-30

http是什麼意思

早期以資訊釋出為主的Web 1。0時代,HTTP已可以滿足絕大部分需要。證書費用、伺服器的計算資源都比較昂貴,作為HTTP安全擴充套件的HTTPS,通常只應用在登入、交易等少數環境中。但隨著越來越多的重要業務往線上轉移,網站對使用者隱私和安全性也越來越重視。對於防止惡意監聽、中間人攻擊、惡意劫持篡改,HTTPS是目前較為可行的方案,全站HTTPS逐漸成為主流網站的選擇。

HTTP簡介

HTTP(HyperText Transfer Protocol,超文字傳輸協議),是一種無狀態 (stateless) 協議,提供了一組規則和標準,從而讓資訊能夠在網際網路上進行傳播。在HTTP中,客戶端透過Socket建立一個TCP/IP連線,並連線到伺服器,完成資訊交換後,就會關閉TCP連線。(後來透過Connection: Keep-Alive實現長連線)

HTTP訊息組成:

請求行或響應行

HTTP頭部

HTML實體,包括請求實體和響應實體

HTTP請求結構,響應結構如圖所示:

一文徹底搞明白Http以及Https

1。 HTTP頭部

HTTP頭部由一系列的鍵值對組成,允許客戶端向伺服器端傳送一些附加資訊或者客戶端自身的資訊,如:accept、accept-encoding、cookie等。http頭後面必須有一個空行

2。 請求行

請求行由方法、URL、HTTP版本組成。

一文徹底搞明白Http以及Https

3。 響應行

響應行由HTTP版本、狀態碼、資訊提示符組成。

一文徹底搞明白Http以及Https

HTTP2。0和HTTP1。X相比的新特性

新的二進位制格式,HTTP1。x的解析是基於文字。基於文字協議的格式解析存在天然缺陷,文字的表現形式有多樣性,要做到健壯性考慮的場景必然很多,二進位制則不同,只認0和1的組合。基於這種考慮HTTP2。0的協議解析決定採用二進位制格式,實現方便且健壯。

多路複用,即每一個請求都是是用作連線共享機制的。一個請求對應一個id,這樣一個連線上可以有多個請求,每個連線的請求可以隨機的混雜在一起,接收方可以根據請求的id將請求再歸屬到各自不同的服務端請求裡面。

header壓縮,HTTP1。x的header帶有大量資訊,而且每次都要重複傳送,HTTP2。0使用encoder來減少需要傳輸的header大小,通訊雙方各自cache一份header fields表,既避免了重複header的傳輸,又減小了需要傳輸的大小。

服務端推送,同SPDY一樣,HTTP2。0也具有server push功能。

HTTP安全問題

通訊使用明文(不加密),內容可能會被竊聽

不驗證通訊方的身份,因此有可能遭遇偽裝

無法證明報文的完整性,所以有可能已遭篡改

HTTPS協議

HTTPS 是最流行的 HTTP 安全形式。使用 HTTPS 時,所有的 HTTP 請求和響應資料在傳送到網路之前,都要進行加密。 HTTPS 在 HTTP 下面提供了一個傳輸級的密碼安全層——可以使用 SSL,也可以使用其後繼者——傳輸層安全(TLS)。

一文徹底搞明白Http以及Https

相關術語

金鑰:改變密碼行為的數字化引數。

對稱金鑰加密系統:編、解碼使用相同金鑰的演算法。

不對稱金鑰加密系統:編、解碼使用不同金鑰的演算法。

公開金鑰加密系統:一種能夠使數百萬計算機便捷地傳送機密報文的系統。

數字簽名:用來驗證報文未被偽造或篡改的校驗和。

數字證書:由一個可信的組織驗證和簽發的識別資訊。

金鑰協商演算法:解決動態金鑰分配、儲存、傳輸等問題

TLS/SSL協議

TLS/SSL協議包含以下一些關鍵步驟:

傳輸的資料必須具有機密性和完整性,一般採用對稱加密演算法和HMAC演算法,這兩個演算法需要一系列的金鑰塊(key_block),比如對稱加密演算法的金鑰、HMAC演算法的金鑰,如果是AES-128-CBC-PKCS#7加密標準,還需要初始化向量。

所有的加密塊都由主金鑰(Master Secret)生成,主金鑰就是第1章中講解的會話金鑰,使用密碼衍生演算法將主金鑰轉換為多個密碼快。

主金鑰來自預備主金鑰(Premaster Secret),預備主金鑰採用同樣的密碼衍生演算法轉換為主金鑰,預備主金鑰採用RSA或者DH(ECDH)演算法協商而來。不管採用哪種金鑰協商演算法,伺服器必須有一對金鑰(可以是RSA或者ECDSA金鑰),公鑰發給客戶端,私鑰自己保留。不同的金鑰協商演算法,伺服器金鑰對的作用也是不同的。

透過這些關鍵步驟,好像TLS/SSL協議的任務已經結束,但這種方案會遇到中間人攻擊,這是TLS/SSL協議無法解決的問題,必須結合PKI的技術進行解決,PKI的核心是證書,證書背後的密碼學演算法是數字簽名技術。對於客戶端來說,需要校驗證書,確保接收到的伺服器公鑰是經過認證的,不存在偽造,也就是客戶端需要對伺服器的身份進行驗證。

TLS/SSL協議核心就三大步驟:認證、金鑰協商、資料加密。

RSA握手

一文徹底搞明白Http以及Https

握手階段分成五步:

客戶端給出協議版本號、生成的隨機數(Client random),以及客戶端支援的加密方法。

服務端確認雙方使用的加密方法,並給出數字證書、以及一個伺服器生成的隨機數。

客戶端確認數字證書有效,然後生成一個新的隨機數(Premaster secret),並使用數字證書中的公鑰,加密這個隨機數,發給伺服器。

伺服器使用自己的私鑰,獲取客戶端發來的隨機數(Premaster secret)。

雙方根據約定的加密方法,使用前面的三個隨機數,生成會話金鑰(session key),用來加密接下來的對話過程。

握手階段有三點需要注意:

生成對話金鑰一共需要三個隨機數。

握手之後的對話使用對話金鑰(session key)加密(對稱加密),伺服器的公鑰和私鑰只用於加密和解密對話金鑰(session key)(非對稱加密),無其他作用。

伺服器公鑰放在伺服器的數字證書之中。

DH握手

一文徹底搞明白Http以及Https

RSA整個握手階段都不加密,都是明文的。因此,如果有人竊聽通訊,他可以知道雙方選擇的加密方法,以及三個隨機數中的兩個。整個通話的安全,只取決於第三個隨機數(Premaster secret)能不能被破解。為了足夠安全,我們可以考慮把握手階段的演算法從預設的RSA演算法,改為 Diffie-Hellman演算法(簡稱DH演算法)。採用DH演算法後,Premaster secret不需要傳遞,雙方只要交換各自的引數,就可以算出這個隨機數。

參考

《深入淺出HTTPS:從原理到實戰》(虞衛東)

blog。cloudflare。com/keyless-ssl…

segmentfault。com/a/119000001…

作者:黑漏

連結:https://juejin。cn/post/6943389596117893134