SSL/TLS 憑證

深入理解 SSL/TLS 憑證的運作原理、類型分類、驗證流程與實務應用


目錄

  1. 什麼是 SSL/TLS 憑證
  2. 憑證類型
  3. 憑證驗證鏈
  4. 取得與安裝憑證
  5. 實戰範例
  6. 最佳實踐
  7. 常見問題
  8. 總結

什麼是 SSL/TLS 憑證

SSL/TLS 憑證是一種數位憑證,用於:

  • 身份驗證:證明網站的真實身份
  • 資料加密:提供公鑰用於建立加密連線
  • 資料完整性:確保資料未被竄改

SSL vs TLS

項目 SSL TLS
全名 Secure Sockets Layer Transport Layer Security
狀態 已廢棄 現行標準
版本 SSL 2.0, 3.0 TLS 1.0, 1.1, 1.2, 1.3
安全性 已知漏洞 持續改進

現況:雖然常說 "SSL 憑證",但實際上現在都是使用 TLS 協定。

憑證的作用

1. 身份驗證

使用者 → 我如何知道這真的是 google.com?
憑證   → 我由可信的 CA 簽發,證明這是真的 Google

2. 加密通訊

憑證包含公鑰 → 用於加密傳輸的對稱金鑰
               → 只有伺服器的私鑰能解密

3. 資料完整性

使用數位簽章確保:
- 憑證本身未被竄改
- 傳輸的資料未被修改

憑證類型

依驗證級別分類

項目 DV (Domain Validation) OV (Organization Validation) EV (Extended Validation)
中文名稱 網域驗證憑證 組織驗證憑證 擴展驗證憑證
驗證內容 僅驗證網域所有權 網域 + 組織真實性 嚴格的組織身份驗證
驗證方式 • Email 驗證
• DNS 記錄驗證
• HTTP 檔案驗證
• 網域所有權
• 公司登記資料
• 電話確認
• 完整公司查核
• 法律文件審查
• 營運地址確認
• 電話訪談
簽發時間 幾分鐘 1-3 天 1-2 週
價格 免費或便宜 💰 中等 💰💰 昂貴
信任等級 基本 中等 最高
顯示組織名稱 ❌ 否 ✅ 是 ✅ 是(舊版瀏覽器顯示綠色)
適用場景 個人網站、部落格 企業官網、B2B 平台 銀行、金融、電商、支付
代表範例 Let's Encrypt 商業 CA 的 OV 方案 DigiCert EV、Sectigo EV

依涵蓋範圍分類

單一網域憑證 (Single Domain)

涵蓋:example.com
不涵蓋:www.example.com, blog.example.com

多網域憑證 (Multi-Domain / SAN)

涵蓋:
- example.com
- www.example.com
- shop.example.com
- another-domain.com

萬用憑證 (Wildcard)

涵蓋:
- *.example.com
  → www.example.com ✅
  → blog.example.com ✅
  → api.example.com ✅

不涵蓋:
- example.com ❌(需額外新增)
- sub.blog.example.com ❌(多層子網域)

憑證內容結構

什麼是 X.509?

X.509 是 國際標準的數位憑證格式,由 ITU-T(國際電信聯盟)制定,定義了憑證應該包含哪些欄位以及如何編碼。

問題 答案
X.509 是什麼? 數位憑證的國際標準格式
誰制定的? ITU-T(國際電信聯盟)
目前版本? v3(支援擴展欄位)
為什麼重要? 統一格式讓所有瀏覽器/系統都能解讀憑證
類比:
就像身分證有固定欄位(姓名、出生日期、照片位置)
X.509 定義憑證的固定欄位(主體、公鑰、有效期、簽章)

X.509 v3 憑證欄位

欄位 英文名稱 說明 範例
版本號 Version 憑證格式版本 v3
序號 Serial Number CA 分配的唯一識別碼 01:A2:B3:C4...
簽名演算法 Signature Algorithm CA 簽署憑證使用的演算法 SHA256withRSA
簽發者 Issuer 簽發此憑證的 CA 資訊 DigiCert Inc.
有效期限 Validity 憑證的生效與到期時間 Not Before / Not After
主體 Subject 憑證持有者資訊 CN=example.com, O=公司名
公鑰 Subject Public Key Info 持有者的公鑰及演算法 RSA 2048 bit
擴展欄位 Extensions (v3) 額外資訊如 SAN、用途限制 Key Usage, SAN
數位簽章 Signature CA 用私鑰對憑證的簽署 (二進位資料)

Subject 主體欄位詳解

縮寫 全名 說明 範例
CN Common Name 網域名稱(最重要) example.com
O Organization 組織/公司名稱 Example Inc.
OU Organizational Unit 部門名稱 IT Department
L Locality 城市 Taipei
ST State 州/省 Taiwan
C Country 國家代碼(2 碼) TW

憑證結構圖

X.509 v3 憑證
├── 版本號 (Version: 3)
├── 序號 (Serial Number)
├── 簽名演算法 (Signature Algorithm)
├── 簽發者 (Issuer)
│   └── CA 的識別資訊
├── 有效期限 (Validity)
│   ├── Not Before: 2024-01-01
│   └── Not After: 2025-01-01
├── 主體 (Subject)
│   ├── CN (Common Name): example.com
│   ├── O (Organization): Example Inc.
│   ├── L (Locality): Taipei
│   └── C (Country): TW
├── 公鑰 (Subject Public Key Info)
│   ├── 演算法: RSA 2048 bit
│   └── 公鑰值
├── 擴展欄位 (Extensions) ← v3 新增
│   ├── Subject Alternative Names (SAN)
│   ├── Key Usage
│   └── Extended Key Usage
└── 數位簽章 (Signature)
    └── CA 的私鑰簽名

查看憑證內容

# 查看憑證詳細資訊
openssl x509 -in certificate.crt -text -noout

# 查看憑證的網域名稱
openssl x509 -in certificate.crt -noout -subject

# 查看憑證到期日
openssl x509 -in certificate.crt -noout -dates

# 查看憑證的公鑰
openssl x509 -in certificate.crt -noout -pubkey

憑證驗證鏈 (Certificate Chain)

信任鏈結構

根憑證 (Root CA)
  │ 自我簽署,內建於作業系統/瀏覽器
  ↓ 簽發
中繼憑證 (Intermediate CA)
  │ 由根憑證簽發
  │ 實際簽發網站憑證
  ↓ 簽發
網站憑證 (End Entity / Leaf Certificate)
  │ 你的網站憑證
  └── example.com

為什麼需要中繼憑證?

安全性

  • 根憑證離線保存,減少風險
  • 中繼憑證被破解時,只需撤銷中繼憑證

靈活性

  • 可以簽發不同類型的中繼憑證
  • 便於管理和撤銷

完整的憑證鏈

伺服器應該提供:

1. 網站憑證 (example.com)
2. 中繼憑證 (Intermediate CA)
3. 根憑證(通常不需要,因為已內建)

檢查憑證鏈

# 查看完整憑證鏈
openssl s_client -connect example.com:443 -showcerts

# 驗證憑證鏈
openssl verify -CAfile ca-bundle.crt example.com.crt

憑證驗證過程

瀏覽器驗證步驟

1. 接收憑證
2. 檢查有效期限
   ├─ 已過期? → ❌ 顯示警告
   └─ 未生效? → ❌ 顯示警告
3. 檢查網域名稱
   ├─ CN 或 SAN 匹配?
   ├─ Yes → ✅ 繼續
   └─ No → ❌ 網域名稱不符
4. 驗證憑證鏈
   ├─ 找到中繼憑證?
   ├─ 追溯到受信任的根憑證?
   ├─ Yes → ✅ 繼續
   └─ No → ❌ 無法驗證
5. 檢查撤銷狀態
   ├─ CRL (憑證撤銷清單)
   ├─ OCSP (線上憑證狀態協定)
   ├─ 未被撤銷? → ✅
   └─ 已撤銷? → ❌ 憑證無效
6. 驗證數位簽章
   ├─ 使用 CA 公鑰驗證
   ├─ 簽章正確? → ✅
   └─ 簽章錯誤? → ❌ 憑證被竄改
✅ 全部通過 → 顯示 🔒 綠鎖
❌ 任一失敗 → 顯示警告

憑證提供商 (CA)

免費憑證

Let's Encrypt

  • 類型:DV 憑證
  • 價格:完全免費
  • 有效期:90 天(可自動續期)
  • 支援:單一網域、萬用憑證
  • 特點:自動化簽發,廣泛支援
  • 限制:僅 DV,無 OV/EV

ZeroSSL

  • 類型:DV 憑證
  • 價格:免費(有限制)/ 付費
  • 有效期:90 天
  • 特點:類似 Let's Encrypt

商業憑證提供商

DigiCert

  • 類型:DV, OV, EV
  • 特點:業界領導品牌,企業級支援
  • 價格:$$$$

Sectigo (原 Comodo)

  • 類型:DV, OV, EV
  • 特點:性價比高
  • 價格:$$ - $$$

GlobalSign

  • 類型:DV, OV, EV
  • 特點:國際認證
  • 價格:$$$ - $$$$

如何選擇?

需求 建議
個人部落格、小型網站 Let's Encrypt(免費 DV)
中小企業官網 商業 OV 憑證
電商、金融平台 EV 憑證
需要多網域 Multi-Domain 或萬用憑證

實戰範例

範例 1:使用 Let's Encrypt 取得免費憑證

1. 安裝 Certbot

# Ubuntu/Debian
sudo apt update
sudo apt install certbot python3-certbot-nginx

# CentOS/RHEL
sudo yum install certbot python3-certbot-nginx

2. 取得憑證(Nginx)

# 自動配置 Nginx
sudo certbot --nginx -d example.com -d www.example.com

# 僅取得憑證,手動配置
sudo certbot certonly --nginx -d example.com

3. 自動續期

# 測試續期
sudo certbot renew --dry-run

# 設定自動續期(Cron)
sudo crontab -e
# 每天凌晨 2:00 檢查並續期
0 2 * * * certbot renew --quiet

範例 2:使用商業憑證

1. 生成 CSR (Certificate Signing Request)

# 生成私鑰和 CSR
openssl req -new -newkey rsa:2048 -nodes \
  -keyout example.com.key \
  -out example.com.csr

# 填寫資訊
Country Name: TW
State: Taiwan
Locality: Taipei
Organization: Example Inc.
Common Name: example.com
Email: admin@example.com

2. 提交 CSR 給 CA

  • 上傳 CSR 到 CA 網站
  • 完成網域驗證
  • 等待簽發

3. 下載憑證

  • 網站憑證 (example.com.crt)
  • 中繼憑證 (intermediate.crt)
  • 合併憑證鏈
# 合併憑證鏈
cat example.com.crt intermediate.crt > fullchain.crt

範例 3:憑證檔案格式與轉換

常見格式

PEM (Privacy Enhanced Mail)

-----BEGIN CERTIFICATE-----
MIIDXTCCAkWgAwIBAgIJAKJ...
-----END CERTIFICATE-----

特點:
- Base64 編碼
- 最常見格式
- 副檔名:.pem, .crt, .cer, .key

DER (Distinguished Encoding Rules)

特點:
- 二進位格式
- 副檔名:.der, .cer
- Windows 常用

PFX/P12 (PKCS#12)

特點:
- 包含私鑰和憑證
- 通常有密碼保護
- 副檔名:.pfx, .p12
- Windows IIS 使用

格式轉換

# PEM → DER
openssl x509 -in cert.pem -outform DER -out cert.der

# DER → PEM
openssl x509 -in cert.der -inform DER -out cert.pem

# PEM → PFX (包含私鑰)
openssl pkcs12 -export -out cert.pfx \
  -inkey private.key -in cert.pem -certfile ca-bundle.crt

# PFX → PEM
openssl pkcs12 -in cert.pfx -out cert.pem -nodes

範例 4:憑證撤銷機制

何時需要撤銷?

  • 🔴 私鑰洩露或被盜
  • 🔴 憑證資訊錯誤
  • 🔴 網域所有權變更
  • 🔴 組織結構變更
  • 🔴 發現安全漏洞

撤銷方式

CRL (Certificate Revocation List)

優點:簡單
缺點:
- 檔案越來越大
- 更新頻率低
- 效能問題

OCSP (Online Certificate Status Protocol)

優點:
- 即時查詢
- 回應小
缺點:
- 隱私問題(CA 知道你訪問哪些網站)
- 可能有延遲

OCSP Stapling

伺服器主動查詢並附上 OCSP 回應
優點:
- 減少客戶端查詢
- 改善隱私
- 提升效能

最佳實踐

1. 私鑰管理

# 生成強私鑰 (RSA 2048 或 4096 bit)
openssl genrsa -out private.key 2048

# 或使用 ECC (更快,更安全)
openssl ecparam -genkey -name prime256v1 -out private.key

# 設定正確權限(僅所有者可讀)
chmod 600 private.key
chown root:root private.key

# 檢查私鑰
openssl rsa -in private.key -check

2. 憑證設定建議

  • ✅ 使用 TLS 1.2 或更高版本
  • ✅ 使用強加密套件
  • ✅ 啟用 HSTS
  • ✅ 實作 OCSP Stapling
  • ✅ 使用完整憑證鏈
  • ✅ 設定憑證到期提醒
  • ✅ 定期更新憑證(90 天以內)
  • ❌ 不使用 SHA-1(已廢棄)
  • ❌ 不使用自簽憑證於正式環境
  • ❌ 不共享私鑰

3. 監控與維護

# 檢查憑證到期日
openssl x509 -in cert.pem -noout -dates

# 計算剩餘天數
openssl x509 -in cert.pem -noout -enddate | \
  awk -F= '{print $2}' | xargs -I{} date -d {} +%s

# 設定監控腳本
# 當憑證剩餘少於 30 天時發送警告

常見問題

問題 1:憑證鏈不完整

錯誤:unable to get local issuer certificate

解決:確保提供完整憑證鏈
cat cert.crt intermediate.crt > fullchain.crt

問題 2:憑證與私鑰不匹配

# 檢查憑證和私鑰是否匹配
openssl x509 -in cert.crt -noout -modulus | md5sum
openssl rsa -in private.key -noout -modulus | md5sum
# 兩者輸出應該相同

問題 3:混合內容警告

原因:HTTPS 頁面載入 HTTP 資源

解決:將所有資源改為 HTTPS 或相對路徑

問題 4:憑證過期

預防:
- 設定自動續期(Let's Encrypt)
- 監控憑證到期日
- 提前 30 天更新

總結

核心要點

  1. 憑證類型選擇

    • DV 憑證:個人網站、部落格(免費 Let's Encrypt)
    • OV 憑證:企業官網
    • EV 憑證:金融、電商平台
  2. 憑證驗證流程

    • 檢查有效期限
    • 驗證網域名稱
    • 確認憑證鏈完整
    • 檢查撤銷狀態
  3. 最佳實踐

    • 保護私鑰安全(600 權限)
    • 使用 TLS 1.2 或更高版本
    • 啟用 OCSP Stapling
    • 定期監控憑證到期日
  4. 自動化管理

    • Let's Encrypt + Certbot 自動續期
    • 設定到期提醒(提前 30 天)
    • 使用 Infrastructure as Code 管理

快速參考

憑證類型 驗證級別 簽發時間 適用場景
DV 網域驗證 幾分鐘 個人網站
OV 組織驗證 1-3 天 企業網站
EV 擴展驗證 1-2 週 金融平台

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

🔗相關文章