目錄
什麼是 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 的遷移
遷移步驟
-
取得 SSL/TLS 憑證
- 使用 Let's Encrypt(免費)
- 或購買商業憑證
-
伺服器配置
- 安裝憑證
- 配置 HTTPS
-
設定重定向
- HTTP 自動跳轉到 HTTPS
- 使用 301 永久重定向
-
更新內部連結
- 修改為 HTTPS 連結
- 避免混合內容警告
-
更新外部服務
- 更新 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
線上檢測工具
-
SSL Labs: https://www.ssllabs.com/ssltest/
- 評分 SSL/TLS 配置
- 檢查安全漏洞
-
Security Headers: https://securityheaders.com/
- 檢查安全標頭設定
範例 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 效能優化
-
啟用 HTTP/2
- 多路復用
- 標頭壓縮
- 伺服器推送
-
Session Resumption
- 減少 TLS 握手次數
- 使用 Session ID 或 Session Ticket
-
OCSP Stapling
- 減少憑證驗證延遲
-
使用 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
總結
核心要點
-
HTTPS 必要性:
- 保護資料傳輸安全
- 提升 SEO 排名
- 增加使用者信任
-
TLS 握手流程:
- 協商加密方式
- 驗證伺服器憑證
- 建立加密通道
-
混合加密系統:
- 非對稱加密(RSA/ECC):安全交換金鑰
- 對稱加密(AES):快速傳輸資料
-
安全最佳實踐:
- 使用 TLS 1.2 或更高版本
- 啟用 HSTS
- 配置安全標頭
- 定期更新憑證
快速參考
| 項目 | HTTP | HTTPS |
|---|---|---|
| 端口 | 80 | 443 |
| 加密 | ❌ 無 | ✅ TLS/SSL |
| SEO | 較低 | 優先排序 |
| 安全性 | 低 | 高 |
建立日期:2025-10-28 最後更新:2025-11-18