<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          詳談HTTPS SSL/TLS協(xié)議原理

          共 5468字,需瀏覽 11分鐘

           ·

          2021-04-10 11:17

          作者 | 朱小廝的博客

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

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

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

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

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

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

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

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

          1. “HTTP” 是干嘛用滴?

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

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

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

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

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

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

          3. “HTTPS” 是啥意思?

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

          二、再來說說 HTTP 協(xié)議的特點

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

          1. HTTP 的版本和歷史

          如今咱們用的 HTTP 協(xié)議,版本號是 1.1(也就是 HTTP 1.1)。這個 1.1 版本是 1995 年底開始起草的(技術文檔是 RFC2068),并在 1999 年正式發(fā)布(技術文檔是 RFC2616)。

          在 1.1 之前,還有曾經(jīng)出現(xiàn)過兩個版本 “0.9 和 1.0”,其中的 HTTP 0.9 沒有被廣泛使用,而 HTTP 1.0 被廣泛使用過。另外,2015年IETF 就要發(fā)布 HTTP 2.0 的標準了。

          2. HTTP 和 TCP 之間的關系

          簡單地說,TCP 協(xié)議是 HTTP 協(xié)議的基石——HTTP 協(xié)議需要依靠 TCP 協(xié)議來傳輸數(shù)據(jù)。在網(wǎng)絡分層模型中,TCP 被稱為 “傳輸層協(xié)議”,而 HTTP 被稱為 “應用層協(xié)議”。

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

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

          3. HTTP 協(xié)議如何使用 TCP 連接?

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

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

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

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

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

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

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

          “加密”的過程,就是把 “明文” 變成 “密文” 的過程;反之,“解密”的過程,就是把 “密文” 變?yōu)椤懊魑摹薄T谶@兩個過程中,都需要一個關鍵的東東——叫做“密鑰”——來參與數(shù)學運算。

          2. 啥是 “對稱加密”?

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

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

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

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

          4. 各自有啥優(yōu)缺點?

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

          四、HTTPS 協(xié)議的需求是啥?

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

          很多介紹 HTTPS 的文章一上來就給你講實現(xiàn)細節(jié)。個人覺得:這是不好的做法。早在 2009 年開博的時候,發(fā)過一篇<學習技術的三部曲:WHAT、HOW、WHY>,其中談到 “WHY 型問題” 的重要性。一上來就給你講協(xié)議細節(jié),你充其量只能知道 WHAT 和 HOW,無法理解 WHY。

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

          兼容性

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

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

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

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

          可擴展性

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

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

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

          保密性

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

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

          完整性

          除了 “保密性”,還有一個同樣重要的目標是“確保完整性”。關于“完整性” 這個概念,在之前的博文<掃盲文件完整性校驗——關于散列值和數(shù)字簽名>中大致提過。健忘的同學再去溫習一下。在發(fā)明 HTTPS 之前,由于 HTTP 是明文的,不但容易被嗅探,還容易被篡改。

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

          真實性

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

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

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

          性能

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

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

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

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



          往期推薦

          聽說過OpenJDK,沒說過OpenValueJDK吧?

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

          2021年3月程序員工資統(tǒng)計數(shù)據(jù)出爐,又拖后腿了……

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

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


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

          免費領取:字節(jié)跳動資料-圖解網(wǎng)絡


          喜歡的這里報道

          ↘↘↘

          瀏覽 45
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  久久久久久精 | 日韩一区二区在线视频 | 波多野吉衣无码HD | 久久久久久久久久久久久性性 | 色吊丝永久性观看网站在线观看 |