基本概念

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 CACloudflare 專屬的 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 中的角色

步驟憑證的作用
步驟 2Server 把憑證傳給 Client
步驟 3Client 驗證憑證(CA 簽發的嗎?網域正確嗎?沒過期嗎?)
步驟 4用憑證中的公鑰驗證身分簽章。公鑰不用來加密金鑰本身
步驟 5-6對稱金鑰是雙方用臨時金鑰各自算出的。之後的加密和憑證無關
沒有身分驗證:沒有憑證時,TLS 無法驗證對方身分。TLS 只能加密,不能確認連線的對象是真的網站。
現代 TLS 使用 (EC)DHE,不使用舊式 RSA 金鑰交換: 早期 TLS(1.2 及以前)有一種做法:Client 直接用憑證公鑰加密對稱金鑰,再傳給 Server(RSA 金鑰交換)。這種做法的問題是:Server 私鑰未來一旦洩漏,過去攔截並儲存的封包全部可以解密。現在主流(尤其 TLS 1.3 已完全移除 RSA 金鑰交換)改用 (EC)DHE(橢圓曲線迪菲赫爾曼):雙方各自產生臨時金鑰對。雙方交換公鑰後,各自算出同一把共同金鑰。憑證公鑰只用來驗證簽章和確認身分,不參與金鑰本身的加密。好處是具備「前向保密」(Forward Secrecy):伺服器私鑰之後即使洩漏,也無法回頭解密過去記錄的流量。

憑證種類

種類誰簽發瀏覽器信任費用佔比
CA 簽發(如 Let's Encrypt)公開 CA信任免費~付費絕大多數
Cloudflare Origin CACloudflare瀏覽器看不到免費只在 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 ServicesGoogle 的 CA每月前 100 張免費(透過 ACME,需要 EAB),超過後收費
DigiCert付費企業級,價格較高
GlobalSign付費企業級
Sectigo(原 Comodo)付費常見商業 CA
Entrust付費企業級
Certum付費波蘭 CA
Microsoft RSA TLS CAMicrosoft 的 CA內部使用
Apple Root CAApple 的 CA內部使用

免費 CA 比較

CA免費支援 ACME效期現況/限制
Let's Encrypt90 天(未來會縮短,見 Cloudflare 章節)不需要綁定帳號。最主流的免費 CA
ZeroSSL90 天必須先到官網申請 EAB 金鑰,才能使用 ACME
Google Trust Services(每月前 100 張)(需要 EAB)90 天需要 Google Cloud 帳號,並取得 EAB 金鑰。設定比 Let's Encrypt 麻煩
Buypass Go SSL已停止服務—(原本 180 天)2025-10-16 起停止受理新申請、續簽與換發
Cloudflare Origin CA最長 15 年只被 Cloudflare 信任,瀏覽器不信任
修正:Buypass Go SSL 已停止服務。Buypass 已於 2025 年 10 月 16 日起終止 Go SSL 免費憑證服務。Buypass 不再受理新申請或續簽。既有憑證只能等到期後,改用其他 CA。目前可用的免費 ACME CA,實務上剩下 Let's Encrypt、ZeroSSL 和 Google Trust Services 三家。

你能從其他 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 簽發後下載憑證安裝。

Let's Encrypt 會不會倒?Let's Encrypt 由非營利組織 ISRG 運營,由 Mozilla、Cisco、Google、Meta 等贊助,是目前最穩定的免費 CA。如果 Let's Encrypt 真的停止服務,可以改用 ZeroSSL 或 Google Trust Services,用 ACME 重新申請。流程大致相同(Buypass 已於 2025 年停止服務,不再是可行的替代選項)。

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 小時
只影響新簽發憑證:這些時程只影響「新簽發」的憑證。既有憑證通常到下次續期才會受到影響。另外,Let's Encrypt 已於 2025 年停發到期提醒信。未來必須完全依賴伺服器端的自動續約,不能再靠收信提醒。自動續約機制必須正常運作。付費憑證也有類似趨勢:目前最長 398 天,預計 2026 年底前縮短到 200 天,2027 至 2028 年間全面縮短到 90 天以內。

Cloudflare Tunnel 的憑證

Quick Tunnel(臨時)Named Tunnel(正式)
網址隨機 *.trycloudflare.com你的子網域.你的網域
憑證Cloudflare 萬用字元憑證Universal SSL(你的網域)
需要設定嗎不需要,自動有不需要,自動有
瀏覽器信任信任信任
需要 ACME不需要不需要

不論使用哪種 Tunnel,瀏覽器 ↔ Cloudflare Edge 這段的憑證都由 Cloudflare 自動處理。你完全不需要自己申請或設定憑證。

Cloudflare Edge vs Windows Edge

兩者完全不同,只是名稱相同:

Cloudflare EdgeWindows Edge
是什麼Cloudflare 全球網路的邊緣節點(伺服器)微軟的瀏覽器
屬於CloudflareMicrosoft
在哪全球 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 自動處理的。