2.4 HTTPS 與邊緣憑證:從 ACME 到 Cloudflare 的一鍵加密#
本節目標#
- 理解 TLS 憑證的信任鏈:CA、中繼憑證、leaf 憑證如何層層簽署
- 掌握 Let's Encrypt 與 ACME 協議的「證明網域控制權」流程
- 學會 Cloudflare 的 Universal SSL 與 Edge Certificates 面板操作
- 分辨 SSL/TLS 加密模式的差異:Flexible / Full / Full (Strict),並啟用 TLS 1.3
歷史:瀏覽器鎖圖標背後的信任體系#
1994 年 Netscape 推出 SSL 2.0,讓 HTTP 走上加密通道;1999 年標準化為 TLS(RFC 2246 之後),今天的主流是 TLS 1.3(RFC 8446,2018)。但加密本身不夠——MITM 也能跟你加密,問題在於你如何相信對方就是銀行?
答案是憑證信任鏈:TLS 交握不只交換對稱金鑰,還附上一份 leaf 憑證的「出生證明」:
作業系統 / 瀏覽器內建的 Root CA(自我簽署, 約 100+ 家)
│ 簽署
▼
Intermediate CA(中繼憑證, CA 廠商日常營運用)
│ 簽署
▼
Leaf 憑證 (CN: www.example.com) ←你的網站交給瀏覽器的這張
信任鏈的數學基礎:Root CA 的公鑰寫死在你的 OS 中, Intermediate 的憑證由 Root 簽章(密碼學上不可偽造),Leaf 的憑證又由 Intermediate 簽章。瀏覽器只要往上驗章到 Root 即完成信任驗證。
| 憑證型別(延伸驗證等級) | 驗證誰 | 今天還重要嗎 |
|---|---|---|
| DV (Domain Validation) | 驗證你控制該網域 | 主流,免費方案的一切 |
| OV (Organization) | +驗證公司實體 | 較少用(位址列不再特殊顯示) |
| EV (Extended) | 嚴格驗證 | 影響力大幅下降 |
Let's Encrypt 與 ACME:讓憑證取得自動化#
2015 年前,申請一張 DV 憑證是「網頁表單 + email 驗證 + 人工作業」,一年一次,花錢又易忘記續期。EFF 與 Mozilla 推動的 Let's Encrypt 在 2015 年上線,發明了 ACME(Automatic Certificate Management Environment, RFC 8555):憑證的全生命週期由軟體自動完成。
ACME 流程(以申請 example.com 的憑證為例):
步驟 A: 客戶端向 CA 註冊帳戶(一分鐘)
步驟 B: 客戶端請求發證 → CA 指定要用哪種 challenge
步驟 C: 完成 challenge ,證明你控制該網域
HTTP-01 : 在 http://example.com/.well-known/acme-challenge/ 放一個 CA 給定的 token 檔
DNS-01 : 在 TXT _acme-challenge.example.com 放一個 CA 給定的 token
(萬用字元 *.example.com 只能用 DNS-01)
步驟 D: CA 驗證通過 → 下發憑證
步驟 E: 客戶端設定定時器,到期前自動重來(90 天週期)
兩個關鍵設計:
- 90 天有效期是刻意為之:讓「更新」變成常態工作,忘記修正的世界 = 憑證 3 天後到期,比一年一更窄得多。
- DNS-01 是唯一能覆蓋萬用字元
*.example.com的方式——這正是 Cloudflare 的 DNS API 可以接管的角色(ACME client 如certbot、acme.sh都有dns_cf模組)。
手動發一張 Let's Encrypt 憑證#
# DNS-01 challenge,需要先設定 Cloudflare API token(credentials 檔)
sudo certbot certonly \
--dns-cloudflare \
--dns-cloudflare-credentials ~/.secrets/cloudflare.ini \
-d example.com -d "*.example.com" \
--cert-name example --agree-tos -m you@example.com
# 產出: /etc/letsencrypt/live/example/fullchain.pem + privkey.pem
Cloudflare 模式:把 TLS 拆成兩段#
Cloudflare 的架構把 TLS 分成兩條腿:
使用者(browser)
│ TLS ① Edge Certificate(Cloudflare 代管,免費自動)
▼
Cloudflare 邊緣 ←─橘雲代理─
│ TLS ② Origin Certificate(你自己選:模式與憑證)
▼
源站 (origin)
1. Edge Certificates:Universal SSL,連按鈕都不用按#
只要網域在 Cloudflare 帳號啟用、並有橘雲記錄,Cloudflare 自動為你簽發免費的 Universal SSL:
| 項目 | 內容 |
|---|---|
| 覆蓋 | example.com + *.example.com(一層子網域) |
| CA | 依 SNI 動態選擇(Google Trust Services / Let's Encrypt / Sectigo…) |
| 續期 | 完全自動 |
| 有效期 | ~90 天,及時輪換 |
| 限制 | 只覆蓋一層子網域;api.v2.example.com 需 Advanced Certificate Manager(付費) |
在 Dashboard 的 SSL/TLS → Edge Certificates,可再:
- 開啟 Always Use HTTPS(HTTP 301 到 HTTPS)
- 設定 Minimum TLS Version(建議 1.2 起)
- 開啟 TLS 1.3(0-RTT 加速、移除 RC4 等舊加密套件)
- 開啟 HSTS(強制瀏覽器這一年只剩 HTTPS)
2. OriginCertificates:Cloudflare 也會幫你簽一張源站用憑證#
SSL/TLS → Origin Server → Create Certificate,可免費生成一張 15 年有效、由 Cloudflare 的 Origin CA 簽章的憑證,裝到源站伺服器。若你完全在 Cloudflare 生態(本書走 Workers/Pages,多半無源站),這一步可以跳過;但自架源站(第 9 章)或混合環境會用上它。
Flexible / Full / Full (Strict):三種模式的正確心智模型#
| 模式 | 1:edge 到使用 HTTPS | 2:edge 到源站用 | 風險 |
|---|---|---|---|
| Flexible | 是 | HTTP 明文 | 後半段明文傳輸,資料裸奔 |
| Full | 是 | HTTPS(憑證未驗) | 自簽憑證也收 → 中間人可偽造源站 |
| Full (Strict) | 是 | HTTPS + 有效憑證(來源 CA 驗證) | 推薦,沒有理由不選它 |
Flexible :
user ──TLS──→ Cloudflare ──HTTP 明文──→ origin (!)
Full :
user ──TLS──→ Cloudflare ──TLS(不驗章)──→ origin (!)
Full(S) :
user ──TLS──→ Cloudflare ──TLS(驗章)───→ origin (OK)
「Full 名字聽起來安全,實際上只是『自簽也接受』」——這是 Cloudflare 面板最容易配錯的安全設定。若源站有 Let's Encrypt 或 Origin CA 憑證,永遠選 Full (Strict)。無源站(純 Pages/Workers)的平台托管的情況,模式沒有進一步的作用;混自架源站就要你的決策。
組態上另一個坑:憑證的子網域覆蓋#
若你有 www之外的内容需要多層子網域(例:api.v2.example.com),Universal SSL 不覆蓋——要嘛購買 Advanced Certificate Manager,要嘛退回「每個子網域都恰好一層」的架構(這正是 2.2 節 子網域規劃建議的暗中好處)。
TLS 1.3 進一步:0-RTT 與為何值得開#
| 關鍵 | TLS 1.2 | TLS 1.3 |
|---|---|---|
| 握手 RTT | 2-RTT | 1-RTT;resumption 時 0-RTT |
| 加密套件 | 含 RC4/3DES/CBC 等歷史包袱 | 只剩 AEAD(ChaCha20/Poly1305、AES-GCM) |
| 簽章成本 | 中 | 免 ecdsa reuse 之類的問題設計更好 |
Cloudflare 預設吸收大部分此類考慮,你只需要在 Edge Certificates 開啟即可。最佳實務提醒:0-RTT 有重放風險,Cloudflare 已在邊緣處理,但對寫入型 API(付款等)仍應在應用層判斷。
小結與練習#
TLS 憑證的信任鏈由 Root → Intermediate → Leaf 的簽章鏈構成;ACME 把「證明你控制該網域→自動簽發→自動續約」的循環工程化,90 天有效期是設計而非缺陷。Cloudflare 把 TLS 切成兩段:Edge 憑證完全免費自動、源站段由你選 Flexible / Full / Full (Strict)——終極安全是 Full (Strict) + 15 年 Origin CA 憑證(或純雲端無源站)。TLS 1.3 打開 1-RTT/0-RTT 握手,一鍵啟用。
練習:
- 用
curl -v https://example.com觀察握手,找出 Leaf 憑證的 Chain 順序,解釋為何需要送 Intermediate 而不用送 Root。 - 你的源站是自簽憑證的 Apache,應該選 Full 還是 Full (Strict)?若不能產生有效憑證,兩種模式各自的攻擊面是什麼?
- 用
openssl s_client -connect example.com:443 -tls1_3與-tls1_2各一次,比較 ServerHello 尺寸的差異,解釋為什麼 TLS 1.3 帶來「更快的第一次行為」。 - 為什麼 Universal SSL 不覆蓋
api.v2.example.com?兩種解法(基礎架構面與花費面)各是什麼?