HTTP-01 是獲取 SSL 證書時最常用的 ACME 驗證型別。憑證授權機構 (CA) 透過 HTTP 80 埠從你的 Web 伺服器獲取指定檔案來驗證域名控制權。它比 DNS-01 更簡單,但不能用於 萬用字元證書。
工作原理
- Let’s Encrypt 給你一個 token(隨機字串)
- 你在
http://yourdomain.com/.well-known/acme-challenge/{token}建立一個檔案 - 檔案內容是 key authorization — token 與你 ACME 賬戶金鑰指紋的組合
- Let’s Encrypt 從公網訪問該 URL
- 如果內容匹配,驗證透過,證書即被簽發
使用 GetHTTPS 時,第 1 步和第 3 步自動完成 — 你只需將螢幕上顯示的值放到伺服器上的檔案中。
如何放置驗證檔案
透過 SSH(Linux/Nginx/Apache)
# Create the directory
mkdir -p /var/www/html/.well-known/acme-challenge/
# Create the file with the exact values from GetHTTPS
echo "KEY_AUTHORIZATION_FROM_GETHTTPS" > /var/www/html/.well-known/acme-challenge/TOKEN_FROM_GETHTTPS
# Verify it's accessible
curl http://yourdomain.com/.well-known/acme-challenge/TOKEN_FROM_GETHTTPS
透過 cPanel 檔案管理器
- 進入
public_html - 建立資料夾
.well-known→ 在其中建立資料夾acme-challenge - 建立一個以 token 值命名的檔案
- 將 key authorization 貼上為檔案內容
- 確保許可權為 644(Web 伺服器可讀)
透過 FTP
- 連線到站點根目錄
- 建立
.well-known/acme-challenge/目錄路徑 - 上傳一個以 token 命名的文字檔案,內容為 key authorization
伺服器配置
某些 Web 伺服器需要額外配置才能提供 .well-known 目錄中的檔案:
Nginx
# Add to your server block if .well-known returns 404
location /.well-known/acme-challenge/ {
root /var/www/html;
allow all;
}
Apache
Apache 通常預設提供 .well-known 目錄。如果不行:
Alias /.well-known/acme-challenge/ /var/www/html/.well-known/acme-challenge/
<Directory "/var/www/html/.well-known/acme-challenge/">
AllowOverride None
Options None
Require all granted
</Directory>
Node.js / Express
app.use('/.well-known/acme-challenge', express.static('challenges'));
要求
- 域名必須解析到你伺服器的公網 IP 地址
- 80 埠必須開放 — Let’s Encrypt 始終透過 HTTP 驗證,而非 HTTPS
- 響應必須返回 HTTP 200 OK
- 不能跨域重新導向 — 同域名的 HTTP→HTTPS 重新導向可以
- 檔案必須無需認證即可訪問(不能有 Basic Auth 或登入攔截)
何時使用 HTTP-01
| 場景 | 適合 HTTP-01? |
|---|---|
| 單域名證書 | ✅ 是 — 最簡單的選項 |
| 域名 + www 證書 | ✅ 是 — 每個名稱一次驗證 |
萬用字元證書(*.example.com) | ❌ 否 — 使用 DNS-01 |
| 80 埠被封 | ❌ 否 — 使用 DNS-01 |
| 在 Cloudflare 代理後面 | ⚠️ 可能需要先將 DNS 切換為僅 DNS(灰色雲朵) |
| 完全沒有伺服器訪問許可權 | ❌ 否 — 使用 DNS-01(只需 DNS 訪問許可權) |
HTTP-01 與 DNS-01 對比
| HTTP-01 | DNS-01 | |
|---|---|---|
| 操作內容 | 在伺服器上放置檔案 | 在 DNS 中新增 TXT 記錄 |
| 所需許可權 | Web 伺服器檔案系統 | 域名 DNS 設定 |
| 埠要求 | 80 埠開放 | 無 |
| 萬用字元支援 | ❌ | ✅ |
| 速度 | 即時(檔案可訪問的前提下) | 1-15 分鐘(DNS 傳播) |
| CDN 後是否可用 | ⚠️ 可能需要繞過 CDN | ✅ 始終可用 |
| 最適合 | 大多數單域名證書 | 萬用字元、無伺服器、CDN 場景 |
故障排除
驗證檔案返回 404
- 檢查路徑是否正確 — 必須是
/.well-known/acme-challenge/TOKEN,不要多餘的斜槓 - 檢查檔案許可權 — chmod 644
- Nginx: 配置可能阻止了點檔案(dotfiles)。新增上述
location塊 - cPanel: 檔案管理器可能隱藏了
.well-known— 啟用”顯示隱藏檔案”
檔案可訪問但驗證仍然失敗
- 從外部網路檢查: 從另一臺機器執行
curl http://yourdomain.com/.well-known/acme-challenge/TOKEN或使用線上工具 - DNS 可能指向其他伺服器 — 用
dig +short yourdomain.com確認返回的是你伺服器的 IP - Cloudflare 代理: 驗證期間臨時切換為僅 DNS(灰色雲朵)
80 埠被封
某些主機或防火牆會封鎖 80 埠。解決方案:
- 開放 80 埠(哪怕只是在驗證期間臨時開放)
- 改用 DNS-01 驗證 — 不需要 80 埠
- 聯絡主機商,要求允許
.well-known路徑透過代理
”too many requests” 錯誤
你觸發了 Let’s Encrypt 的速率限制。等待後重試。GetHTTPS 的預檢功能會在提交前驗證檔案是否可訪問,幫助避免浪費請求次數。
常見問題
獲取證書後可以刪除驗證檔案嗎?
可以。該檔案僅在驗證時需要。證書籤發後,刪除 .well-known/acme-challenge/ 目錄及其內容即可。續簽時會建立新檔案。
檔案需要透過 HTTPS 提供嗎?
不需要。Let’s Encrypt 的 HTTP-01 驗證始終透過**明文 HTTP(80 埠)**進行,即使你的站點支援 HTTPS。同域名的 HTTP→HTTPS 重新導向會被跟隨,但初始請求始終是 HTTP。
一張證書包含多個域名時能用 HTTP-01 嗎?
可以。證書中的每個域名需要各自的驗證檔案。如果你申請 example.com 和 www.example.com 的證書,需要放置兩個檔案 — 每個域名一個 token。GetHTTPS 會依次處理它們。
GetHTTPS 中的”預檢”是什麼?
在向 Let’s Encrypt 提交之前,GetHTTPS 會驗證你的驗證檔案是否能從公網訪問(透過 Google 的 DNS-over-HTTPS)。這能在消耗速率限制次數之前捕獲配置錯誤 — 這是其他瀏覽器端工具所沒有的功能。