詳談HTTPS SSL/TLS協議原理

作者 | 朱小廝的博客

來源 | https://mp.weixin.qq.com/s/EVUsX57WOuFgzY748BvwuA

協議安全和加密越來越引起人們的重視和關注,今天就跟大家分享一點協議加密方面的知識。要說清楚 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 年開博的時候,發過一篇<學習技術的三部曲:WHAT、HOW、WHY>,其中談到 “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)。



往期推薦

聽說過OpenJDK,沒說過OpenValueJDK吧?

2021 年4月數據庫流行度排行榜出爐!Snowflake 和 Clickhouse上升迅速!

2021年3月程序員工資統計數據出爐,又拖後腿了……

漲姿勢:另類的表情域名賺錢大法!!

90%的開發都不太考慮這個,但只要出問題直接公司完蛋!


如果你喜歡本文,歡迎關注我,訂閱更多精彩內容
關注我回復「加羣」,加入Spring技術交流羣

免費領取:字節跳動資料-圖解網絡


喜歡的這裏報道

↘↘↘

本文分享自微信公衆號 - 程序猿DD(didispace)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章