1. 故事
按「下一步」一步一步看。每一步都有一位角色出場,解釋自己正在做什麼。
序幕:溫習一下
第 1 步/共 12 步
先查名字,再握手
讓我查一查……example.com 的 IP Address(網絡位址)是 192.0.2.80!接著阿麥和伺服器用 TCP(傳輸控制協定)三次握手,連接網頁常用的 Port 443。
動畫文字版(全部步驟)
- 序幕:溫習一下
- 先查名字,再握手 查查博士:讓我查一查……
example.com的 IP Address(網絡位址)是192.0.2.80!接著阿麥和伺服器用 TCP(傳輸控制協定)三次握手,連接網頁常用的 Port 443。 - 第一幕:明信片的煩惱
- 同一個 Wi-Fi 裡的偷聽者 小比:咖啡店的 Wi-Fi 是公共的,任何人都可以加入。偷聽者的電腦也在這裡,而無線電波在空氣中傳送,附近的裝置都收得到。
- 用 HTTP 送密碼? 小比:如果用 HTTP(超文本傳輸協定),我背包裡的信好像一張明信片:「用戶:阿麥,密碼:……」偷聽者收到訊號的副本,一字不漏看得清清楚楚!
- 三個風險 盾盾:我是盾盾,守在網絡出口的 Firewall(防火牆)。明信片有三個風險:偷看、竄改和冒充:有人可以看你的資料、改你的網頁,甚至扮成
example.com騙你的密碼。我只看地址和 Port,看不到信的內容;HTTP 的明信片,我也攔不住別人偷看。- 偷看:讀取密碼和內容
- 竄改:在網頁中加入廣告或惡意程式
- 冒充:假扮成真的網站
- 第二幕:TLS 封好信口
- ClientHello 小比:改用 HTTPS!先做 TLS(傳輸層安全) 握手。我帶著 ClientHello 出發:「我支援 TLS 1.3 和這些加密方法;這是我的鎖匙材料;我要找
example.com。」- HTTPS = HTTP + TLS
- TLS 握手在 TCP 三次握手之後進行
- ServerHello 與證書 小比:伺服器回覆 ServerHello,附上自己的鎖匙材料,再出示它的 Digital Certificate(數碼證書):「我真的是
example.com,這是證明。」 - 驗明正身 小比:阿麥的瀏覽器仔細檢查證書:由可信的 CA(核證機關) 簽發嗎?名字是
example.com嗎?過期了沒有?全部合格!就算有人騙了查查博士的電話簿,假伺服器最多只能抄一份證書,卻沒有配對的 Private Key(私人金鑰),證明不了證書是自己的。- ① 簽發者:瀏覽器內置的可信 CA
- ② 名字:
example.com - ③ 有效期:未過期
- 任何一項不合格 → 瀏覽器顯示警告
- 各自算出同一把鎖匙 小比:阿麥和伺服器用剛才交換的鎖匙材料,在自己那邊計算出同一把鎖匙。鎖匙從來沒有在網絡上傳送,偷聽者就算收齊材料,也算不出來!
- 這種方法叫 Diffie-Hellman Key Exchange(金鑰交換)
- 每次對話都用一把新鎖匙
- 封了口的信 小比:現在我背包裡的信全部加密了。偷聽者收到的副本只是一堆亂碼;如果有人中途改動內容,伺服器會立即發現。
- 第三幕:盾盾的提醒
- 還看得到什麼? 盾盾:如果我站在咖啡店的網絡出口,我看得到小比寄往
192.0.2.80、Port 443,通常也看得到網站名稱。但信的內容、密碼和網址路徑,我全部看不到。HTTPS 保護的是內容。 - 鎖頭不等於好人 盾盾:提醒大家:我只檢查地址和 Port,分辨不了網站的真假。騙徒也可以為
example.com.example.net這種假名字申請合法證書。鎖頭只代表「你正在和這個名字私下對話」。登入前,一定要看清楚網址! - 總結:封了口的信 小比: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 為例:
- ClientHello:阿麥的瀏覽器說:「我支援 TLS 1.3 和這幾種加密方法;這是我的鎖匙材料;我要找
example.com。」 - ServerHello:伺服器選定加密方法,附上自己的鎖匙材料。
- 雙方各自算出鎖匙:用剛才交換的材料,兩邊在自己那邊計算出同一把鎖匙。
- 出示證書並簽名:伺服器送上 Digital Certificate,再用證書配對的 Private Key(私人金鑰)簽一個名,證明證書真的屬於它。
- 瀏覽器檢查:證書合格、簽名正確,握手完成。
- 正式傳送:之後所有 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. 動手試試
任務:看看你的連線
- 用電腦的瀏覽器打開任何一個
https://網站。 - 按網址列左邊的鎖頭或設定圖示,找「連線安全」或「證書」。
- 看看證書發給哪個網域、由哪一個 CA 簽發、何時到期。
- 想一想:如果網址是
example.com.example.net(開頭看似 example.com,其實屬於 example.net),它能不能也有一個鎖頭?(答案:可以!)
小互動
HTTPS 保護了什麼?
在公共 Wi-Fi 上用 HTTPS,以下哪些偷聽者看不到,哪些仍然看得到?
-
1你輸入的密碼
-
2你的 IP Address
-
3你連接的網站名稱
-
4網頁的內容
-
5你連接的 Port 號碼(443)
-
6網址的路徑,例如 /login
全部分對了!HTTPS 保護內容(密碼、網頁、路徑);位址、Port 和網站名稱通常仍然看得到。
6. 比喻的極限
- 不是真的有一個信封。 TLS 用數學把資料變成亂碼;「封口」和「火漆印」只是比喻加密和防竄改。
- 鎖頭不等於好人。 騙徒也可以為
example.com.example.net這種相似名字申請合法證書。鎖頭只代表「你正在和這個名字私下對話」,不代表網站可信。 - 偷聽不一定那麼容易。 用 WPA(Wi-Fi 保護存取)加密的 Wi-Fi 會令偷聽困難得多;但你無法確定公共 Wi-Fi 的設定,所以仍要靠 HTTPS 保護自己。
- HTTPS 只保護路途上的一段。 資料到了伺服器就會被解開;伺服器怎樣保管你的資料,HTTPS 管不到。
- 身份證也有漏洞。 如果你的電腦被人安裝了假的「可信 CA」,瀏覽器可能不會發出警告;所以不要隨便安裝來歷不明的證書。
7. 小測驗
8. 重點筆記
- HTTPS = HTTP + TLS(傳輸層安全),防止偷看、竄改和冒充。
- 伺服器出示由 CA(核證機關)簽發的 Digital Certificate(數碼證書),並用 Private Key 簽名,證明自己真的是
example.com。 - 雙方用 Diffie-Hellman Key Exchange 各自算出同一把鎖匙,鎖匙從不在網絡上傳送。
- HTTPS 加密內容、密碼和網址路徑;IP Address、Port 和網站名稱通常仍然看得到。
- 鎖頭不等於網站可信,登入前一定要看清楚網址。
延伸閱讀
HTTPS 把每一封信封好口,但只限支援 HTTPS 的網站和程式。如果阿麥想由咖啡店安全地連回家,使用家中那些沒有加密的裝置,又可以怎樣做?下一個故事,路路和盾盾會一起挖一條秘密隧道:VPN(虛擬私人網絡)。