术语表

HTTP-01 (HTTP-01 验证)

最后核实

定义

HTTP-01 是一种 ACME 验证方式,客户端通过 80 端口以普通 HTTP 提供 CA 指定的令牌内容来证明域名控制权。

HTTP-01 是最常用的 ACME 质询类型。CA 给客户端一个令牌(token),客户端把密钥授权内容(令牌加账户公钥指纹)放到 http://example.com/.well-known/acme-challenge/TOKEN,CA 再按 MPIC 要求从多个网络视角来访问。验证总是从 80 端口开始,CA 会跟随重定向,包括跳转到 443 端口的 HTTPS。宝塔面板申请 Let's Encrypt 时的“文件验证”就是 HTTP-01。

为什么重要

HTTP-01 不需要 DNS 权限,任何 Web 服务器都能用,Certbot 等客户端还能自动修改 nginx 或 Apache 配置。它的限制同样重要:不能用于通配符证书;80 端口必须能从公网访问;负载均衡后面的每台服务器都要返回同样的内容。在中国大陆的云服务器上,未完成 ICP 备案的域名访问 80/443 端口通常会被云厂商拦截,导致 HTTP-01 失败。证书签发本身与备案无关,这种情况可以改用 DNS-01。

例子

在 nginx 中放行验证路径,其余请求跳转到 HTTPS:

server {
    listen 80;
    server_name example.com;

    location ^~ /.well-known/acme-challenge/ {
        root /var/www/html;
        default_type "text/plain";
    }

    location / {
        return 301 https://$host$request_uri;
    }
}

申请证书前先自测路径能否访问:

mkdir -p /var/www/html/.well-known/acme-challenge
echo ok > /var/www/html/.well-known/acme-challenge/test
curl -i http://example.com/.well-known/acme-challenge/test

常见误区

  • 配置了 HTTP 跳转 HTTPS 就会导致 HTTP-01 失败。 CA 会跟随跳转,真正导致失败的是关闭 80 端口或被防火墙拦截。
  • 只放行 CA 的 IP 就够了。 验证来自多个且会变化的网络位置。
  • *HTTP-01 可以申请 .example.com。 通配符域名必须用 DNS-01。

延伸阅读