🔒 什麼是HTTPS和SSL/TLS?
📖 定義
HTTPS(HyperText Transfer Protocol Secure, 超文本傳輸安全協定)是在HTTP上添加了安全層的協定。SSL(Secure Sockets Layer, 安全通訊端層)和TLS(Transport Layer Security, 傳輸層安全)是加密網際網路通訊的協定,TLS是SSL的後續版本。它們加密網站與使用者之間傳輸的資料以確保安全。
🎯 用類比理解
普通郵件 vs 掛號信
- HTTP: 像明信片一樣,任何人都能看到內容的通訊
- HTTPS: 像密封的掛號信一樣,只有本人能開啟的安全通訊
- SSL/TLS憑證: 郵件上的官方認證印章
用普通郵件(HTTP)發送密碼的話,郵局工作人員或其他人都能看到,但密封的掛號信(HTTPS)只有收件人能開啟。
⚙️ 工作原理
1. SSL/TLS握手過程
1. 客戶端 → 伺服器: "我想建立安全連接"
- 發送支援的加密方式列表
2. 伺服器 → 客戶端: "這是我的憑證"
- 發送SSL/TLS憑證和公鑰
3. 客戶端: 驗證憑證
- 檢查是否由可信CA(憑證頒發機構)頒發
- 驗證憑證有效性
4. 客戶端 → 伺服器: 建立加密會話金鑰
- 用伺服器公鑰加密會話金鑰並發送
5. 伺服器: 解密會話金鑰
- 用自己的私鑰解密會話金鑰
6. 開始安全通訊
- 用會話金鑰加密所有資料進行傳輸
2. 加密方式
非對稱加密 (握手)
├─ 公鑰: 加密資料
└─ 私鑰: 解密資料
對稱加密 (實際通訊)
└─ 會話金鑰: 快速加密/解密
💡 實際範例
HTTP vs HTTPS對比
// ❌ HTTP - 不安全
// http://example.com/login
// 密碼以明文傳輸
POST /login
Content-Type: application/json
{
"username": "user123",
"password": "mypassword123" // 任何人都能看到!
}
// ✅ HTTPS - 安全
// https://example.com/login
// 所有資料都被加密
POST /login
Content-Type: application/json
{
"username": "user123",
"password": "mypassword123" // 加密傳輸
}
SSL/TLS憑證驗證
在瀏覽器中點選鎖圖示:
✅ 安全網站
- 頒發給: example.com
- 頒發者: Let's Encrypt (可信CA)
- 有效期: 2024-01-01 ~ 2024-12-31
- 加密: TLS 1.3
⚠️ 需要注意
- 憑證已過期
- 自簽名憑證
- 憑證網域與網站網域不符
在Node.js中建立HTTPS伺服器
const https = require('https');
const fs = require('fs');
// 載入SSL/TLS憑證
const options = {
key: fs.readFileSync('private-key.pem'), // 私鑰
cert: fs.readFileSync('certificate.pem') // 憑證
};
// 建立HTTPS伺服器
https.createServer(options, (req, res) => {
res.writeHead(200);
res.end('安全的HTTPS連接!');
}).listen(443);
console.log('HTTPS伺服器在埠443上執行中');
🤔 常見問題
Q1. SSL和TLS有什麼區別?
A: SSL是舊協定,TLS是SSL的改進最新版本。但習慣上我們仍說"SSL憑證",實際使用的是TLS。
SSL 1.0 (不再使用)
SSL 2.0 (不再使用)
SSL 3.0 (不再使用)
TLS 1.0 (遺留)
TLS 1.1 (遺留)
TLS 1.2 (當前使用) ✅
TLS 1.3 (最新,最安全) ✅
Q2. 為什麼所有網站都應該使用HTTPS?
A: HTTPS保護以下方面:
1. 機密性 (Confidentiality)
└─ 第三方無法看到資料
2. 完整性 (Integrity)
└─ 確保資料未被中途竄改
3. 認證 (Authentication)
└─ 證明存取的網站是真實的
4. SEO優勢
└─ Google給HTTPS網站加分
Q3. Let's Encrypt是什麼?
A: 免費頒發SSL/TLS憑證的憑證頒發機構(CA)。
# 使用Certbot自動安裝
sudo certbot --nginx -d example.com
# 自動續期(每90天)
sudo certbot renew --dry-run
Q4. 什麼是混合內容(Mixed Content)警告?
A: 在HTTPS頁面上載入HTTP資源時產生的安全警告。
<!-- ❌ 混合內容 - 安全警告 -->
<html>
<head>
<!-- HTTPS頁面 -->
</head>
<body>
<!-- 載入HTTP圖片 - 產生警告! -->
<img src="http://example.com/image.jpg">
<!-- HTTP腳本 - 被阻止! -->
<script src="http://example.com/script.js"></script>
</body>
</html>
<!-- ✅ 正確方式 -->
<html>
<body>
<!-- 使用HTTPS -->
<img src="https://example.com/image.jpg">
<!-- 或使用協定相對URL -->
<img src="//example.com/image.jpg">
</body>
</html>
Q5. HTTPS會變慢嗎?
A: 過去是的,但現代TLS 1.3和硬體加速使效能差異幾乎可以忽略不計。
TLS 1.2握手: 2-RTT (往返時間)
TLS 1.3握手: 1-RTT
TLS 1.3重連: 0-RTT (立即連接!)
+ HTTP/2僅支援HTTPS → 實際上更快
🎓 下一步
了解HTTPS後,繼續學習:
- 什麼是CORS? (文件編寫中) - 與HTTPS同樣重要的Web安全
- JWT令牌 (文件編寫中) - 安全的認證方式
- 什麼是DNS? - 網域與安全
實踐練習
# 1. 建立自簽名憑證(開發用)
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes
# 2. 執行HTTPS伺服器
node https-server.js
# 3. 在瀏覽器中驗證
# https://localhost (忽略自簽名警告繼續)
🎬 總結
HTTPS和SSL/TLS是現代Web的必備安全技術:
- HTTPS: 在HTTP上添加安全層的協定
- SSL/TLS: 加密資料的安全協定
- 憑證: 證明網站身分的數位身分證
- 加密: 安全保護資料的技術
所有網站都應使用HTTPS來保護使用者。多虧了Let's Encrypt,現在可以免費輕鬆應用! 🔒✨