目錄
什麼是 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 天更新
總結
核心要點
-
憑證類型選擇:
- DV 憑證:個人網站、部落格(免費 Let's Encrypt)
- OV 憑證:企業官網
- EV 憑證:金融、電商平台
-
憑證驗證流程:
- 檢查有效期限
- 驗證網域名稱
- 確認憑證鏈完整
- 檢查撤銷狀態
-
最佳實踐:
- 保護私鑰安全(600 權限)
- 使用 TLS 1.2 或更高版本
- 啟用 OCSP Stapling
- 定期監控憑證到期日
-
自動化管理:
- Let's Encrypt + Certbot 自動續期
- 設定到期提醒(提前 30 天)
- 使用 Infrastructure as Code 管理
快速參考
| 憑證類型 | 驗證級別 | 簽發時間 | 適用場景 |
|---|---|---|---|
| DV | 網域驗證 | 幾分鐘 | 個人網站 |
| OV | 組織驗證 | 1-3 天 | 企業網站 |
| EV | 擴展驗證 | 1-2 週 | 金融平台 |
建立日期:2025-10-28 最後更新:2025-11-18