我們為何需要安全傳輸層協議(TLS)
網上說TLS的文章很多,要學習TLS技術有很多不錯的選擇。本文并不是一個權威的教程,只是我個人學習TLS后基于自己理解的一個總結而已。如果有讀者通過閱讀此文后加深了對TLS的理解,不勝榮幸。
要聊TLS,還得從HTTP說起,HTTP可以說是作為目前最流行的一個網絡協議,可以說是網絡的基石之一。一般來說可以理解為從瀏覽器看到的所有東西,都是構建于HTTP之上的。
早期HTTP協議被設計成在一個可信網絡環境中運行,其設計理念以簡單為主——通過一個通用格式的明文請求就能夠獲取到各種文檔、樣式、腳本、富媒體內容等。
由于其簡潔性,各種互聯網應用都得以在其之上進行充分的擴展,從最早的一個HTML文檔就是一個網頁,到如今打開一個淘寶首頁就有百八十個HTTP請求。各種類型的HTTP請求相互配合,組成了如今我們所看到的繽紛多彩的互聯網世界。
然而,如今的互聯網環境紛繁復雜,HTTP的簡單也面臨兩個大的問題
- 安全性無法保證
- 單次請求獲取一個文檔的方式,不滿足如今流式傳輸體驗所要求的性能
本文主要著眼于安全性方面,第二點后續有機會再議。
導致安全問題的一個重要原因是通過HTTP的請求及返回都是明文的,下面通過兩個例子說明。
其一是網絡運營商劫持問題。主要是指我們的網絡運營商(電信、聯通、移動等)通過在我們看的網頁中添加廣告,來謀取廣告費的問題。下面來看看他們是怎么做的。
我們所謂的『上網』大體分為兩步,首先給我們要上的網的服務器發送一個請求,然后接收到服務器返回的內容,瀏覽器將這些內容展示出來就是我們看到的網頁了。我們的請求并不是直接發送給目標網站的服務器的,中間經過了層層的轉發。
如上圖所示,整個互聯網其實是一個拓撲結構,我們的請求往返于服務器之間,其實是經過了很多個節點的(這里只是簡單YY了一個三層的結構,實際網絡拓撲要復雜很多)。圖中橙色的節點就是我們網絡運營商的節點了。按說運營商收了我們的網費,好好的做好傳送數據的事情就好了。然而一些黑心運營商(干這事的一般為三四線城市的小運營商)在收了網費的同時還不好好干活,在服務器的返回內容中插入他們自己的廣告,以此來多謀得一份廣告收入。
這里隨便網上找了兩個被插入廣告的例子。

從第二個圖可以看到,運營商通過解析HTTP請求返回的HTML內容,在其中插入一個iframe區塊,完成廣告的展現。這個事情本身沒難度(分析網絡請求的具體內容,有個專業術語叫『深度包檢測』),做不做就是運營商的節操問題了。
由于這種現象還是比較影響體驗的,因此一些網站踏上了全站HTTPS改造之路,不惜巨大改造成本和性能壓力,旨在避免運營商的流氓行徑,這里先按下不表。
上述這種問題我們總結下,屬于『可信(相對)』人員占著『有利位置』,通過篡改請求來『某點小利』。這里之所以說這些黑心運營商是『可信』,是因為他們雖然有能力做任何事,但畢竟本職是負責傳輸,除了打打小廣告之外,一般還是能夠保證傳輸內容的安全的。因此當你碰到這種情況時不必過于緊張,打個電話投訴下也就完事了。
為什么強調『可信』這個概念,是相對于下面這個case來說的。『可信』的運營商在『有利位置』,這是沒辦法改變的。但要是我們不小心把『不可信』的不法分子也放到『有利位置』,那恐怕就不是被打打廣告這個簡單了。所謂的『不可信』就是下圖這種情況。
之前的圖中紅色節點是我們家里自己的wifi,那是可以保證安全的。但如果你是出門在外,使用的是餐廳、咖啡館、酒店、機場的wifi,那還能保證安全嗎?當然不能!雖然一般公共場所提供wifi也就是個便民服務,沒啥心機。但假設你不幸連接到的是不法分子故意開放的wifi,那危害就很大了。
這些不法分子可以窺探你所有的請求以及服務器的返回,那簡直就是想干啥就干啥了。以下為YY場景。
- 假設正好你上的某個小眾網站技術水平不高,你的用戶名密碼都是以明文或可逆的加解密算法傳遞的話,不法分子就能拿到你的用戶名密碼了。當然不法分子可能對你的小眾網站并不感興趣,看了一眼就關了。但是他轉念一想,由于記憶困難,一般人對不同網站用同一個密碼的可能性很大。因此他會拿著你的用戶名密碼去qq、淘寶、支付寶等大網站嘗試。一旦你真的用了同樣的密碼,那就中招了。再想得邪惡點,假設你看的那個簡陋的小眾網站,本身就在收集用戶名密碼呢?? 因此對于一般人來說,建議至少能夠實行簡單的密碼分級,重要的大網站搞一個復雜的密碼,平時隨便看看的小眾網站就搞個簡單密碼吧。
- 你訪問的是正規網站,技術水平OK,密碼都是通過加鹽MD5傳輸的,那你就很安全?NO!在web應用中,每當用戶登錄時,服務器都會為其生成一個『令牌』。在后續用戶的各種操作時,用戶都需要將這個『令牌』帶在請求中,以此來告訴服務器用戶的合法身份。不法分子完全可以通過分析web應用的請求,找到其中的令牌字段。一旦拿到這個令牌,那不法分子就擁有和用戶一樣的權限了。這個問題比上一個問題好一些的地方在于,令牌是有時效性的。比如今天一個用戶的令牌在訪問某網站時被人獲取了,那不法分子就可以用這個令牌和真正的用戶一起訪問該網站了。但如果真正的用戶退出登錄了,那不法分子這邊也就不再能訪問了。同時拿了網站A的令牌只能訪問網站A,不法分子沒辦法去sh試網站BCD。
- 上兩個場景都需要不法分子提前對用戶訪問的網站進行分析,這樣才能知道哪個字段才是密碼或令牌。雖然有時不法分子水平一般,不能從請求中找到密碼或令牌。但至少用戶訪問的網站及內容是一目了然的。用戶發的微博、看的新聞、上傳的照片、心情日記等等隱私全都被暴露了,也難怪網上經常會爆出『XX門』了。
上述兩次例子中,運營商和公共wifi提供者要么是竊聽了用戶的請求,要么是往服務器的返回中加點料。不管具體方法是啥,問題的本質在于HTTP請求和返回都是明文的。導致一路上這么多節點,每個節點都可以拿點它需要的信息,或者往里再加點料~
除此之外,HTTP的另一個問題是沒法校驗返回給你內容的服務器是否是目標服務器。這說的有些拗口,也沒法找到真實的應用層實例,那我們來看下類似的一個例子吧。
如圖所示是防火墻設備阻止用戶訪問特定網站的一種技術,有些公司會禁止員工訪問游戲、股票等網絡服務,就會用到這種技術(國家有時候也可以看做一個公司?)。HTTP基于TCP/IP協議之上,借助DNS協議的配合,幫助用戶只需要記住一個好記的單詞(域名或叫網址),就能訪問到特定的網絡服務。這個路由的原理不在本文范圍之內,但TCP/IP + DNS + HTTP這套機制能夠work的原因同樣基于一個假設——網絡環境是可信的,網絡中的每個節點都會按照協議要求有序運作。上圖中的橙色節點在用戶訪問百度時正常工作,但在訪問youtube時則沒有把請求往上傳遞,而是直接回復用戶不能響應請求。(TCP RST為斷開TCP連接)還有一種情況下請求還是往上傳遞到目標服務器了,但中間節點卻提前回復了一個TCP RST。用戶端瀏覽器收到一個TCP RST后并不知道真相,以為是要訪問的服務拒絕了我們的請求,因此就關閉了請求。而實際上服務器是無辜的,有節點偽裝了它。
上述例子還是我們『可信』的運營商或者防火墻提供商進行網絡管理的一種手段,其結果也就是用戶上不了某些網站而已,影響不是太大。和明文問題一樣,要是碰到的是一個『不可信』的節點,那問題就大得多。
上圖是網上找的一個釣魚網站的例子,這個問題大家現在都很注意了。不法分子將假網站做的和真網站一模一樣,通過聊天工具或短信騙用戶點擊訪問,企圖利用假網站騙取用戶的用戶名密碼。這種做法能夠被大多數人注意的原因是其網址和真網站不同,但如果把釣魚網站這個方式往上面的例子套,那就完全能以假亂真了。這種問題對于HTTP請求來說幾乎沒有分辨的辦法。
上述兩個例子都是用戶沒有訪問到真正的目標服務器,而是由某個惡意節點偽裝成目標服務器給用戶返回了內容。這種方式在一般的上網過程中是幾乎無法分辨的,只有技術人員刻意進行分析時,才能發現這種偽裝HTTP服務器的情況。
至此全文一共聊了四個例子,說明了HTTP存在的兩個安全問題
- 明文
- 無法驗證服務器的真實性
為了解決這兩個問題,我們引入TLS(傳輸層安全)協議。運行在TLS協議之上的HTTP協議稱作HTTPS,簡而言之大家日常上網時盡量使用HTTPS網址來代替HTTP網址,就可以大大提到安全性了~
上篇結束,下篇會介紹下TLS的大致原理,解釋其為啥能夠保證安全。