基本概念
CA(如 Let's Encrypt)
↓ 用 ACME 協定申請
證書(身分證)
↓ 放在 Server 上
TLS(用證書做握手 + 加密)
↓
瀏覽器看到 🔒 鎖頭
- 證書 = 證明「我是這個網站」的身分證
- TLS = 驗證身分 + 加密通訊的協定
- CA = 簽發身分證的機構
- ACME = 向 CA 申請身分證的流程
- OpenSSL = 產生金鑰和證書的工具
名詞解釋
| 名詞 | 是什麼 | 層級 | 背書嗎 |
|---|---|---|---|
| CA(Certificate Authority) | 簽發證書的機構 | 簽發者 | ✅ 背書 |
| Let's Encrypt | 一家特定的 CA(免費) | 簽發者 | ✅ 背書 |
| DigiCert / GlobalSign / Sectigo | 其他付費 CA | 簽發者 | ✅ 背書 |
| ACME | 自動申請/續簽證書的協定(RFC 8555) | 協定 | ❌ 不背書 |
| TLS(Transport Layer Security) | 用證書加密傳輸的協定 | 協定 | ❌ 不背書 |
| OpenSSL | 產生金鑰、CSR、證書的工具 | 工具 | ❌ 不背書 |
| CSR(Certificate Signing Request) | 向 CA 申請證書的請求檔 | 請求檔 | ❌ 不背書 |
| Origin CA | Cloudflare 專屬的 CA(只被 Cloudflare 信任) | 簽發者 | ⚠️ 只被 Cloudflare 信任 |
| 自簽證書(Self-signed) | 自己簽自己的證書 | 證書 | ❌ 無 CA 背書 |
關係圖
CA(如 Let's Encrypt)
↕ 透過 ACME 協定溝通
ACME 客戶端(如 certbot / acme.sh)
← 需要 OpenSSL 產生金鑰和 CSR
最終產物:TLS 證書
→ 放在 Server 上
→ 用於 TLS 握手
→ 瀏覽器驗證
角色關係
┌─────────────┐
│ 使用者瀏覽器 │ 內建信任 CA 清單
└──────┬──────┘
│ TLS 連線
↓
┌─────────────┐
│ 網站伺服器 │ 放著 CA 簽發的證書
└─────────────┘
↑
│ 用 ACME 協定申請
│
┌─────────────┐
│ CA(如 │ 簽發證書
│ Let's Encrypt)│
└─────────────┘
誰做什麼
| 角色 | 做什麼 | 需要準備證書嗎 |
|---|---|---|
| CA | 簽發證書、背書 | 自己就是 CA |
| ACME 客戶端 | 跑 ACME 協定向 CA 申請 | 不需要 |
| OpenSSL | 產生金鑰和 CSR | 不需要 |
| Server | 放證書、提供 TLS 服務 | ✅ 需要 |
| User / Client | 連線、驗證證書 | ❌ 不需要 |
TLS 握手流程
1. Client → Server:ClientHello(我要連線,支援這些加密算法,並附上一把臨時公鑰)
2. Server → Client:ServerHello + 證書(裡面有公鑰)+ 自己的臨時公鑰
3. Client 檢查證書:
- 誰簽的? → CA(如 Let's Encrypt)→ 信任清單有 → ✅
- 域名對嗎? → myblog.com = myblog.com → ✅
- 過期了嗎? → 還沒 → ✅
4. Client 用證書裡的公鑰,驗證 Server 對這次交握的簽章確實是該私鑰簽的(證明身分)
5. 雙方各自用自己的臨時私鑰 + 對方的臨時公鑰,各自算出同一把共同金鑰((EC)DHE 金鑰交換)
6. 雙方用這把共同金鑰加密所有後續通訊
證書在 TLS 裡的角色
| 步驟 | 證書的作用 |
|---|---|
| 步驟 2 | Server 把證書傳給 Client |
| 步驟 3 | Client 驗證證書(CA 簽的?域名對?沒過期?) |
| 步驟 4 | 用證書裡的公鑰驗證身分簽章,不是拿來加密金鑰本身 |
| 步驟 5-6 | 對稱金鑰是雙方用臨時金鑰各自算出來的,之後加密跟證書無關 |
證書種類
| 種類 | 誰簽發 | 瀏覽器信任 | 費用 | 佔比 |
|---|---|---|---|---|
| CA 簽發(如 Let's Encrypt) | 公開 CA | ✅ 信任 | 免費~付費 | 絕大多數 |
| Cloudflare Origin CA | Cloudflare | ❌ 瀏覽器看不到 | 免費 | 只在 CF↔Origin 之間 |
| 自簽證書 | 自己 | ❌ 不信任 | 免費 | 極少(公開 WWW) |
瀏覽器行為
| 證書來源 | 瀏覽器警告 | 原因 |
|---|---|---|
| Let's Encrypt(透過 ACME 申請) | ✅ 不警告 | 公開 CA,瀏覽器信任 |
| Cloudflare 公開 CA(Universal SSL) | ✅ 不警告 | 公開 CA,瀏覽器信任 |
| Cloudflare Origin CA | 瀏覽器看不到 | 只在 Cloudflare ↔ Origin 之間用 |
| OpenSSL 自簽 | ❌ 警告 | 沒有 CA 背書,瀏覽器不信任 |
常見 CA 一覽
Let's Encrypt 只是眾多被瀏覽器信任的 CA 之一。Chrome、Firefox、Edge、Safari 各自維護自己的信任清單,實際收錄的根憑證數量約在 100~200 顆左右,對應的憑證機構則約數十家;確切數字會隨瀏覽器版本、憑證下架/新增而變動,沒有一個固定不變的數字。只要簽發者在瀏覽器的信任清單裡,簽出來的證書瀏覽器就會信任。
常見的 CA
| CA | 類型 | 費用 |
|---|---|---|
| Let's Encrypt | 免費 | 免費,90 天,需自動續簽 |
| ZeroSSL | 免費 | 免費,支援 ACME(需 EAB) |
| Google Trust Services | Google 的 CA | 每月前 100 張免費(透過 ACME,需 EAB),超過後收費 |
| DigiCert | 付費 | 企業級,價格較高 |
| GlobalSign | 付費 | 企業級 |
| Sectigo(原 Comodo) | 付費 | 常見商業 CA |
| Entrust | 付費 | 企業級 |
| Certum | 付費 | 波蘭 CA |
| Microsoft RSA TLS CA | Microsoft 的 CA | 內部使用 |
| Apple Root CA | Apple 的 CA | 內部使用 |
免費 CA 比較
| CA | 免費 | 支援 ACME | 效期 | 現況/限制 |
|---|---|---|---|---|
| Let's Encrypt | ✅ | ✅ | 90 天(未來會縮短,見 Cloudflare 章節) | 免帳號綁定,最主流的免費 CA |
| ZeroSSL | ✅ | ✅ | 90 天 | 需先到官網申請 EAB 金鑰才能用 ACME |
| Google Trust Services | ✅(每月前 100 張) | ✅(需 EAB) | 90 天 | 需要 Google Cloud 帳號並取得 EAB 金鑰,設定比 Let's Encrypt 麻煩一些 |
| ❌ 已停止服務 | — | (原本 180 天) | 2025-10-16 起停止受理新申請、續簽與換發 | |
| Cloudflare Origin CA | ✅ | ❌ | 最長 15 年 | 只被 Cloudflare 信任,瀏覽器不信任 |
你能從其他 CA 申請嗎
能。只要該 CA 在瀏覽器信任清單裡,簽發的證書瀏覽器都信任。用 ACME 申請其他免費 CA:
# === ZeroSSL(需先在 zerossl.com 取得 EAB 金鑰)===
certbot certonly --server https://acme.zerossl.com/v2/DV90 \
--eab-kid <你的ID> --eab-hmac-key <你的金鑰> \
-d myblog.com
# === Google Trust Services(需先在 Google Cloud 建立 EAB 金鑰)===
certbot certonly --server https://dv.acme-v02.api.pki.goog/directory \
--eab-kid <你的ID> --eab-hmac-key <你的金鑰> \
-d myblog.com
付費 CA 則是直接向 CA 購買,或透過代理商(如 SSLs.com、GoDaddy)購買;買完後一樣用 OpenSSL 產生 CSR 提交給 CA,CA 簽發後下載證書安裝。
ACME 協定
ACME(Automatic Certificate Management Environment)是基於 HTTPS 的 JSON API(RFC 8555)。
流程
1. 建立帳號
POST /acme/new-account
→ Let's Encrypt 回傳帳號 URL
2. 申請證書
POST /acme/new-order
→ Let's Encrypt 回傳挑戰(challenge)
3. 完成挑戰(證明你擁有該域名)
- HTTP-01:在網站放一個特定檔案
- DNS-01:在 DNS 加一條 TXT 記錄
- TLS-ALPN-01:在伺服器 TLS 回應特定內容
4. 驗證通過,提交 CSR
POST /acme/finalize
→ Let's Encrypt 簽發證書
5. 下載證書
POST /acme/cert/...
→ 拿到簽好的證書
所有請求都用 JSON 格式,透過 HTTPS 傳輸,每個請求都用你的帳號私鑰簽名。
你通常不會自己寫 ACME 協定,而是用 ACME 客戶端工具幫你自動完成:
| ACME 客戶端 | 說明 |
|---|---|
| certbot | 最常用,Python 寫的 |
| acme.sh | 輕量,Shell 腳本 |
| lego | Go 寫的 |
| Caddy | 內建 ACME 自動申請 |
OpenSSL 的角色
OpenSSL 是工具,不是 CA,不會自己跑 ACME 協定。
OpenSSL 可以做兩件事
| 用途 | 說明 | 瀏覽器信任嗎 |
|---|---|---|
| 產生自簽證書 | 自己簽自己 | ❌ 不信任 |
| 產生 CSR 向 CA 申請 | 拿 CA 簽發的證書 | ✅ 信任 |
指令範例
# === 自簽(瀏覽器不信任)===
openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 365 -nodes
# === 向 CA 申請(瀏覽器信任)===
# 1. 產生私鑰
openssl genrsa -out key.pem 2048
# 2. 產生 CSR(Certificate Signing Request)
openssl req -new -key key.pem -out csr.pem
# 3. 用 ACME 客戶端拿 CSR 向 Let's Encrypt 申請
certbot certonly --csr csr.pem
# 4. Let's Encrypt 簽發證書
# → 拿到簽好的證書
同樣是 OpenSSL 產生的證書
自己簽 → 沒人背書 → ❌ 瀏覽器警告
拿去給 CA 簽 → CA 背書 → ✅ 瀏覽器信任
OpenSSL 是產生證書的工具,不是背書的機構。
Server 端場景
場景 1 — 你架了一個網站 myblog.com
你需要一張證書讓瀏覽器信任。
1. 用 OpenSSL 產生私鑰和 CSR
2. ACME 客戶端(certbot)用 ACME 協定向 Let's Encrypt 申請
3. Let's Encrypt 驗證你真的擁有 myblog.com
4. Let's Encrypt(CA)簽發一張證書給你
5. 你把證書裝在伺服器上
6. 瀏覽器連過來 → 看到證書 → 查到 Let's Encrypt 在信任清單 → ✅
場景 2 — 你的網站掛在 Cloudflare 後面
瀏覽器 → Cloudflare Edge → 你的伺服器 (Origin)
↑ ↑
Cloudflare 公開 CA 你用 Origin CA 證書
(Universal SSL) (Dashboard 點幾下產生)
(瀏覽器信任) (只有 Cloudflare 信任)
- 前段(瀏覽器 ↔ Cloudflare Edge):Cloudflare 自動處理,你不用管
- 後段(Cloudflare Edge ↔ 你的伺服器):你用 Origin CA 證書
場景 3 — 你架了內部服務,不對外公開
自己用 OpenSSL 產一張自簽證書就好,反正只有你自己用。
場景 4 — Cloudflare Pages
瀏覽器 → Cloudflare Edge → Cloudflare Pages
↑ ↑
Cloudflare 公開 CA 證書 Pages 內部(你不用管)
(瀏覽器信任)
瀏覽器看到的是 Cloudflare 的公開 CA 證書(Universal SSL),不是 Origin CA。你完全不用管證書。
Server 端證書選擇整理
| 場景 | 準備什麼 | 證書類型 |
|---|---|---|
| 一般網站 | 向 CA 申請 | 公開 CA 證書(如 Let's Encrypt) |
| 掛在 Cloudflare 後面 | Dashboard 產生 | Origin CA 證書 |
| 內部服務 | 自己產生 | 自簽證書 |
| Cloudflare Pages | 不用管 | Cloudflare 自動處理 |
User / Client 端場景
User 什麼時候會碰到 ACME / Let's Encrypt / CA?
幾乎不會。這些都是 Server 端的事。
| 名詞 | User 會碰到嗎 | 說明 |
|---|---|---|
| CA | 不會主動碰到 | 瀏覽器內建信任清單,自動檢查 |
| Let's Encrypt | 不會碰到 | Server 端申請的 |
| ACME | 不會碰到 | Server 端自動續簽用的 |
| TLS | 不會主動碰到 | 瀏覽器自動處理加密 |
| OpenSSL | 不會碰到 | Server 端產生證書用的 |
| CSR | 不會碰到 | Server 端申請證書用的 |
User 唯一會碰到的情況
看到「不安全」警告的時候。
你連到一個網站
→ 瀏覽器顯示「不安全」
→ 代表對方用自簽證書,或證書過期
→ 你決定要不要繼續(通常不建議)
User 端要做的事
| 角色 | 要做的事 |
|---|---|
| Server | 申請證書(用 ACME 向 Let's Encrypt 等 CA 申請),裝在伺服器上 |
| User | 什麼都不用做,瀏覽器自動檢查證書 |
Cloudflare 相關
Cloudflare 的證書架構
使用者瀏覽器 ←→ Cloudflare Edge(全球節點) ←→ Origin(你的伺服器)
↑ ↑ ↑
看到的證書 證書在這終止 你的實際機器
(公開 CA) (Cloudflare 處理) (放證書的地方)
兩段加密
| 段 | 位置 | 證書 | 誰處理 |
|---|---|---|---|
| 前段 | 瀏覽器 ↔ Cloudflare Edge | 公開 CA(Universal SSL) | Cloudflare 自動處理 |
| 後段 | Cloudflare Edge ↔ Origin | 你決定用什麼 | 你自己處理 |
Cloudflare SSL/TLS 模式
| 模式 | Origin 可以用自簽嗎 | Cloudflare 會驗證嗎 |
|---|---|---|
| Flexible | 不需要證書 | 不驗證(HTTP 連 origin) |
| Full | 可以 | 不驗證(接受自簽、過期、CN 不符) |
| Full (strict) | 不行 | 會驗證(必須是公開 CA 或 Origin CA 簽發) |
Origin CA vs 公開 CA
| 公開 CA(如 Let's Encrypt) | Cloudflare Origin CA | |
|---|---|---|
| 誰簽發 | 公開憑證機構 | Cloudflare 自己 |
| 瀏覽器信任 | ✅ 信任 | ❌ 不信任 |
| 用途 | 瀏覽器 ↔ 網站 | 只在 Cloudflare ↔ Origin 之間 |
| 有效期 | 90 天(Let's Encrypt,2026 起逐步縮短,見下方) | 最長 15 年 |
| 費用 | 免費 | 免費 |
| 需要 ACME | 是(自動續簽) | 不用(Dashboard 產生) |
Let's Encrypt 效期正在縮短(2026-2028 時程)
CA/Browser Forum 已通過縮短憑證效期的提案,Let's Encrypt 依此排定時程:
| 時間點 | 變化 |
|---|---|
| 2026 年 1 月 | 已上線 160 小時(約 6 天)超短效期選項;IP 位址憑證目前只能申請這種短效期(不能簽 90 天) |
| 2026 年 5 月 13 日 | 可選用 ACME 的 TLS 伺服器專用設定檔,新憑證改為 45 天(早期試用,非強制) |
| 2027 年 2 月 10 日 | 預設(Classic)設定檔新簽發憑證效期降為 64 天,並有 10 天授權重用期 |
| 2028 年 2 月 16 日 | 預設設定檔效期全面降為 45 天,授權重用期縮到 7 小時 |
Cloudflare Tunnel 的證書
| Quick Tunnel(臨時) | Named Tunnel(正式) | |
|---|---|---|
| 網址 | 隨機 *.trycloudflare.com | 你的子域名.你的域名 |
| 證書 | Cloudflare 萬用字元憑證 | Universal SSL(你的域名) |
| 需要設定嗎 | 不用,自動有 | 不用,自動有 |
| 瀏覽器信任 | ✅ 信任 | ✅ 信任 |
| 需要 ACME | 不用 | 不用 |
不管用哪種 Tunnel,瀏覽器 ↔ Cloudflare Edge 這段的證書都是 Cloudflare 自動處理的,你完全不用自己申請或設定。
Cloudflare Edge vs Windows Edge
完全不同的東西,只是名字一樣:
| Cloudflare Edge | Windows Edge | |
|---|---|---|
| 是什麼 | Cloudflare 全球網路的邊緣節點(伺服器) | 微軟的瀏覽器 |
| 屬於 | Cloudflare | Microsoft |
| 在哪 | 全球 300+ 城市的資料中心 | 你的電腦/手機上 |
自簽證書問題(翻牆場景)
自簽證書在公開 WWW 上的流量
非常少,幾乎可以忽略。
| 場景 | 公開 WWW? | 流量佔比 |
|---|---|---|
| 內部企業服務 | ❌ | 多 |
| 伺服器回源(Origin ↔ CDN) | ❌ | 多 |
| 開發/測試環境 | ❌ | 中 |
| IoT 設備管理介面 | ❌ | 中 |
| Cloudflare WARP / 零信任服務 | 半公開 | 少 |
| 一般公開網站 | ✅ | 極少 |
自簽證書在翻牆中的問題
| 問題 | 說明 |
|---|---|
| 會被主動探測 | GFW 主動連你的 IP,看到證書無效,就知道不是正常網站 |
| 信譽過低 | 正常公開網站不會用自簽證書,用自簽 = 暴露自己 |
| 誤殺附帶傷害低 | 封掉自簽證書的 IP 不會影響正常網站,GFW 封起來沒顧忌 |
| 機器學習識別(推測,未證實) | 理論上 GFW 可用 Embedding + K-Means 等聚類方法將自簽證書流量歸為單獨一類,但目前沒有公開技術文件證實 GFW 實際採用此機制,屬合理推測而非既定事實 |
例外:Cloudflare WARP
Cloudflare WARP(162.159.197.2 等)用自簽證書,但跟企業用戶共用入口,封了會有附帶傷害。不過一般人自簽證書沒有這種保護。
常見組合整理
OpenSSL + Let's Encrypt
OpenSSL(產生金鑰 + CSR)
→ ACME 客戶端(certbot / acme.sh)
→ Let's Encrypt(CA 簽發)
→ 拿到證書 → 瀏覽器信任 ✅
OpenSSL 自簽
OpenSSL(產生金鑰 + 自己簽)
→ 沒有 CA 背書
→ 瀏覽器警告 ❌
OpenSSL CSR + CA + Let's Encrypt
# 1. OpenSSL 產生私鑰
openssl genrsa -out key.pem 2048
# 2. OpenSSL 產生 CSR
openssl req -new -key key.pem -out csr.pem
# 3. ACME 客戶端拿 CSR 向 Let's Encrypt 申請
certbot certonly --csr csr.pem
# 4. Let's Encrypt(CA)簽發證書
# → 拿到簽好的證書 → 瀏覽器信任 ✅
Cloudflare Origin CA
1. 在 Cloudflare Dashboard 產生 Origin CA 證書
2. 放在你的伺服器上
3. 設定 SSL/TLS 模式為 Full (strict)
4. Cloudflare Edge 信任你的伺服器
5. 瀏覽器看到的是 Cloudflare 的公開 CA 證書 → 信任 ✅
Cloudflare Tunnel
1. cloudflared 連到 Cloudflare Edge
2. 瀏覽器 ↔ Cloudflare Edge 的證書由 Cloudflare 自動處理
3. 你不用管任何證書
4. 瀏覽器信任 ✅
常見 Q&A
Q:CA 背書的是 ACME 還是 Let's Encrypt?
是 Let's Encrypt(CA)背書。ACME 只是申請的協定/流程,不背書。
Q:OpenSSL 很多人用,為什麼瀏覽器不信任?
OpenSSL 是工具,不是 CA。同樣是 OpenSSL 產生的證書:自己簽 → 沒人背書 → ❌ 警告;拿去給 CA 簽 → CA 背書 → ✅ 不警告。
Q:掛在 Cloudflare 後面的危險網站,瀏覽器會警告嗎?
不會。瀏覽器看到的是 Cloudflare 的公開 CA 證書,不是 Origin CA。證書只證明連線加密,不證明內容安全。
Q:User 端需要準備證書嗎?
不需要。證書是 Server 端準備的。User 端的瀏覽器內建信任 CA 清單,自動驗證。
Q:ACME 是什麼?
自動申請/續簽證書的協定(RFC 8555)。基於 HTTPS 的 JSON API。你通常用 ACME 客戶端(如 certbot)自動完成,不會自己寫協定。
Q:TLS 跟證書有什麼關係?
TLS 是使用證書的協定。證書是「身分證」,TLS 是「檢查身分證 + 加密通訊」的流程。沒有證書,TLS 無法驗證對方身分。
Q:Origin CA 跟公開 CA 一樣嗎?
不一樣。Origin CA 只被 Cloudflare 信任,瀏覽器不信任。公開 CA(如 Let's Encrypt)被所有瀏覽器信任。Origin CA 只在 Cloudflare Edge ↔ 你的伺服器之間使用。
Q:Cloudflare Tunnel 需要設定證書嗎?
不用。不管 Quick Tunnel 還是 Named Tunnel,瀏覽器 ↔ Cloudflare Edge 的證書都是 Cloudflare 自動處理的。