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)。这能在消耗速率限制次数之前捕获配置错误 — 这是其他浏览器端工具所没有的功能。