HTTP 與 HTTPS

深入理解 HTTP 與 HTTPS 協定的差異、運作流程、安全機制與實作最佳實踐


目錄

  1. 什麼是 HTTP 與 HTTPS
  2. HTTP vs HTTPS 比較
  3. HTTPS 運作流程
  4. 加密方式
  5. 實戰範例
  6. 最佳實踐
  7. 常見問題
  8. 總結

什麼是 HTTP 與 HTTPS

HTTP (HyperText Transfer Protocol)

  • 超文本傳輸協定
  • 用於在網路上傳輸網頁資料
  • 明文傳輸,資料未加密

HTTPS (HTTP Secure)

  • HTTP 的安全版本
  • 使用 SSL/TLS 加密協定
  • 加密傳輸,保護資料安全

HTTP vs HTTPS 比較

項目 HTTP HTTPS
端口 80 443
安全性 ❌ 明文傳輸 ✅ 加密傳輸
憑證 不需要 需要 SSL/TLS 憑證
速度 較快 略慢(加密開銷)
SEO 排名 較低 Google 優先排序
瀏覽器顯示 "不安全" 警告 🔒 綠鎖圖示
資料完整性 可能被竄改 確保完整性

傳輸方式差異

HTTP - 明文傳輸

客戶端 --------[明文資料]--------> 伺服器
       ⚠️ 容易被中間人攔截和竄改

範例:帳號密碼、信用卡資訊都是明文
攻擊者可以輕易讀取所有內容

HTTPS - 加密傳輸

客戶端 --------[加密資料]--------> 伺服器
       ✅ 使用 SSL/TLS 加密,無法被讀取

範例:即使被攔截,攻擊者也只能看到亂碼
需要私鑰才能解密

HTTPS 運作流程

TLS 握手過程 (TLS Handshake)

1. 客戶端 → 伺服器
   ClientHello: 我支援這些加密方式和 TLS 版本

2. 伺服器 → 客戶端
   ServerHello: 我們使用這個加密方式
   憑證: 這是我的 SSL/TLS 憑證(包含公鑰)

3. 客戶端
   驗證憑證是否由可信的 CA 簽發
   檢查憑證是否過期
   確認網域名稱是否匹配

4. 客戶端 → 伺服器
   使用伺服器公鑰加密一個隨機金鑰

5. 雙方
   使用協商好的對稱金鑰進行加密通訊
   之後的所有資料都用這個金鑰加密

詳細步驟說明

1. ClientHello

客戶端發送:

  • 支援的 TLS 版本(如 TLS 1.2, 1.3)
  • 支援的加密演算法列表
  • 隨機數(用於生成金鑰)

2. ServerHello

伺服器回應:

  • 選擇的 TLS 版本
  • 選擇的加密演算法
  • SSL/TLS 憑證
  • 伺服器隨機數

3. 憑證驗證

客戶端檢查:

  • 憑證是否由受信任的 CA 簽發
  • 憑證是否在有效期內
  • 網域名稱是否匹配
  • 憑證是否被撤銷

4. 金鑰交換

  • 客戶端生成 "預主密鑰" (Pre-Master Secret)
  • 用伺服器的公鑰加密後傳送
  • 只有伺服器的私鑰能解密

5. 開始加密通訊

  • 雙方使用相同的對稱金鑰
  • 對稱加密速度快,適合大量資料傳輸
  • 之後所有 HTTP 資料都經過加密

加密方式

混合加密系統

HTTPS 結合了兩種加密方式:

非對稱加密(RSA/ECC)

  • 用途:TLS 握手階段
  • 特點:安全但慢
  • 使用:公鑰加密,私鑰解密

對稱加密(AES)

  • 用途:資料傳輸階段
  • 特點:快速但需要共享金鑰
  • 使用:相同金鑰加解密

為什麼要混合使用?

非對稱加密 → 安全交換對稱金鑰
對稱加密   → 快速傳輸大量資料

結合兩者優點:安全 + 效能

HTTP/HTTPS 狀態碼

常見狀態碼

代碼 說明 意義
200 OK 請求成功
301 Moved Permanently 永久重定向(HTTP→HTTPS)
302 Found 臨時重定向
400 Bad Request 請求錯誤
401 Unauthorized 需要認證
403 Forbidden 拒絕存取
404 Not Found 找不到資源
500 Internal Server Error 伺服器錯誤
502 Bad Gateway 閘道錯誤
503 Service Unavailable 服務不可用

HTTPS 優勢

1. 資料加密

  • 防止中間人攻擊 (Man-in-the-Middle)
  • 保護敏感資訊(密碼、信用卡等)

2. 身份驗證

  • 確認網站真實身份
  • 防止釣魚網站

3. 資料完整性

  • 確保資料未被竂改
  • 偵測傳輸過程中的變更

4. SEO 優勢

  • Google 優先排序 HTTPS 網站
  • 提升搜尋引擎排名

5. 瀏覽器信任

  • 避免 "不安全" 警告
  • 提升使用者信任度

HTTP 到 HTTPS 的遷移

遷移步驟

  1. 取得 SSL/TLS 憑證

    • 使用 Let's Encrypt(免費)
    • 或購買商業憑證
  2. 伺服器配置

    • 安裝憑證
    • 配置 HTTPS
  3. 設定重定向

    • HTTP 自動跳轉到 HTTPS
    • 使用 301 永久重定向
  4. 更新內部連結

    • 修改為 HTTPS 連結
    • 避免混合內容警告
  5. 更新外部服務

    • 更新 CDN 設定
    • 更新 API 端點

常見問題

混合內容 (Mixed Content)

HTTPS 頁面載入 HTTP 資源
<img src="http://example.com/image.jpg">  ❌
<img src="https://example.com/image.jpg"> ✅

解決:將所有資源改為 HTTPS

實戰範例

範例 1:檢查與測試

使用 curl 測試

# 測試 HTTP 請求
curl -I http://example.com

# 測試 HTTPS 請求
curl -I https://example.com

# 查看完整的 TLS 握手過程
curl -v https://example.com

# 只顯示 HTTP 標頭
curl -I https://example.com

使用 openssl 檢查憑證

# 查看憑證詳細資訊
openssl s_client -connect example.com:443 -showcerts

# 查看憑證到期日
echo | openssl s_client -connect example.com:443 2>/dev/null | \
  openssl x509 -noout -dates

# 測試特定 TLS 版本
openssl s_client -connect example.com:443 -tls1_2
openssl s_client -connect example.com:443 -tls1_3

線上檢測工具

範例 2:HTTP 安全標頭配置

# HSTS - 強制使用 HTTPS
Strict-Transport-Security: max-age=31536000; includeSubDomains

# 防止點擊劫持
X-Frame-Options: DENY

# 防止 MIME 類型嗅探
X-Content-Type-Options: nosniff

# XSS 防護
X-XSS-Protection: 1; mode=block

# 內容安全策略
Content-Security-Policy: default-src 'self'

範例 3:HTTPS 效能優化

  1. 啟用 HTTP/2

    • 多路復用
    • 標頭壓縮
    • 伺服器推送
  2. Session Resumption

    • 減少 TLS 握手次數
    • 使用 Session ID 或 Session Ticket
  3. OCSP Stapling

    • 減少憑證驗證延遲
  4. 使用 CDN

    • 降低延遲
    • 分散 SSL 處理負載

最佳實踐

安全建議

  • ✅ 使用 TLS 1.2 或 TLS 1.3
  • ✅ 禁用 SSL 2.0/3.0 和 TLS 1.0/1.1(已過時)
  • ✅ 使用強加密演算法
  • ✅ 啟用 HSTS
  • ✅ 定期更新憑證
  • ✅ 使用完整的憑證鏈
  • ❌ 不要使用自簽憑證於正式環境
  • ❌ 不要忽略憑證警告

常見問題

問題 1:混合內容警告

問題:HTTPS 頁面載入 HTTP 資源

<!-- ❌ 錯誤 -->
<img src="http://example.com/image.jpg">

<!-- ✅ 正確 -->
<img src="https://example.com/image.jpg">

解決:將所有資源改為 HTTPS

問題 2:憑證過期

問題:網站顯示憑證過期警告

解決

  • 使用 Let's Encrypt 自動續期
  • 設定監控憑證到期日
  • 提前 30 天更新憑證

問題 3:SSL/TLS 握手失敗

問題:無法建立 HTTPS 連線

解決

# 檢查 TLS 版本
openssl s_client -connect example.com:443 -tls1_2

# 檢查憑證鏈
openssl s_client -connect example.com:443 -showcerts

總結

核心要點

  1. HTTPS 必要性

    • 保護資料傳輸安全
    • 提升 SEO 排名
    • 增加使用者信任
  2. TLS 握手流程

    • 協商加密方式
    • 驗證伺服器憑證
    • 建立加密通道
  3. 混合加密系統

    • 非對稱加密(RSA/ECC):安全交換金鑰
    • 對稱加密(AES):快速傳輸資料
  4. 安全最佳實踐

    • 使用 TLS 1.2 或更高版本
    • 啟用 HSTS
    • 配置安全標頭
    • 定期更新憑證

快速參考

項目 HTTP HTTPS
端口 80 443
加密 ❌ 無 ✅ TLS/SSL
SEO 較低 優先排序
安全性

建立日期:2025-10-28 最後更新:2025-11-18

🔗相關文章