SSL 憑證完整教學

目錄

什麼是 SSL/TLS?

SSL(Secure Sockets Layer)及其後繼者 TLS(Transport Layer Security)是保護網際網路通訊安全的加密協定。當您造訪 HTTPS 網站時,TLS 會加密瀏覽器與伺服器之間的連線,防止竊聽和竄改。

運作原理

TLS 交握透過以下步驟建立安全連線:

  1. Client hello — 瀏覽器發送支援的 TLS 版本和加密套件
  2. Server hello — 伺服器選擇版本/加密套件並發送其憑證
  3. 憑證驗證 — 瀏覽器驗證憑證(簽發者、到期日、網域匹配)
  4. 金鑰交換 — 雙方推導出共享的工作階段金鑰
  5. 加密通訊 — 所有後續流量都經過加密

憑證鏈

根憑證機構(Root CA)
  └─ 中繼憑證機構(Intermediate CA)
      └─ 終端實體憑證(您的網站)

瀏覽器信任內建的根憑證機構清單。它們透過沿著憑證鏈向上驗證到受信任的根來驗證您的憑證。

憑證類型

依驗證等級

DV — 網域驗證(Domain Validation)

僅驗證網域所有權。幾分鐘內即可簽發。透過 Let's Encrypt 免費取得。適合大多數網站。

OV — 組織驗證(Organization Validation)

驗證網域所有權及組織身份。需要 1–3 個工作天。適合商業網站。

EV — 延伸驗證(Extended Validation)

最嚴格的驗證 — 法律實體檢查、電話驗證。需要 1–2 週。銀行和大型電商使用。注意:自 2019 年起,主要瀏覽器不再顯示綠色組織名稱列。

依涵蓋範圍

如何檢查憑證

瀏覽器

點擊網址列中的鎖頭圖示 → 檢視憑證詳情:簽發對象、簽發者、到期日期。

命令列

# 檢視憑證資訊
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

線上工具

常見錯誤

憑證過期 — 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;