基本概念
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。GFW 看到憑證無效,就知道這不是正常網站 |
| 信譽過低 | 正常公開網站不使用自簽憑證。使用自簽憑證 = 暴露自己 |
| 誤殺附帶傷害低 | 封鎖使用自簽憑證的 IP 不會影響正常網站。GFW 封鎖時沒有顧慮 |
| 機器學習識別(推測,未證實) | 理論上,GFW 可以用 Embedding + K-Means 等聚類方法,把自簽憑證流量歸為單獨一類。但是目前沒有公開技術文件證實 GFW 實際採用這種機制。這是合理推測,不是已驗證的事實 |
例外:Cloudflare WARP
Cloudflare WARP(162.159.197.2 等)也使用自簽憑證。但是 WARP 和企業使用者共用入口,封鎖 WARP 會有附帶傷害。一般人自行簽發的憑證沒有這種保護。
常見組合整理
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 自動處理的。