網絡小故事 17 · 進階

封了口的信HTTPS 與 TLS(傳輸層安全)

網址旁邊的鎖頭,到底鎖住了什麼?

主角:小比、查查博士、盾盾閱讀時間約 10 分鐘

建議先讀:第 10 課

1. 故事

按「下一步」一步一步看。每一步都有一位角色出場,解釋自己正在做什麼。

序幕:溫習一下

第 1 步/共 12 步

先查名字,再握手

讓我查一查……example.com 的 IP Address(網絡位址)是 192.0.2.80!接著阿麥和伺服器用 TCP(傳輸控制協定)三次握手,連接網頁常用的 Port 443。

動畫文字版(全部步驟)
  1. 序幕:溫習一下
  2. 先查名字,再握手 查查博士:讓我查一查……example.com 的 IP Address(網絡位址)是 192.0.2.80!接著阿麥和伺服器用 TCP(傳輸控制協定)三次握手,連接網頁常用的 Port 443。
  3. 第一幕:明信片的煩惱
  4. 同一個 Wi-Fi 裡的偷聽者 小比:咖啡店的 Wi-Fi 是公共的,任何人都可以加入。偷聽者的電腦也在這裡,而無線電波在空氣中傳送,附近的裝置都收得到。
  5. 用 HTTP 送密碼? 小比:如果用 HTTP(超文本傳輸協定),我背包裡的信好像一張明信片:「用戶:阿麥,密碼:……」偷聽者收到訊號的副本,一字不漏看得清清楚楚!
  6. 三個風險 盾盾:我是盾盾,守在網絡出口的 Firewall(防火牆)。明信片有三個風險:偷看、竄改和冒充:有人可以看你的資料、改你的網頁,甚至扮成 example.com 騙你的密碼。我只看地址和 Port,看不到信的內容;HTTP 的明信片,我也攔不住別人偷看。
    • 偷看:讀取密碼和內容
    • 竄改:在網頁中加入廣告或惡意程式
    • 冒充:假扮成真的網站
  7. 第二幕:TLS 封好信口
  8. ClientHello 小比:改用 HTTPS!先做 TLS(傳輸層安全) 握手。我帶著 ClientHello 出發:「我支援 TLS 1.3 和這些加密方法;這是我的鎖匙材料;我要找 example.com。」
    • HTTPS = HTTP + TLS
    • TLS 握手在 TCP 三次握手之後進行
  9. ServerHello 與證書 小比:伺服器回覆 ServerHello,附上自己的鎖匙材料,再出示它的 Digital Certificate(數碼證書):「我真的是 example.com,這是證明。」
  10. 驗明正身 小比:阿麥的瀏覽器仔細檢查證書:由可信的 CA(核證機關) 簽發嗎?名字是 example.com 嗎?過期了沒有?全部合格!就算有人騙了查查博士的電話簿,假伺服器最多只能抄一份證書,卻沒有配對的 Private Key(私人金鑰),證明不了證書是自己的。
    • ① 簽發者:瀏覽器內置的可信 CA
    • ② 名字:example.com
    • ③ 有效期:未過期
    • 任何一項不合格 → 瀏覽器顯示警告
  11. 各自算出同一把鎖匙 小比:阿麥和伺服器用剛才交換的鎖匙材料,在自己那邊計算出同一把鎖匙。鎖匙從來沒有在網絡上傳送,偷聽者就算收齊材料,也算不出來!
    • 這種方法叫 Diffie-Hellman Key Exchange(金鑰交換)
    • 每次對話都用一把新鎖匙
  12. 封了口的信 小比:現在我背包裡的信全部加密了。偷聽者收到的副本只是一堆亂碼;如果有人中途改動內容,伺服器會立即發現。
  13. 第三幕:盾盾的提醒
  14. 還看得到什麼? 盾盾:如果我站在咖啡店的網絡出口,我看得到小比寄往 192.0.2.80、Port 443,通常也看得到網站名稱。但信的內容、密碼和網址路徑,我全部看不到。HTTPS 保護的是內容。
  15. 鎖頭不等於好人 盾盾:提醒大家:我只檢查地址和 Port,分辨不了網站的真假。騙徒也可以為 example.com.example.net 這種假名字申請合法證書。鎖頭只代表「你正在和這個名字私下對話」。登入前,一定要看清楚網址!
  16. 總結:封了口的信 小比:HTTPS = HTTP + TLS:先驗明正身,再各自算出鎖匙,然後把信封好口。在公共 Wi-Fi 上,看到網址是 https://,而且名字正確,才輸入密碼!

2. 問題在哪裡

阿麥在咖啡店上網,地址是 192.168.0.23。咖啡店的 Wi-Fi(無線網絡)是公共的,任何人都可以加入,偷聽者也可以坐在旁邊。

如果網站只用 HTTP(超文本傳輸協定),小比背包裡的信就像一張明信片:途經的人全部看得到。這帶來三個風險:

風險 壞人做什麼 例子
偷看 讀取你送出和收到的內容 密碼、訊息、信用卡號碼
竄改 在途中改動內容 在網頁中加入廣告或惡意程式
冒充 扮成真的網站 假的 example.com 登入頁,騙你輸入密碼

HTTP 本身完全沒有辦法防止這三件事。

盾盾是守在網絡出口的 Firewall(防火牆),負責檢查進出的封包;小故事 19 會詳細介紹他的名單。不過他只看地址和 Port(連接埠),看不到信的內容,所以也幫不上忙。

3. 網絡怎樣解決

改用 HTTPS(加密網頁傳輸協定),也就是 HTTP 加上 TLS(傳輸層安全)。TLS 是一套為連線加密、並證明伺服器身份的技術。

它好像寄信前先做三件事:先看清楚收件人的身份證,再和對方約定一把只有你們知道的鎖匙,最後把信封口,蓋上火漆印。

身份證就是 Digital Certificate(數碼證書);封口令人看不到內容;火漆印一旦被弄破,對方就知道信被改過。

4. 看深一點

TLS 1.3 握手,一步一步

TLS 握手在 TCP(傳輸控制協定)三次握手之後進行,伺服器通常在 Port 443 等候。以 TLS 1.3 為例:

  1. ClientHello:阿麥的瀏覽器說:「我支援 TLS 1.3 和這幾種加密方法;這是我的鎖匙材料;我要找 example.com。」
  2. ServerHello:伺服器選定加密方法,附上自己的鎖匙材料。
  3. 雙方各自算出鎖匙:用剛才交換的材料,兩邊在自己那邊計算出同一把鎖匙。
  4. 出示證書並簽名:伺服器送上 Digital Certificate,再用證書配對的 Private Key(私人金鑰)簽一個名,證明證書真的屬於它。
  5. 瀏覽器檢查:證書合格、簽名正確,握手完成。
  6. 正式傳送:之後所有 HTTP 請求和回覆,都用那把鎖匙加密。

在真正的 TLS 1.3 裡,第 3 步緊接在 ServerHello 之後,所以證書本身也是加密送出的。動畫為了容易理解,先講證書、後講鎖匙。

伺服器 192.0.2.80 是誰?

查查博士查到 example.com 的位址是 192.0.2.80。留意:192 開頭不一定是 Private,只有 192.168 開頭才是。192.0.2.80 是互聯網上的公共位址(本網站用的是文件專用的示範位址)。

證書怎樣「驗明正身」?

Digital Certificate 是一份電子文件,寫著「這個網域的公開鎖匙是這一條」,並由 CA(核證機關)簽發。CA 是負責核實網域擁有人、再為證書簽名的機構。瀏覽器和作業系統出廠時,已內置一份可信 CA 名單。

瀏覽器會檢查三件事:

檢查項目 問題 不合格會怎樣
簽發者 是由可信的 CA 簽發的嗎? 顯示安全警告
名字 證書上的名字是 example.com 嗎? 顯示安全警告
有效期 證書過期了沒有? 顯示安全警告

證書是公開的,任何人都可以抄一份。所以就算有人騙了查查博士的電話簿,假伺服器最多只能抄一份證書,卻沒有配對的 Private Key,通過不了第 4 步的簽名考驗,證明不了證書是自己的。

鎖匙從來沒有在網絡上傳送

雙方交換的只是「鎖匙材料」,真正的鎖匙在兩邊各自計算出來。這種方法叫 Diffie-Hellman Key Exchange(金鑰交換)。偷聽者就算收齊所有材料,也算不出鎖匙。

每次連線都會用一把新鎖匙。之後的資料用 Symmetric Encryption(對稱加密)保護,即是加密和解密都用同一把鎖匙,速度很快。每一段加密資料還附有檢查碼,途中被改動一個位元,收件人都會發現。

加密之後,還看得到什麼?

TLS 只加密「信的內容」。IP 標頭寫著寄件人和收件人的 IP Address(網絡位址),要讓沿途的 Router(路由器)找路,TCP 標頭要讓對方知道交給哪個程式,所以都不能加密。

看得到:寄件人 IP、收件人 IP 192.0.2.80、Port 443、網站名稱(通常)
看不到:網址路徑(例如 /login)、密碼、網頁內容、Cookie

網站名稱為什麼通常看得到?因為 ClientHello 裡有一欄 SNI(伺服器名稱指示),用明文寫著你要找的網域,讓同一部伺服器知道該拿出哪一張證書。較新的技術 ECH(加密 ClientHello)可以把這個名字也加密,但未必所有網站都支援。

5. 動手試試

任務:看看你的連線

  1. 用電腦的瀏覽器打開任何一個 https:// 網站。
  2. 按網址列左邊的鎖頭或設定圖示,找「連線安全」或「證書」。
  3. 看看證書發給哪個網域、由哪一個 CA 簽發、何時到期。
  4. 想一想:如果網址是 example.com.example.net(開頭看似 example.com,其實屬於 example.net),它能不能也有一個鎖頭?(答案:可以!)

小互動

HTTPS 保護了什麼?

在公共 Wi-Fi 上用 HTTPS,以下哪些偷聽者看不到,哪些仍然看得到?

  1. 1你輸入的密碼

  2. 2你的 IP Address

  3. 3你連接的網站名稱

  4. 4網頁的內容

  5. 5你連接的 Port 號碼(443)

  6. 6網址的路徑,例如 /login

6. 比喻的極限

  • 不是真的有一個信封。 TLS 用數學把資料變成亂碼;「封口」和「火漆印」只是比喻加密和防竄改。
  • 鎖頭不等於好人。 騙徒也可以為 example.com.example.net 這種相似名字申請合法證書。鎖頭只代表「你正在和這個名字私下對話」,不代表網站可信。
  • 偷聽不一定那麼容易。 用 WPA(Wi-Fi 保護存取)加密的 Wi-Fi 會令偷聽困難得多;但你無法確定公共 Wi-Fi 的設定,所以仍要靠 HTTPS 保護自己。
  • HTTPS 只保護路途上的一段。 資料到了伺服器就會被解開;伺服器怎樣保管你的資料,HTTPS 管不到。
  • 身份證也有漏洞。 如果你的電腦被人安裝了假的「可信 CA」,瀏覽器可能不會發出警告;所以不要隨便安裝來歷不明的證書。

7. 小測驗

第 1 題,共 3 題TLS 為 HTTPS 提供哪三種保護?
第 2 題,共 3 題瀏覽器檢查伺服器的 Digital Certificate 時,不會檢查以下哪一項?
第 3 題,共 3 題在公共 Wi-Fi 上用 HTTPS 登入網站,偷聽者看得到什麼?

8. 重點筆記

  • HTTPS = HTTP + TLS(傳輸層安全),防止偷看、竄改和冒充。
  • 伺服器出示由 CA(核證機關)簽發的 Digital Certificate(數碼證書),並用 Private Key 簽名,證明自己真的是 example.com。
  • 雙方用 Diffie-Hellman Key Exchange 各自算出同一把鎖匙,鎖匙從不在網絡上傳送。
  • HTTPS 加密內容、密碼和網址路徑;IP Address、Port 和網站名稱通常仍然看得到。
  • 鎖頭不等於網站可信,登入前一定要看清楚網址。

延伸閱讀

HTTPS 把每一封信封好口,但只限支援 HTTPS 的網站和程式。如果阿麥想由咖啡店安全地連回家,使用家中那些沒有加密的裝置,又可以怎樣做?下一個故事,路路和盾盾會一起挖一條秘密隧道:VPN(虛擬私人網絡)。