跳至正文

🔒 什麼是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後,繼續學習:

  1. 什麼是CORS? (文件編寫中) - 與HTTPS同樣重要的Web安全
  2. JWT令牌 (文件編寫中) - 安全的認證方式
  3. 什麼是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,現在可以免費輕鬆應用! 🔒✨