歡迎光臨
每天分享高質量文章

聊聊HTTPS SSL/TLS協議原理

      協議安全和加密越來越引起人們的重視和關註,今天就跟大家分享一點協議加密方面的知識。要說清楚 HTTPS 協議的實現原理,至少需要如下幾個背景知識。

  1. 大致瞭解幾個基本術語(HTTPS、SSL、TLS)的含義

  2. 大致瞭解 HTTP 和 TCP 的關係(尤其是 “短連接”VS“長連接”)

  3. 大致瞭解加密演算法的概念(尤其是 “對稱加密與非對稱加密” 的區別)

  4. 大致瞭解 CA 證書的用途

      考慮到很多技術菜鳥可能不瞭解上述背景,俺先用最簡短的文字描述一下。如果你自認為不是菜鳥,請略過本章節,直接去看 “HTTPS 協議的需求”。


先澄清幾個術語——HTTPS、SSL、TLS。


1. “HTTP” 是幹嘛用滴?

      首先,HTTP 是一個網絡協議,是專門用來幫你傳輸 Web 內容滴。關於這個協議,就算你不瞭解,至少也聽說過吧?比如你訪問俺的博客的主頁,瀏覽器地址欄會出現如下的網址http://www.xxx.com/

      俺加了粗體的部分就是指 HTTP 協議。大部分網站都是通過 HTTP 協議來傳輸 Web 頁面、以及 Web 頁面上包含的各種東東(圖片、CSS 樣式、JS 腳本)。

2. “SSL/TLS” 是幹嘛用滴?

      SSL 是洋文 “Secure Sockets Layer” 的縮寫,中文叫做 “安全套接層”。它是在上世紀 90 年代中期,由網景公司設計的。(順便插一句,網景公司不光發明瞭 SSL,還發明瞭很多 Web 的基礎設施——比如“CSS 樣式表” 和“JS 腳本”) 為啥要發明 SSL 這個協議捏?因為原先互聯網上使用的 HTTP 協議是明文的,存在很多缺點——比如傳輸內容會被偷窺(嗅探)和篡改。發明 SSL 協議,就是為瞭解決這些問題。

      到了 1999 年,SSL 因為應用廣泛,已經成為互聯網上的事實標準。IETF 就在那年把 SSL 標準化。標準化之後的名稱改為 TLS(是 “Transport Layer Security” 的縮寫),中文叫做“傳輸層安全協議”。

      很多相關的文章都把這兩者併列稱呼(SSL/TLS),因為這兩者可以視作同一個東西的不同階段。

3. “HTTPS” 是啥意思?

      解釋完 HTTP 和 SSL/TLS,現在就可以來解釋 HTTPS 啦。咱們通常所說的 HTTPS 協議,說白了就是 “HTTP 協議” 和“SSL/TLS 協議”的組合。你可以把 HTTPS 大致理解為——“HTTP over SSL”或“HTTP over TLS”(反正 SSL 和 TLS 差不多)。

再來說說 HTTP 協議的特點

      作為背景知識介紹,還需要再稍微談一下 HTTP 協議本身的特點。HTTP 本身有很多特點,考慮到篇幅有限,俺只談那些和 HTTPS 相關的特點。

1. HTTP 的版本和歷史

      如今咱們用的 HTTP 協議,版本號是 1.1(也就是 HTTP 1.1)。這個 1.1 版本是 1995 年底開始起草的(技術文件是 RFC2068),併在 1999 年正式發佈(技術文件是 RFC2616)。

      在 1.1 之前,還有曾經出現過兩個版本 “0.9 和 1.0”,其中的 HTTP 0.9 沒有被廣泛使用,而 HTTP 1.0 被廣泛使用過。 另外,2015年IETF 就要發佈 HTTP 2.0 的標準了。

2. HTTP 和 TCP 之間的關係

      簡單地說,TCP 協議是 HTTP 協議的基石——HTTP 協議需要依靠 TCP 協議來傳輸資料。在網絡分層模型中,TCP 被稱為 “傳輸層協議”,而 HTTP 被稱為 “應用層協議”。

      有很多常見的應用層協議是以 TCP 為基礎的,比如 “FTP、SMTP、POP、IMAP” 等。

      TCP 被稱為 “面向連接” 的傳輸層協議。關於它的具體細節,俺就不展開了(否則篇幅又失控了)。你只需知道:傳輸層主要有兩個協議,分別是 TCP 和 UDP。TCP 比 UDP 更可靠。你可以把 TCP 協議想象成某個水管,發送端這頭進水,接收端那頭就出水。並且 TCP 協議能夠確保,先發送的資料先到達(與之相反,UDP 不保證這點)。

3. HTTP 協議如何使用 TCP 連接?

      HTTP 對 TCP 連接的使用,分為兩種方式:俗稱 “短連接” 和“長連接”(“長連接”又稱 “持久連接”,洋文叫做“Keep-Alive” 或“Persistent Connection”) 假設有一個網頁,裡面包含好多圖片,還包含好多外部的CSS 檔案和 JS 檔案。在 “短連接” 的樣式下,瀏覽器會先發起一個 TCP 連接,拿到該網頁的 HTML 原始碼(拿到 HTML 之後,這個 TCP 連接就關閉了)。然後,瀏覽器開始分析這個網頁的原始碼,知道這個頁麵包含很多外部資源(圖片、CSS、JS)。

      然後針對每一個外部資源,再分別發起一個個 TCP 連接,把這些檔案獲取到本地(同樣的,每抓取一個外部資源後,相應的 TCP 就斷開) 相反,如果是 “長連接” 的方式,瀏覽器也會先發起一個 TCP 連接去抓取頁面。但是抓取頁面之後,該 TCP 連接並不會立即關閉,而是暫時先保持著(所謂的“Keep-Alive”)。然後瀏覽器分析 HTML 原始碼之後,發現有很多外部資源,就用剛纔那個 TCP 連接去抓取此頁面的外部資源。

      在 HTTP 1.0 版本,預設使用的是 “短連接”(那時候是 Web 誕生初期,網頁相對簡單,“短連接” 的問題不大); 到了 1995 年底開始制定 HTTP 1.1 草案的時候,網頁已經開始變得複雜(網頁內的圖片、腳本越來越多了)。這時候再用短連接的方式,效率太低下了(因為建立 TCP 連接是有 “時間成本” 和“CPU 成本”滴)。

      所以,在 HTTP 1.1 中,預設採用的是 “Keep-Alive” 的方式。 關於 “Keep-Alive” 的更多介紹,可以參見維基百科詞條。

談談 “對稱加密” 和“非對稱加密”的概念

1. 啥是 “加密” 和“解密”?

      通俗而言,你可以把 “加密” 和“解密”理解為某種互逆的數學運算。就好比 “加法和減法” 互為逆運算、“乘法和除法”互為逆運算。

      “加密”的過程,就是把 “明文” 變成 “密文” 的過程;反之,“解密”的過程,就是把 “密文” 變為“明文”。在這兩個過程中,都需要一個關鍵的東東——叫做“密鑰”——來參與數學運算。


2. 啥是 “對稱加密”?


      所謂的 “對稱加密技術”,意思就是說:“加密” 和“解密”使用相同的密鑰。這個比較好理解。就好比你用 7zip 或 WinRAR 創建一個帶密碼(口令)的加密壓縮包。當你下次要把這個壓縮檔案解開的時候,你需要輸入同樣的密碼。在這個例子中,密碼 / 口令就如同剛纔說的“密鑰”。

3. 啥是 “非對稱加密”?


      所謂的 “非對稱加密技術”,意思就是說:“加密” 和“解密”使用不同的密鑰。這玩意兒比較難理解,也比較難想到。當年 “非對稱加密” 的發明,還被譽為 “密碼學” 歷史上的一次革命。

      由於篇幅有限,對 “非對稱加密” 這個話題,俺就不展開了。有空的話,再單獨寫一篇掃盲。

4. 各自有啥優缺點?

      看完剛纔的定義,很顯然:(從功能角度而言)“非對稱加密”能幹的事情比 “對稱加密” 要多。這是 “非對稱加密” 的優點。但是 “非對稱加密” 的實現,通常需要涉及到 “複雜數學問題”。所以,“非對稱加密” 的性能通常要差很多(相對於 “對稱加密” 而言)。 這兩者的優缺點,也影響到了 SSL 協議的設計。

HTTPS 協議的需求是啥?

      花了好多口水,終於把背景知識說完了。下麵正式進入正題。先來說說當初設計 HTTPS 是為了滿足哪些需求?

      很多介紹 HTTPS 的文章一上來就給你講實現細節。個人覺得:這是不好的做法。早在 2009 年開博的時候,發過一篇,其中談到 “WHY 型問題” 的重要性。一上來就給你講協議細節,你充其量只能知道 WHAT 和 HOW,無法理解 WHY。

      俺在前一個章節講了“背景知識”,在這個章節講了“需求”,這就有助於你理解:當初為什麼要設計成這樣?——這就是 WHY 型的問題。


兼容性

      因為是先有 HTTP 再有 HTTPS。所以,HTTPS 的設計者肯定要考慮到對原有 HTTP 的兼容性。 這裡所說的兼容性包括很多方面。比如已有的 Web 應用要盡可能無縫地遷移到 HTTPS;比如對瀏覽器廠商而言,改動要盡可能小;基於 “兼容性” 方面的考慮,很容易得出如下幾個結論:

  1. HTTPS 還是要基於 TCP 來傳輸(如果改為 UDP 作傳輸層,無論是 Web 服務端還是瀏覽器客戶端,都要大改,動靜太大了)。

  2. 單獨使用一個新的協議,把 HTTP 協議包裹起來 (所謂的 “HTTP over SSL”,實際上是在原有的 HTTP 資料外面加了一層 SSL 的封裝。HTTP 協議原有的 GET、POST 之類的機制,基本上原封不動)。

      打個比方:如果原來的 HTTP 是塑料水管,容易被戳破;那麼如今新設計的 HTTPS 就像是在原有的塑料水管之外,再包一層金屬水管。一來,原有的塑料水管照樣運行;二來,用金屬加固了之後,不容易被戳破。

可擴展性

      前面說了,HTTPS 相當於是 “HTTP over SSL”。 如果 SSL 這個協議在 “可擴展性” 方面的設計足夠牛逼,那麼它除了能跟 HTTP 搭配,還能夠跟其它的應用層協議搭配。豈不美哉?

      現在看來,當初設計 SSL 的人確實比較牛。如今的 SSL/TLS 可以跟很多常用的應用層協議(比如: FTP、SMTP、POP、Telnet)搭配,來強化這些應用層協議的安全性。

      接著剛纔打的比方:如果把 SSL/TLS 視作一根用來加固的金屬管,它不僅可以用來加固輸水的管道,還可以用來加固輸煤氣的管道。

保密性

      HTTPS 需要做到足夠好的保密性。說到保密性,首先要能夠對抗嗅探(行話叫 Sniffer)。所謂的 “嗅探”,通俗而言就是監視你的網絡傳輸流量。如果你使用明文的 HTTP 上網,那麼監視者通過嗅探,就知道你在訪問哪些網站的哪些頁面。


      嗅探是最低級的攻擊手法。除了嗅探,HTTPS 還需要能對抗其它一些稍微高級的攻擊手法——比如 “重放攻擊”。

完整性

      除了 “保密性”,還有一個同樣重要的標的是“確保完整性”。關於“完整性” 這個概念,在之前的博文中大致提過。健忘的同學再去溫習一下。 在發明 HTTPS 之前,由於 HTTP 是明文的,不但容易被嗅探,還容易被篡改。

      舉個例子:比如咱們天朝的網絡運營商都比較流氓,經常有網友抱怨說訪問某網站(本來是沒有廣告的),竟然會跳出很多廣告。為啥會這樣捏?因為你的網絡流量需要經過 ISP 的線路才能到達公網。如果你使用的是明文的 HTTP,ISP 很容易就可以在你訪問的頁面中植入廣告。所以,當初設計 HTTPS 的時候,還有一個需求是 “確保 HTTP 協議的內容不被篡改”。

真實性

      在談到 HTTPS 的需求時,“真實性”經常被忽略。其實 “真實性” 的重要程度不亞於前面的 “保密性” 和“完整性”。

      舉個例子:你因為使用網銀,需要訪問該網銀的 Web 站點。那麼,你如何確保你訪問的網站確實是你想訪問的網站?(這話有點繞口令) 有些天真的同學會說:通過看網址裡面的域名來確保。


      為啥說這樣的同學是 “天真的”?因為 DNS 系統本身是不可靠的(尤其是在設計 SSL 的那個年代,連DNSSEC 都還沒發明)。由於DNS 的不可靠(存在“域名欺騙” 和“域名劫持”),你看到的網址裡面的域名未必是真實滴!所以,HTTPS 協議必須有某種機制來確保 “真實性” 的需求。

性能

      再來說最後一個需求——性能。引入 HTTPS 之後,不能導致性能變得太差。否則的話,誰還願意用? 為了確保性能,SSL的設計者至少要考慮如下幾點:


  1. 如何選擇加密演算法(“對稱”or“非對稱”)?

  2. 如何兼顧 HTTP 採用的 “短連接”TCP 方式?

      SSL 是在1995 年之前開始設計的,那時候的 HTTP 版本還是 1.0,預設使用的是 “短連接” 的 TCP 方式——預設不啟用 Keep-Alive)。

      更多技術內容,請點擊原文鏈接或識別下麵小程式查閱詳情。


熱文閱讀



溫馨提示:

請搜索“ICT_Architect”“掃一掃”二維碼關註公眾號,點擊原文鏈接獲取更多技術資料

Stay hungry, Stay foolish

赞(0)

分享創造快樂