申请 Let's Encrypt 泛域名证书续签时是否必须使用 DNS 验证方式?

文章导读
是的,Let's Encrypt 泛域名证书在首次申请和后续续签时,都必须使用 DNS 验证方式,无法使用 HTTP 验证。
📋 目录
  1. 命令与插件准备
  2. 配置文件检查
  3. 为什么会这样
  4. 分步处理
  5. 怎么验证是否生效
  6. 常见坑
  7. 参考来源
A A

是的,Let's Encrypt 泛域名证书在首次申请和后续续签时,都必须使用 DNS 验证方式,无法使用 HTTP 验证。

先说结论:泛域名证书的性质决定了它只能通过 DNS-01 挑战来验证所有权,续签时规则不变。

  • 适合:所有需要保护主域名及所有子域名的场景
  • 先准备:确保证书管理工具拥有 DNS 服务商的 API 权限或人工修改记录的能力
  • 验收:续签后检查证书有效期是否更新且包含泛域名标识

命令与插件准备

通常情况下,Certbot 会自动读取初次申请时的配置,续签只需运行基础命令。但需确保已安装对应 DNS 服务商的插件。

1. 安装 DNS 插件

根据你的 DNS 服务商选择对应的插件,例如 Cloudflare 或 阿里云:

# Cloudflare 示例
apt install python3-certbot-dns-cloudflare

# 阿里云 示例
pip install certbot-dns-aliyun

2. 执行续签

自动化续签(推荐):直接运行以下命令,Certbot 会读取 `/etc/letsencrypt/renewal/` 下的配置文件自动匹配验证方式。

certbot renew

手动强制指定(仅当自动读取失败时):需明确指定 authenticator 和凭证路径。

certbot renew `--authenticator` dns-cloudflare `--dns-cloudflare-credentials` /path/to/creds.ini `--dry-run`

配置文件检查

如果自动续签失败,请检查 Renewal 配置文件是否保留了 DNS 验证信息。

1. 查看配置路径

申请 Let's Encrypt 泛域名证书续签时是否必须使用 DNS 验证方式?

配置文件通常位于:

/etc/letsencrypt/renewal/example.com.conf

2. 核对关键参数

使用 cat 查看文件,确认 authenticator 字段不是 standalonewebroot,而应是对应的 DNS 插件名。

authenticator = dns-cloudflare
dns_cloudflare_credentials = /path/to/creds.ini

若配置错误,可重新运行申请命令并添加 `--force-renewal` 参数修正配置。

为什么会这样

这是 ACME 协议和 Let's Encrypt 策略的共同限制。HTTP-01 验证方式只能证明你对某个具体域名(如 www.example.com)的服务器有控制权,无法证明你拥有该域名下的所有子域名。

泛域名证书(*.example.com)涵盖无限个子域,HTTP 验证无法覆盖这种范围。因此,CA 机构要求必须通过 DNS 记录验证,因为只有在域名管理后台添加 TXT 记录,才能证明你拥有整个域名的管理权。这一规则在签发和续签时保持一致。

分步处理

1. 确认当前证书类型:检查现有证书是否为泛域名。使用命令 openssl x509 -in /path/to/cert.pem -text -noout | grep DNS,查看输出中是否包含 DNS:*.example.com

2. 准备 DNS 验证环境:续签通常依赖自动化脚本。检查你的定时任务(crontab)或容器配置,确认 DNS API Key 是否过期。如果是手动维护,准备好在域名控制台添加 TXT 记录。

申请 Let's Encrypt 泛域名证书续签时是否必须使用 DNS 验证方式?

3. 执行续签命令:运行续签命令。建议使用 `--dry-run` 参数先测试流程,确认无误后再正式执行。

4. 重载服务:证书文件更新后,Web 服务器不会自动加载新证书。Nginx 执行 nginx -s reload,Apache 执行 systemctl reload apache2

怎么验证是否生效

1. 命令行检查:使用 openssl s_client -connect example.com:443 -servername example.com | openssl x509 -noout -dates 查看 Not After 日期是否已延后。

2. 浏览器检查:访问任意子域名(如 test.example.com),点击地址栏锁图标,查看证书有效期和主题备用名称(SAN)中是否包含泛域名。

3. 日志确认:查看 Certbot 日志(通常在 /var/log/letsencrypt/letsencrypt.log),搜索 "Successfully renewed" 关键字,确认无报错。

常见坑

1. 速率限制锁死:Let's Encrypt 对验证失败有严格限制(每小时每域名最多 5 次失败)。若续签报错,请至少等待 1 小时后再重试,不要频繁提交请求。

2. DNS 传播延迟:手动添加 TXT 记录后,全球 DNS 生效需要时间。若验证失败,等待 1-5 分钟再重试。

3. API 权限变更:部分 DNS 服务商可能会轮换 API 密钥或调整权限策略。续签失败时,优先检查凭证文件是否依然有效。

4. 遗漏主域名:申请泛域名证书时,建议同时包含主域名(example.com)和泛域名(*.example.com)。仅申请泛域名有时会导致主域名无法匹配,具体取决于客户端实现。

参考来源

  • Let's Encrypt Official FAQ, "Does Let's Encrypt issue wildcard certificates?", https://letsencrypt.org/docs/faq/
  • Certbot Documentation, "Getting certificates", https://certbot.eff.org/docs/using.html
  • ACME Protocol RFC 8555, Section 8.3, https://www.rfc-editor.org/rfc/rfc8555.html