ACME(Automated Certificate Management Environment,自動證書管理環境)是使免費、自動化 SSL 證書成為可能的協議。它是 Let’s Encrypt——以及你的 ACME 用戶端(GetHTTPS、Certbot、acme.sh)——與憑證授權機構實際通訊的方式。
定義於 RFC 8555,ACME 用一個完全自動化的、密碼學安全的協議取代了舊的手動流程(透過郵件向 CA 傳送 CSR、等待人工稽核)。
ACME 工作原理——5 個步驟
┌──────────┐ ┌──────────────┐
│ Client │ ① Account Registration │ CA Server │
│ (GetHTTPS)│ ──────────────────────────→ │ (Let's Encrypt)
│ │ ② New Order (domains) │ │
│ │ ──────────────────────────→ │ │
│ │ ③ Complete Challenges │ │
│ │ ←─────────────────────────── │ │
│ │ ──────────────────────────→ │ │
│ │ ④ Finalize (send CSR) │ │
│ │ ──────────────────────────→ │ │
│ │ ⑤ Download Certificate │ │
│ │ ←─────────────────────────── │ │
└──────────┘ └──────────────┘
步驟 1:賬戶註冊
用戶端生成 ACME 賬戶金鑰對並向 CA 註冊公鑰。此金鑰在未來請求中標識你——每條 ACME 訊息都用它簽名。
無需郵件、無需密碼、無需個人資訊。
步驟 2:建立訂單
用戶端提交要獲取證書的域名列表。CA 建立一個”訂單”並返回一組”授權”——每個域名一個——每個授權包含需要完成的驗證。
步驟 3:完成驗證
對於每個域名,用戶端必須證明控制權。CA 提供驗證型別:
| 驗證方式 | 工作原理 | 使用場景 |
|---|---|---|
| HTTP-01 | 在 /.well-known/acme-challenge/ 放置檔案 | 最常見、最簡單 |
| DNS-01 | 在 _acme-challenge.domain 新增 TXT 記錄 | 萬用字元、無 80 埠 |
| TLS-ALPN-01 | 在埠 443 用特殊 TLS 證書響應 | 80 埠被封、無 DNS 訪問 |
用戶端完成驗證後通知 CA 來檢查。CA 從其伺服器驗證——如果驗證透過,授權標記為有效。
步驟 4:完成訂單(傳送 CSR)
所有域名授權透過後,用戶端傳送包含證書公鑰的 CSR(證書籤名請求)。CA 簽名並建立證書。
步驟 5:下載證書
用戶端下載簽名的證書鏈——你的證書 + 中間 CA 證書。完成。
ACME 安全模型
每個 ACME 請求都使用賬戶金鑰透過 JWS(JSON Web Signature) 簽名。這防止了:
- 重放攻擊 —— 每個請求有唯一的 nonce
- 篡改 —— 簽名覆蓋整個請求體
- 冒充 —— 只有賬戶金鑰持有者能發起請求
賬戶金鑰永遠不離開用戶端。使用 GetHTTPS 時,它透過 Web Crypto API 在瀏覽器中生成。
GetHTTPS 如何使用 ACME
GetHTTPS 在瀏覽器中執行的 JavaScript 中實現完整的 ACME 協議:
- 賬戶金鑰透過
crypto.subtle.generateKey()(Web Crypto API)生成 - 證書金鑰以相同方式生成
- ACME 訊息透過
crypto.subtle.sign()簽名 - CSR 使用 pkijs 庫構建
- 直接與
acme-v02.api.letsencrypt.org進行 HTTPS 通訊
無伺服器端代理、無中介軟體。你的瀏覽器直接與 Let’s Encrypt 的 ACME API 通訊。這很獨特——大多數 ACME 用戶端執行在伺服器上。
ACME 用戶端對比
| 用戶端 | 執行環境 | ACME v2 | 自動續簽 | 語言 |
|---|---|---|---|---|
| GetHTTPS | 瀏覽器 | ✅ | ❌ 手動 | JavaScript |
| Certbot | 伺服器 CLI | ✅ | ✅ | Python |
| acme.sh | 伺服器 CLI | ✅ | ✅ | Shell |
| Caddy | Web 伺服器 | ✅ | ✅ | Go |
| Traefik | 反向代理 | ✅ | ✅ | Go |
| Lego | CLI 庫 | ✅ | ✅ | Go |
支援 ACME 的 CA
ACME 由 Let’s Encrypt 建立,但現在是多個 CA 使用的開放標準:
| CA | ACME 目錄 URL | 免費? |
|---|---|---|
| Let’s Encrypt | acme-v02.api.letsencrypt.org/directory | ✅ |
| ZeroSSL | acme.zerossl.com/v2/DV90 | 有限免費 |
| Buypass | api.buypass.com/acme/directory | ✅ |
| Google Trust Services | 透過 Google Cloud ACME | ✅ |
| DigiCert | 企業 ACME 端點 | 付費 |
| Sectigo | 企業 ACME 端點 | 付費 |
常見問題
ACME 和 Let’s Encrypt 是同一個東西嗎?
不是。ACME 是協議(RFC 8555)。Let’s Encrypt 是使用 ACME 的憑證授權機構。其他 CA(ZeroSSL、Buypass、Google)也支援 ACME。可以類比 HTTP 和 Google——HTTP 是協議,Google 是使用它的服務。
我能實現自己的 ACME 用戶端嗎?
可以。協議完全規範於 RFC 8555。GetHTTPS 是基於瀏覽器的實現示例。大多數語言都有庫(Python 的 certbot、Go 的 lego、JavaScript 的 acme.js)。
什麼是 ACME v2?
ACME v2 是當前版本(RFC 8555),增加了萬用字元證書支援並取代了草案 v1 協議。所有現代 ACME 用戶端使用 v2。Let’s Encrypt 於 2021 年關閉了 v1 端點。
如果 ACME 伺服器宕機會怎樣?
現有證書繼續工作(它們不會回連驗證)。你只是在恢復前無法簽發或續簽。Let’s Encrypt 有高可用性和冗餘基礎設施。