圖解 HTTPS / TLS 原理:從密碼學機制到安全交握流程
前言
網際網路就像是一個巨大的郵局,早期在 HTTPS 還沒發展之前,我們使用的 HTTP (HyperText Transfer Protocol) 協定本質上就是在寄送「明信片」。當你在網站上填寫個人資料、甚至是匯款帳號並點擊送出時,這些資料就赤裸裸地寫在明信片上。中途經過的電信商、路由器節點,甚至是剛好坐在你旁邊連著同一個咖啡廳 Wi-Fi 的駭客,只要稍微看一眼,就能把機密看光光。不僅如此,他們甚至還能偷偷拿橡皮擦把明信片上的匯款帳號改成他們自己的,而收件人完全不會發現。
這種「不保密、不防偽」的資訊裸奔環境,促使了 HTTPS (HyperText Transfer Protocol Secure) 的誕生。但 HTTPS 並不是一個全新的協議,而是一套為了解決上述「竊聽」與「篡改」問題而逐步疊加的防護機制。接下來,我們將循序漸進地了解,網路通訊是如何從如同裸奔的 HTTP,演變成今天安全的 HTTPS。
SSL/TLS:為通訊披上加密外衣
HTTP 與 HTTPS 最大的差異就在於 HTTPS 多了一道加/解密程序。而要將不安全的 HTTP 升級成安全的 HTTPS,最核心的關鍵就是加入了 SSL/TLS 這個安全協定層。它就像是在原本的 HTTP 訊息外圍,套上了一層可以進行「加解密與隱藏」的裝甲。
SSL 與 TLS 的區別
在網路安全協定的發展史上,一定經常聽到 SSL 和 TLS 這兩個詞,這兩個詞常常會被搞混或者互換使用,實際上他們是完全不同的東西,但它們之間確實有歷史淵源:
- SSL (Secure Sockets Layer):早在 1994 年由 網景公司 (Netscape) 所開發的網路安全協定。但發展到 SSL 3.0 後,因為被發現存在嚴重且無法修復的安全漏洞,目前已經被全面棄用。
- TLS (Transport Layer Security):IETF (網際網路工程任務組) 接手了 SSL 3.0 的架構並進行了標準化與升級,更名為 TLS。現在我們所使用的安全連線,實際上跑的全部都是 TLS(目前主流為 TLS 1.2 與極速的 TLS 1.3)。
雖然現代網路早就連 SSL 的影子都沒有了,但因為最初 SSL 的名氣太大,業界至今仍習慣將「TLS 憑證」通稱為「SSL 憑證」,或是稱作「SSL/TLS 憑證」。
TLS 的作用
明白了 TLS 的身世後,我們來看看它到底能做什麼。TLS 設計出來的目的,就是要一次性解決在開放網路上傳輸資料的三大核心威脅,分別對應資訊安全中被稱為「CIA 三要素」的重要目標:
- 加密(Confidentiality,保密性): 確保資料在傳輸過程中被轉換成人類與機器都無法直接閱讀的亂碼(密文)。即使駭客從中攔截了封包,沒有「解密鑰匙」也只會看到一堆毫無意義的亂碼字串,隱藏從第三方傳輸的機密資料。
- 驗證(Authentication,身分真實性): 防止「詐騙集團」。這確保了與你交換資訊的伺服器,真的是他所聲稱的那個實體(例如:你真的是連上 Google 的機房,而不是某個釣魚網站偽造的伺服器)。
- 完整性(Integrity,防篡改): 加密不代表資料不會被破壞。完整性校驗(通常透過 MAC 訊息鑑別碼完成)確保了資料在從 Server 傳送到你電腦的途中,沒有任何人偷改過裡面的匯款帳號或內容。
TLS 在 OSI 模型的位置
前面提到 TLS 就像是在 HTTP 訊息外圍,套上了一層可以進行「加解密與隱藏」的裝甲。那麼 TLS 在 OSI 模型中位於哪裡呢?
在標準的 OSI 七層參考模型中,HTTP 屬於最高層的「應用層」(第 7 層),而負責點對點傳輸的 TCP 屬於「傳輸層」(第 4 層)。嚴格來說,TLS 在設計上位於應用層與傳輸層之間。它在 OSI 模型中承擔了表達層 (Presentation Layer, 第 6 層) 負 責資料加密與解密的工作,以及部分會議層 (Session Layer, 第 5 層) 負責交握與連線狀態管理的工作。
當瀏覽器要發送 HTTP 請求時,資料會先向下傳遞給 TLS,TLS 負責把內容加密打包好之後,再丟給下方的 TCP 去分割傳送;接收端的流程則反之。這種分層設計非常優雅,因為這意味著 HTTP 協定本身完全不需要去管加密的邏輯,它只要把資料交給下層的 TLS 就好了。
從 HTTP 演進到 HTTPS 的過程
了解了 TLS 的工作崗位後,我們來拆解它是如何達成「加密」這項任務的。密碼學的演進就是一場不斷發現漏洞再補洞的過程。
對稱加密:同一個保險箱,同一把鑰匙
為了解決明信片被看光的問題,最直覺的想法就是買一個「保險箱」。
- 原理: 加密和解密使用同一把鑰匙(所以稱為「對稱」)。我用這把鑰匙把資料鎖上(加密為密文),你收到後必須用「一模一樣的鑰匙」打開(解密為明文)。現代最常見的高級對稱加密演算法是 AES。
- 優點: 數學運算非常單純,速度極快!非常適合用來加密像高畫質影片、大型檔案這種海量資料。
- 致命缺點:金鑰配送問題(Key Distribution Problem)。 想像一下,我要怎麼把這把「鑰匙」交給你?如果我直接在網路上把鑰匙傳過去,駭客只要攔截到這把鑰匙,他就能打開我們未來傳送的所有保險箱。這使得單純的對稱加密在網際網路上幾乎不可行。
非對稱加密:公鑰加密,私鑰解密
為了解決鑰匙半路被偷的問題,密碼編譯學家發明了極度聰明的「非對稱加密(例如 RSA 或 ECC)」。它不再只有一把鑰匙,而是成對出現:一把叫做公鑰 (Public Key),一把叫做私鑰 (Private Key)。
- 公鑰(大家都能拿): 就像是一個 「只能投進去、但打不開」的存錢筒投遞口,或是沒有上鎖的掛鎖。你可以大方地把公鑰廣播給全世界,駭客拿到也沒關係,因為公鑰只能用來鎖上資料。
- 私鑰(只有自己有): 就像是存錢筒底部的專屬解鎖鑰匙。這把鑰匙永遠藏在伺服器的深處,絕對不透過網路寄送。
- 通訊過程:
- 伺服器先把「公鑰(沒有鎖上的掛鎖)」傳給用戶。
- 用戶把想說的秘密放進箱子,用公鑰「咔嚓」鎖上傳送出去。
- 因為這世界上只有伺服器擁有那把「私鑰」,所以即使駭客攔截到上鎖的箱子,他也無能為力,只有伺服器打得開。
- 缺點: 這種數學運算異常複雜,導致加解密速度非常緩慢(通常比對稱加密慢幾百甚至上千倍)。如果用它來加密整個網頁的圖文內容,伺服器的 CPU 會被瞬間撐爆,網頁也會永遠載入不完。
HTTPS 的雙劍合璧:先用非對稱加密交換鑰匙,再用對稱加密加密資料
既然對稱加密「快但鑰匙難傳遞」,非對稱加密「安全但太慢」,HTTPS 最聰明的設計就是將兩者結合,取各自的優點:混合加密機制。
- 先用非對稱加密(安全交換): 伺服器先把自己的「公鑰」寄給瀏覽器。瀏覽器在本地隨機產生一組短暫、一次性的「對稱加密鑰匙材料」,也稱為「預主密鑰(Premaster Secret)」,並用剛剛拿到的公鑰把它鎖起來,安全地寄回給伺服器。
- 私鑰解密獲取金鑰: 全世界只有伺服器有私鑰,因此也只有伺服器能解開那個箱子,拿到那把材料。
- 改用對稱加密通訊(極速傳輸): 剛才安全傳遞的只是初步的鑰匙材料(Premaster Secret),伺服器解開後,雙方會在各自的電腦上,將其進一步算出 Master Secret (主密鑰),最後再從中衍生出最終真正拿來加解密資料的 Session Key (會話金鑰)。 現在雙方手裡都擁有一模一樣的 Session Key 了,接下來整個 HTTP 網頁的龐大內容,雙方就會愉快地使用這把效能極高的對稱金鑰來進行高速通訊。
在看完了結合兩種加密機制的概念後,你可能會想,那個所謂的「臨時對稱鑰匙材料」到底是什麼?其實為了確保最終金鑰絕對隨機安全,TLS 並沒有讓 Client 直接生出一把金鑰傳過去,而是經過三個循序漸進的階段來精煉:
- Premaster Secret (預主密鑰):這是 Client 在本地隨機產生的「初步原物料」。它是整個加密過程中最關鍵的機密,Client 會用 Server 的公鑰把它鎖上,並安全的傳遞給 Server。
- Master Secret (主密鑰):這是一個 48 bytes 的「半成品庫」。當 Server 拿到 Premaster Secret 後,雙方並不直接用它來加密,而是會各自將它加上連線一開始打招呼時交換的「兩個隨機亂數 (Client Random & Server Random)」,經過複雜的雜湊運算推導出來。
- Session Keys (會話金鑰):最後,雙方才從 Master Secret 中,一刀切分、衍生出最終用來進行對稱加密的「正式工具鑰匙」(實務上甚至會切分出好幾把,分別負責加密資料與核對 MAC 完整性)。當連線一中斷,這些鑰匙就會立刻被銷毀。
這就是為什麼在上述的流程圖中,被非對稱加密傳送的其實是「Premaster Secret」,而最終雙方互相對稱加密使用的則是「Session Key」!
中間人攻擊(Man-in-the-Middle, MitM)
上面這套由非對稱加密引導,最終導向對稱加密通訊的機制看似無懈可擊。但如果你仔細思考,會發現它存在一個致命的盲區:在第一步,Client 其實並不知道拿到的公鑰是否真的是 Server 的。
這個盲區就是惡名昭彰的 中間人攻擊 (MitM) 的攻擊點。那麼,什麼是中間人攻擊呢?最簡單的理解方法就是:「駭客對 Client 假扮成 Server,同時對 Server 假扮成 Client」。
這個破口就發生在一開始 Server 將「公鑰」傳給 Client 的瞬間。如果中間人(駭客)潛伏在你的網路環境中:
- 攔截與假冒:駭客攔截了目標伺服器的真實公鑰。接著,駭客自己偷偷生成了一對「駭客公鑰」與「駭客私鑰」,然後把「駭客公鑰」傳給你的瀏覽器,假扮自己是伺服器。
- 騙取 Premaster Secret A:你的瀏覽器毫不知情,用這個假公鑰加密了本地生成的初步材料
Premaster Secret A並傳送出去。駭客攔截後,輕鬆地用自己的「駭客私鑰」解開,並在底下提煉出與你對話的第一把工具鑰匙 (Session Key A)。 - 偽造 Premaster Secret B 騙過 Server:接著,駭客為了不讓 Server 起疑,自己生成了另一份
Premaster Secret B,用剛才攔截到的「真正的伺服器公鑰」重新加密傳給 Server,假扮自己是 Client。Server 解開後,與駭客建立起了第二把工具鑰匙 (Session Key B)。
從此之後,Client 和 Server 以為他們正在安全地一對一通訊,殊不知 Client 的加密資料都被駭客用 Session Key A 解開看光光,駭客看完後再用 Session Key B 幫忙重新加密傳給 Server。整個悲劇的根源就在於:缺乏一個能保證公鑰真實性的信任機制!
CA 憑證:打破中間人攻擊的信任機制
為了解決這個信任盲區,網路世界引入了最具權威的第三方公證人體系:憑證授權中心 (Certificate Authority, 簡稱 CA)。有了 CA,HTTPS 這塊安全拼圖才算真正完整。
憑證的作用:解決伺服器公鑰的信任問題
既然 Client 無法單純信任從網路另一端傳送來的公鑰,那大家就規定:伺服器不能直接給公鑰,而是必須給一張由公認的 CA 所頒發的「數位憑證 (Digital Certificate)」。
你可以把憑證想像成網路世界的「公司營業執照」加上「身 分證」。這張憑證裡面包著伺服器的真實公鑰。當瀏覽器看到這張憑證是由大家信得過的 CA 發出來的,就可以安心地相信裡面包裝的公鑰絕對不是駭客假冒的。
CA 憑證的信任問題:如何相信憑證是由 CA 發的?
問題又來了,如果駭客自己偽造了一張假的憑證傳給你怎麼辦?這時候就要利用密碼學的另一項技術:數位簽章 (Digital Signature)。
數位簽章的概念,就如同古代信使在信封封口處滴上熱蠟,並蓋上國王的專屬印章。如果有任何人在半路把信拆開、偷改內容或偷換裡面的公鑰,蠟封印記必然會碎裂或者重新蓋上的印章不吻合。而且因為這個專屬印章(私鑰)全天下只有 CA 擁有,別人絕對仿造不出來。只要核對印章是真的,就能斷定憑證絕對是 CA 核發的且未被篡改。
CA 憑證上有什麼內容
國際上通常採用 X.509 首要標準來規範憑證的格式。一張合格的數位憑證會包含以下重要資訊:
- 版本號 (Version) & 序號 (Serial Number):憑證的基本身分證號碼。
- 簽章演算法 (Signature Algorithm):標示這張憑證是用哪種數學方法簽名的(例如:
sha256WithRSAEncryption)。 - 發行者 (Issuer):這張憑證是誰核發的?(例如赫赫有名的 DigiCert, Let's Encrypt)。
- 有效期限 (Validity):憑證的起始與過期日期。
- 主體 (Subject):這張憑證頒發給哪個網域?(例如:
www.google.com)。 - 主體公鑰 (Subject Public Key Info):這是最最最關鍵的部分!該目標伺服器的真實公鑰就包在這裡面。
- 數位簽章 (Digital Signature):附在憑證末端的「國王印章」,用來保護以上所有的資訊。