SSL 憑證完整教學
什麼是 SSL/TLS?
SSL(Secure Sockets Layer)及其後繼者 TLS(Transport Layer Security)是保護網際網路通訊安全的加密協定。當您造訪 HTTPS 網站時,TLS 會加密瀏覽器與伺服器之間的連線,防止竊聽和竄改。
- 加密 — 保護傳輸中的敏感資料
- 驗證 — 確認伺服器的身份
- 完整性 — 確保資料未被修改
- SEO — Google 將 HTTPS 作為排名訊號
- 信任 — 瀏覽器為 HTTPS 網站顯示鎖頭圖示
運作原理
TLS 交握透過以下步驟建立安全連線:
- Client hello — 瀏覽器發送支援的 TLS 版本和加密套件
- Server hello — 伺服器選擇版本/加密套件並發送其憑證
- 憑證驗證 — 瀏覽器驗證憑證(簽發者、到期日、網域匹配)
- 金鑰交換 — 雙方推導出共享的工作階段金鑰
- 加密通訊 — 所有後續流量都經過加密
憑證鏈
根憑證機構(Root CA)
└─ 中繼憑證機構(Intermediate CA)
└─ 終端實體憑證(您的網站)
瀏覽器信任內建的根憑證機構清單。它們透過沿著憑證鏈向上驗證到受信任的根來驗證您的憑證。
憑證類型
依驗證等級
DV — 網域驗證(Domain Validation)
僅驗證網域所有權。幾分鐘內即可簽發。透過 Let's Encrypt 免費取得。適合大多數網站。
OV — 組織驗證(Organization Validation)
驗證網域所有權及組織身份。需要 1–3 個工作天。適合商業網站。
EV — 延伸驗證(Extended Validation)
最嚴格的驗證 — 法律實體檢查、電話驗證。需要 1–2 週。銀行和大型電商使用。注意:自 2019 年起,主要瀏覽器不再顯示綠色組織名稱列。
依涵蓋範圍
- 單一網域 — 涵蓋一個網域,例如
www.example.com - 萬用字元(Wildcard) — 涵蓋所有子網域,例如
*.example.com - 多網域(SAN) — 在一張憑證中涵蓋多個不同網域
如何檢查憑證
瀏覽器
點擊網址列中的鎖頭圖示 → 檢視憑證詳情:簽發對象、簽發者、到期日期。
命令列
# 檢視憑證資訊
openssl s_client -connect example.com:443 -servername example.com
# 檢查到期日期
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null \
| openssl x509 -noout -dates
線上工具
- SSL Labs — 全面的 SSL 設定測試
- 301check.com — 顯示重新導向鏈路中每一跳的 TLS 資訊
- crt.sh — 憑證透明度日誌搜尋
常見錯誤
憑證過期 — NET::ERR_CERT_DATE_INVALID
更新憑證。使用 Certbot 的自動更新功能來預防此問題。
網域不匹配 — NET::ERR_CERT_COMMON_NAME_INVALID
憑證未涵蓋正在存取的網域。取得正確網域的憑證,或使用萬用字元憑證。
憑證鏈不完整 — NET::ERR_CERT_AUTHORITY_INVALID
伺服器設定中缺少中繼憑證。
# Nginx — 使用 fullchain.pem,而非僅 cert.pem
ssl_certificate /path/to/fullchain.pem;
ssl_certificate_key /path/to/privkey.pem;
混合內容
HTTPS 頁面載入 HTTP 資源(圖片、腳本、樣式表)。將所有資源網址更新為 HTTPS,或使用協定相對網址(//example.com/image.jpg)。
Let's Encrypt
Let's Encrypt 是由非營利組織 ISRG 營運的免費、自動化、開放的憑證機構。它讓 HTTPS 對所有人都觸手可及。
Certbot(建議使用)
# 在 Ubuntu/Debian 上安裝
sudo apt install certbot python3-certbot-nginx
# 簽發並自動設定 Nginx
sudo certbot --nginx -d example.com -d www.example.com
# 測試自動更新
sudo certbot renew --dry-run
# 設定自動更新排程
0 0,12 * * * certbot renew --quiet
acme.sh(輕量替代方案)
curl https://get.acme.sh | sh
acme.sh --issue -d example.com -d www.example.com --nginx
最佳實務
# Nginx — 強化 TLS 設定
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
# 啟用 HSTS
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
# OCSP Stapling
ssl_stapling on;
ssl_stapling_verify on;
- 設定憑證到期提醒(到期前 30 天)
- 使用 CAA DNS 記錄限制哪些憑證機構可以為您的網域簽發憑證
- 監控憑證透明度日誌,防止未經授權的簽發
- 使用 SSL Labs 測試您的設定