Skip to content

插件与验证方式

目标:理解"验证方式(challenge)"与"插件(plugin)"两个维度,学会按场景选型。

1. 两个概念的区别

  • 验证方式(challenge):CA 怎么验证你拥有域名——HTTP-01DNS-01TLS-ALPN-01
  • 插件(plugin):Certbot 怎么"自动完成验证"以及"怎么安装证书"——nginxapachewebrootstandalonemanualdns-*

一个插件通常绑定某类验证方式;选择插件 = 同时决定了验证方式与安装行为。

2. 三种验证方式详解

2.1 HTTP-01(最常用)

  • CA 访问 http://<域名>/.well-known/acme-challenge/<token>,核对 Certbot 放置的内容。
  • 要求:80 端口能从公网访问,且该路径能被正确服务。
  • 优点:简单、无需改 DNS。
  • 缺点:不能签通配符;80 端口被防火墙挡或已被占用时受限。

2.2 DNS-01(唯一支持通配符)

  • 在你的域名 DNS 上加一条 TXT 记录:_acme-challenge.<域名> → CA 给定的值。
  • 优点:支持通配符 *.example.com;服务器无需开放任何入站端口。
  • 缺点:需要能改 DNS;手动模式下续期麻烦(TXT 值每次都会变),需配合 dns-* 插件或 hook 脚本自动化。

2.3 TLS-ALPN-01

  • 443 端口用特定 ALPN 协议响应验证,不走 80。
  • 优点:80 被占用/封禁、但 443 可用时很合适;验证与 HTTPS 同端口。
  • 缺点:需要 443 空闲(不能与现有 HTTPS 服务冲突);不支持通配符;部分插件支持有限。

3. 插件速查表

插件验证方式是否安装证书典型用法 / 场景
nginxHTTP-01✅ 自动改 Nginx 配置有 Nginx 且希望全自动
apacheHTTP-01✅ 自动改 Apache 配置有 Apache 且希望全自动
webrootHTTP-01❌ 仅签发已有 Web 服务、不想停服
standaloneHTTP-01(或 TLS-ALPN)❌ 仅签发没有 Web 服务 / 临时占用端口
manual手动(HTTP/DNS)通配符、特殊 DNS
dns-cloudflareDNS-01❌ 仅签发自动 DNS 验证、通配符
nginx/apachecertonly可加 --installer组合使用

4. 各插件用法

4.1 nginx / apache(全自动 + 安装)

bash
sudo certbot --nginx  -d example.com -d www.example.com
sudo certbot --apache -d example.com -d www.example.com

行为:自动改配置 → 加载证书 → 默认问是否加 HTTP→HTTPS 跳转(可用 --redirect 直接指定)。

常用附加选项:

  • --redirect:强制 HTTP 跳 HTTPS。
  • --hsts:加 HTTP Strict Transport Security。
  • --staple-ocsp:启用 OCSP Stapling。
  • --no-redirect:明确不加跳转。

4.2 webroot(不碰配置,最稳妥)

适合已有站点、不想让 certbot 动 Nginx/Apache 配置:

bash
sudo certbot certonly --webroot \
  -w /var/www/html \
  -d example.com -d www.example.com
  • -w 是网站根目录,certbot 会把验证文件写到 <根>/.well-known/acme-challenge/
  • 多域名多根目录时,可重复 -w 目录 -d 域名 对应。
  • 要求:这些域名对应的站点能从公网访问到该目录。

注意:webroot 方式下 certbot 不会帮你配 Nginx,需手动把 fullchain.pem / privkey.pem 写进配置(见 05-实战场景)。

4.3 standalone(无 Web 服务 / 临时起服务)

certbot 自己临时监听 80(或 443)端口完成验证,需端口空闲:

bash
sudo systemctl stop nginx        # 先停掉占用 80/443 的服务
sudo certbot certonly --standalone -d example.com
sudo systemctl start nginx
  • --preferred-challenges tls-alpn 可改为走 443(--standalone --preferred-challenges tls-alpn)。
  • 适合:后端服务用别的端口、或签发时不想依赖现有 Web 配置。

4.4 manual(手动,通配符常用)

bash
sudo certbot certonly \
  --manual --preferred-challenges dns \
  -d example.com -d '*.example.com'

交互式地提示你加 TXT 记录。注意:manual 模式默认无法自动续期(因为每次 TXT 值不同、需要人工干预),除非配合 hook 脚本:

bash
sudo certbot certonly \
  --manual --preferred-challenges dns \
  --manual-auth-hook /path/to/auth-hook.sh \
  --manual-cleanup-hook /path/to/cleanup-hook.sh \
  -d example.com -d '*.example.com'

--manual-auth-hook 脚本负责自动去 DNS 加 TXT,--manual-cleanup-hook 负责删除。这是手动 DNS 全自动化的通用做法。

4.5 dns-* 插件(DNS 全自动,通配符首选)

各 DNS 服务商有对应插件,如 dns-cloudflaredns-route53(AWS)、dns-googledns-digitaloceandns-aliyundns-dnspod 等。以 Cloudflare 为例:

bash
# 1. 准备凭据文件(API token 即可,权限只给 DNS 编辑)
sudo tee /root/.secrets/cloudflare.ini > /dev/null <<'EOF'
dns_cloudflare_api_token = 你的_API_Token
EOF
sudo chmod 600 /root/.secrets/cloudflare.ini

# 2. 签发(含通配符)
sudo certbot certonly \
  --dns-cloudflare \
  --dns-cloudflare-credentials /root/.secrets/cloudflare.ini \
  -d example.com -d '*.example.com'

优点:全自动、可自动续期、支持通配符、无需开放端口。各插件的凭据键名不同,查官方文档或 certbot --help dns-cloudflare

5. 选型决策树

要通配符 *.example.com?
├─ 是 → DNS-01
│        ├─ DNS 服务商有 certbot 插件 → dns-* 插件(首选)
│        └─ 没有插件 → manual + auth/cleanup hook
└─ 否 → 看 Web 服务
         ├─ 有 Nginx/Apache 且想让 certbot 自动配 → --nginx / --apache
         ├─ 有 Web 服务但不想动配置 → webroot(HTTP-01)
         ├─ 80 被占但 443 空闲 → standalone --preferred-challenges tls-alpn
         └─ 无 Web 服务、80 空闲 → standalone