插件与验证方式
目标:理解"验证方式(challenge)"与"插件(plugin)"两个维度,学会按场景选型。
1. 两个概念的区别
- 验证方式(challenge):CA 怎么验证你拥有域名——
HTTP-01、DNS-01、TLS-ALPN-01。 - 插件(plugin):Certbot 怎么"自动完成验证"以及"怎么安装证书"——
nginx、apache、webroot、standalone、manual、dns-*。
一个插件通常绑定某类验证方式;选择插件 = 同时决定了验证方式与安装行为。
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. 插件速查表
| 插件 | 验证方式 | 是否安装证书 | 典型用法 / 场景 |
|---|---|---|---|
nginx | HTTP-01 | ✅ 自动改 Nginx 配置 | 有 Nginx 且希望全自动 |
apache | HTTP-01 | ✅ 自动改 Apache 配置 | 有 Apache 且希望全自动 |
webroot | HTTP-01 | ❌ 仅签发 | 已有 Web 服务、不想停服 |
standalone | HTTP-01(或 TLS-ALPN) | ❌ 仅签发 | 没有 Web 服务 / 临时占用端口 |
manual | 手动(HTTP/DNS) | ❌ | 通配符、特殊 DNS |
dns-cloudflare 等 | DNS-01 | ❌ 仅签发 | 自动 DNS 验证、通配符 |
nginx/apache 的 certonly | — | 可加 --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-cloudflare、dns-route53(AWS)、dns-google、dns-digitalocean、dns-aliyun、dns-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