爲什麼需要 https?

       許多人會傾向於使用複雜的詞彙和行話和結論來掩蓋他們不明白的東西。問題是我們只在糊弄自己,因爲我們不知道自己也不明白。那麼我們能否足夠直白將一個知識點講解給一個小孩子聽懂呢?       

       大家好,今天要跟大家談論的是我們通常所說的 HTTPS(SSL、TLS)這樣的一些手段如何來保證網絡信息傳輸的安全性。不管你是發送一個郵件,還是每天在瀏覽器中瀏覽網頁,都使用了 https 這樣一種現代通用的加密手段。在之前我們其實談論過,在網絡當中實際上有 OSI 七層的網絡模型,物理層,鏈接層,網絡層,傳輸層。

OSI 7 層網絡模型

在數據包裝包與解包的過程中,實際上都是把上一層包封裝到下一層中,類似於洋蔥一樣層層包裹的方式。

數據包 - 層層包裝

        當一個數據包到達中間的路由器或者到達了目的地以後,處理器就會把數據包逐個的解析出來。比如 mac 地址是不是當前的服務器地址,IP 應該走哪一個路由網關,端口是哪一個服務的端口等實際上都能夠獲取到。如果是 HTTP 協議,進一步的我們還可以獲取到 HTTP 傳輸的數據。

        通過一些抓包工具,例如 wireshark,我們能夠很容易的看到,其實信息在這樣的一箇中間服務器當中,都是完全透明的。

wireshark 解析 HTTP

比如說我們在 wireshark 中看到的信息就是它層層解析以後,所展現出來的內容。所以你發送的一些密碼或者是內容,我都能夠捕獲到它並且明文解析。

wireshark 解析 HTTP

隨着互聯網的發展,傳統 HTTP 的方式實際上面臨着很多的困難,這些困難就包括之前提到的,如果你身處不信任的網絡中,我們不知道數據包會經歷什麼樣的中間節點,中間人就可能會對我們的數據做一些干擾。

竊聽(eavesdropping)、篡改(tampering)、重放 (replay) 是 HTTP 協議面臨的 3 類攻擊。 

例如下圖最上面的例子,中間人捕獲到了信息,然後再把信息發送給服務器,但是你可能並不知道這個中間人的存在,他做了什麼你完全都不知道。但他實際上已經掌握了你的信息。

HTTP 中間人攻擊

        上圖最下面的例子,中間人可以主動的做攻擊。比如中間人得到服務器發送給用戶的一些信息後做一些其他處理。比如換成釣魚網站,或者加一些廣告在裏面。還有一種方式就是捕獲到你的信息以後,中間人可以把這個消息給發送很多次,比如一個轉賬的處理,這就是重放攻擊。

        所以 HTTP 確實面臨一些困境。我們需要有一些手段,這些手段包括對於信息的加密,中間人就算得到了信息,也不能夠對於消息進行解密。但其實加密是遠遠不夠的,在中間人的攻擊中,可能不需要解密信息,而是替換掉你的信息。

所以還必須要有一種身份驗證的手段。能夠確認聲明人的身份,比說他說他是 A,那我怎麼知道他就是 A?

      現實當中面對面交流的時候,我可能知道他是 A,但是如果在互聯網上,比如 XX 找你借錢或者轉賬,我不知道他是誰的時候,我應該怎麼辦?這個時候我們需要更多的信息確認或驗證他的身份,在 HTTPS 中採用的是信用鏈的機制。

      出於上訴安全原因,網景公司 (Netscape) 在 90 年代初開始研發 SSL 協議,1995 年正式發佈 SSL2.0 版本,由於協議的安全問題,1996 年升級到了 SSL3.0 版本。

1999 年 由 IEFT 協會制定標準,過渡到 tls(Transport Layer Security),實際可看做是 SSL3.1 版本。

90 年代末,網景公司和微軟公司正在打瀏覽器的大戰,所以 TLS 的設計者在後來回憶也講到。把 SSL 改名爲 TLS 主要的原因就是考慮到微軟的感受。

"so it wouldn't look [like] the IETF was just rubberstamping Netscape's protocol" ————Tim Dierks

06 年出了 TLS1.1 版本, 08 年出了 TLS1.2 版本, 然後在十年之後的 2018 年,出了 TLS1.3 版本。

        版本的升級過渡有很多方面的考慮,包括補充了更多的加密協議,丟棄掉老的過時的加密協議。在 TLS1.3 版本中會更關注降低服務的 round trip,也就是在握手的時候我怎麼樣能夠更快速,更短的握手次數。

       TLS 是在 TCP 之上的,常見的應用層以下的一層。所以可以把它叫做 4.5 層。由於改動 TCP 層已經很難了,它不僅是很多路由協議採用的標準,並且在很多操作系統當中,對 TCP 的一些處理都是嵌到內核裏面處理的,升級改造比較困難。所以很多新的協議都是建立在 TCP 或者 UDP 之上的。

TLS 的位置和功能

       TLS 相當於 4.5 層,目前用的最多的是對 HTTP 協議的封裝。所以說很多人會把它叫做 HTTPS,當然這種說法肯定是不準確的,他還包括了對於其他一些應用層協議的封裝。包括可以使用 TLS 做一個隧道,從而讓一些其他協議正常的傳輸。

      TLS 作爲一種協議,協議中字段的含義在服務器與客戶端之間達成共識,比如上圖中這個消息是什麼樣的消息。它可能是握手的消息,改變密鑰的消息,告警的消息,正常數據傳輸的消息。還包括數據如何分段傳輸,數據如何壓縮,如何進行加密、鑑權等機制。

        首先看一看 TLS 1.2 當中握手的方式,會更加清晰。TLS 1.3 是對 TLS 1.2 的改進和升級。在 TLS1.2 當中,握手的方式主要是怎麼樣的呢?我們知道肯定會首先進行 TCP 的三次握手對吧?但是我們都知道,在第三次握手的時候,客戶端是可以攜帶消息的,所以說在引用的這張圖當中, 作者把客戶端 ACK 這個消息和要發送的 TLS 的 hello 消息整合在了一起。

TLS1.2 握手

        服務器需要回什麼消息呢?它需要回 hello 以及回覆版本號信息,公鑰等。在這裏實際上統一起來信息是一個 x.509 格式的證書。證書裏面包含了很多東西,包括版本號,包括髮行人,過期時間,公鑰等等。客戶端得到這個服務器的證書以後,就會解析證書確認服務器的身份。

       確認了以後。客戶端和服務器下一步需要對於對稱加密的參數進行協商,傳遞加密的一些參數和對應的加密算法,以及 pre_master_secret,隨機數等信息。客戶端和服務器根據這些信息生成最終對稱加密的密鑰。

可以看到,TLS1.2 在握手的時候實際上傳遞證書和對稱加密協商,消耗了 2 個 round trip,那麼能不能縮減這一過程呢? 

        TLS1.3 通過提前在 client hello 階段進行對稱加密的協商來做到將握手縮減到 1 個 round trip, 甚至在已經建立了連接之後,能夠做到 0 round trip 的再次建連。

TLS1.3 降低握手次數

總結

        https 通過加密與權限驗證保證了信息的安全性,其中對於客戶端的權限驗證使用了 x.509 公鑰證書標準,而傳輸信息的加密使用了對稱加密的機制。

對於 TLS 握手,在 TSL1.2 以及以前,一般在 TCP 握手的基礎上還需要 2 次 round trip,而 TLS1.3 通過提前在 client hello 階段進行對稱加密的協商來做到將握手縮減到 1 個 round trip, 甚至在已經建立了連接之後,能夠做到 0 round trip 的再次建連。

       那麼爲什麼需要非對稱加密和對稱加密兩種方式?一種夠不夠呢?下一次我們將對證書的信用鏈機制和對稱加密進行仔細探討,我們會看到,從直覺入手,這一切演進都是多麼自然和美妙。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/JfIPwheoXkdOhSM5cN-pFg