在当今的互联网环境中,为网站启用HTTPS已成为一项基本的安全措施,Let's Encrypt作为一家免费、自动化、开放的证书颁发机构(CA),极大地降低了获取SSL/TLS证书的门槛,Certbot是Let's Encrypt官方推荐的客户端工具,能够自动化申请和部署证书的绝大部分流程,在某些特定的网络环境下,标准的验证方式可能会失效,这时,certbot manual dns插件便成为一个强大且不可或缺的解决方案。

什么是Certbot Manual DNS插件?
certbot manual dns是Certbot的一个插件,它通过DNS-01挑战类型来验证域名的所有权,与常见的HTTP-01挑战不同,后者要求您的Web服务器能够通过公网的80或443端口接收来自Let's Encrypt验证服务器的请求,而DNS-01挑战则完全绕开了这个限制。
它的工作原理是:Certbot会生成一个唯一的文本记录(TXT record),用户需要手动登录到自己的DNS服务商管理后台,为指定的域名(通常是_acme-challenge.yourdomain.com)添加这条TXT记录,一旦该记录在全球DNS系统中成功传播,Let's Encrypt的验证服务器通过查询该TXT记录来确认您确实拥有对该域名的控制权,从而签发证书。
何时需要使用Manual DNS模式?
这种验证方式特别适用于以下几种场景:
- 服务器位于防火墙或NAT之后:当您的服务器没有独立的公网IP地址,或者80/443端口被防火墙严格封锁时,无法使用HTTP-01挑战。
- 内部网络或Intranet应用:为内部服务(如GitLab、Jenkins等)申请证书,这些服务不对外暴露。
- 申请通配符证书:这是DNS-01挑战的一个关键应用,Let's Encrypt规定,所有通配符证书(如
*.example.com)必须使用DNS-01验证方式,因为通配符无法通过HTTP文件验证来覆盖所有可能的子域名。 - IP地址变更频繁:对于动态IP环境,DNS验证比绑定特定IP的验证方式更为灵活。
使用Certbot Manual DNS的详细步骤
使用该插件的过程虽然需要手动干预,但逻辑清晰,步骤明确。
前提条件:您已经在服务器上安装了Certbot,并且拥有您域名的DNS管理权限。
第一步:运行Certbot命令
打开终端,执行以下命令,请将example.com和www.example.com替换为您自己的域名。
sudo certbot certonly --manual --preferred-challenges dns -d example.com -d www.example.com
certonly:表示只获取证书,不自动安装或配置Web服务器。--manual:指定使用手动插件。--preferred-challenges dns:明确告诉Certbot优先使用DNS-01挑战。-d:指定需要为哪些域名申请证书,可以同时指定多个。
第二步:创建DNS TXT记录

执行命令后,Certbot会显示类似以下的输出:
Please deploy a DNS TXT record under the name
_acme-challenge.example.com with the following value:
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Before continuing, verify the record is deployed.
您需要做的是:
- 登录您的域名注册商或DNS服务商(如Cloudflare、GoDaddy、阿里云等)的管理控制台。
- 找到DNS解析设置页面。
- 添加一条新的TXT记录。
- 主机记录/名称:填入
_acme-challenge(有些服务商要求填完整域名_acme-challenge.example.com)。 - 记录类型:选择
TXT。 - 记录值/值:填入Certbot生成的那段长长的随机字符串。
- 主机记录/名称:填入
第三步:验证DNS记录传播
DNS记录的更改需要时间在全球范围内生效,这个过程称为传播,虽然通常很快,但等待几分钟是明智的做法,您可以使用以下命令来验证TXT记录是否已成功部署:
dig _acme-challenge.example.com TXT +short
如果命令返回了您刚刚设置的值,说明记录已经生效,您也可以使用在线DNS查询工具进行验证。
第四步:完成证书申请
确认DNS记录生效后,回到终端,按Enter键,Certbot将继续与Let's Encrypt通信,完成验证并下载证书,成功后,它会告知证书文件的存储位置,通常在/etc/letsencrypt/live/example.com/目录下。
HTTP-01挑战与DNS-01挑战对比
为了更清晰地理解其差异,下表小编总结了两种主要挑战方式的特点:

| 特性 | HTTP-01 挑战 | DNS-01 挑战 |
|---|---|---|
| 验证方法 | 在Web服务器根目录放置特定文件 | 在DNS解析中添加特定的TXT记录 |
| 端口要求 | 需开放公网80端口 | 无端口要求,仅需DNS管理权限 |
| 通配符支持 | 不支持 | 支持 |
| 自动化程度 | 高(可自动完成验证) | 低(手动插件需干预,但可通过API插件实现自动化) |
| 适用场景 | 标准公网Web服务器 | 内部服务器、防火墙后、通配符证书 |
局限性与注意事项
尽管certbot manual dns非常强大,但它也有一个显著的缺点:手动过程不利于自动化续期,Let's Encrypt证书的有效期为90天,需要定期续期,每次续期,您都必须重复上述手动添加TXT记录的步骤。
对于需要完全自动化的环境,建议使用Certbot提供的其他DNS API插件(如certbot-dns-cloudflare, certbot-dns-route53等),这些插件通过调用DNS服务商的API自动完成TXT记录的添加和删除,从而实现真正的无人值守续期,但这需要配置API密钥,并确保其安全性。
相关问答FAQs
问题1:我能否将certbot manual dns的续期过程也实现自动化?
解答:直接使用--manual插件是无法实现自动化的,因为其设计初衷就是需要人工介入,这并不意味着您必须手动续期,Certbot提供了大量针对主流DNS服务商的专用插件(certbot-dns-cloudflare、certbot-dns-aliyun),您只需配置一次DNS服务商的API凭证,Certbot在续期时就能通过API自动完成TXT记录的创建与删除,从而实现完全自动化的续期,这是在生产环境中处理DNS验证证书续期的最佳实践。
问题2:我添加了DNS TXT记录,但Certbot验证失败,可能是什么原因?
解答:这通常是几个常见问题导致的,请确保您没有复制粘贴错误,任何多余的空格或换行符都会导致验证失败。DNS传播可能需要时间,虽然通常很快,但在某些地区或DNS服务商那里可能需要更长时间,建议等待5-10分钟后再按Enter键,请使用dig或在线工具再次确认TXT记录的值与Certbot给出的完全一致,并且主机记录(如_acme-challenge)配置正确,如果您的域名使用了CDN服务,请确保CDN没有代理DNS查询,或者直接在权威DNS服务器上进行配置。