用户在没有80端口的内网或全端口转发环境下,DNS-01挑战确实是申请SSL证书的最佳方案。它的核心原理是通过在域名的DNS解析记录中添加特定的TXT值来证明你对域名的所有权,整个验证过程完全不需要通过用户的服务器端口,因此完美绕开了80/443端口的限制。
下面我来具体解释如何实现,并提供两种主流操作路径供你选择。
一、为什么DNS-01能解决你的问题?
与需要访问网站目录的HTTP-01不同,DNS-01挑战的工作流程如下:
1. 发起申请:你的ACME客户端(如Certbot, acme.sh)向证书颁发机构(CA)申请证书。
2. 获取挑战值:CA会生成一个唯一的验证令牌。
3. 配置DNS记录:你需要将令牌以TXT记录的形式添加到你的域名下,记录的主机记录通常是 `_acme-challenge.<你的域名>`。
4. CA验证:CA会去查询你域名的权威DNS服务器,看是否有那条特定的TXT记录。如果有且内容匹配,则验证成功,证书随即签发。
5. 清理记录:证书签发后,可以删除这条临时的TXT记录。
这个流程决定了,你只需要能够修改域名的DNS解析(通常通过域名注册商或DNS托管商的控制台),无论你的服务器是在内网、没有公网IP,还是端口全被转发,都不影响证书的申请和续期。
二、如何操作:自动与手动两种方式
根据你DNS服务商(如阿里云、腾讯云、Cloudflare等)是否支持API,可以选择以下两种方式:
方式一:全自动模式(推荐)
如果你的DNS服务商提供API接口,这是最省心的方案,可以实现申请和续期的完全自动化。
1. 获取API密钥:登录你的DNS服务商控制台,创建一个专门用于ACME程序的API密钥(Token)。为了安全,建议仅授予其“添加/删除DNS记录”的最小权限。
2. 配置ACME客户端:选择一个支持DNS-01的客户端,并在其中配置好你刚获取的API密钥。以流行的 `acme.sh` 客户端为例,为Cloudflare配置的命令大致如下:
bash
export CF_Token="你的Cloudflare API令牌"
acme.sh --issue --dns dns_cf -d example.com -d *.example.com
客户端会自动调用API添加TXT记录,等待传播,验证,最后再删除记录,整个过程无需人工干预。
3. 设置自动续期:大多数客户端在成功申请后会自动添加定时任务(Cron Job),确保证书在过期前会自动通过同样的方式续期。
方式二:半自动模式(手动模式)
如果你的DNS服务商不支持API,或者你想在申请前手动确认记录,可以使用客户端的“手动”模式。
以 `certbot` 为例,命令如下:
1. 执行命令:
bash
certbot certonly --manual --preferred-challenges dns -d example.com
2. 根据提示操作:命令执行后,`certbot` 会暂停并提示你需要在DNS中添加一条TXT记录,你会看到类似这样的信息:
Please deploy a DNS TXT record under the name:
_acme-challenge.example.com.
with the following value:
cOVnVQwdMEAXpTjjZHnPL7AMQ0gDf78T3W7_exfO4W4
3. 手动添加DNS记录:立即登录你的DNS管理后台,为域名 `example.com` 添加一条TXT记录,主机记录填 `_acme-challenge`,记录值填上面给出的那一长串字符。
4. 等待生效并确认:添加完成后,可以用 `dig` 或 `nslookup` 命令检查记录是否全球生效:
bash
dig TXT _acme-challenge.example.com @8.8.8.8
确认能查询到刚才添加的记录后,回到终端按回车继续。
5. 完成并清理:`certbot` 验证通过后就会下载证书,并提示你可以删除刚才添加的TXT记录。
注意事项与避坑指南
DNS传播延迟:TXT记录添加到DNS后,在全球生效可能需要几分钟时间。这期间CA去验证可能会找不到记录而导致失败。可以在ACME客户端配置中增加等待时间,例如 `acme.sh` 的 `--dnssleep` 参数。
API密钥安全:自动化脚本中使用的API密钥务必妥善保管,不要公开或提交到代码仓库。如果泄露,攻击者可能篡改你的DNS解析记录。
续期的可重复性:如果使用手动模式(方式二),每次证书续期(比如每60-90天)都需要你再次手动去添加一次TXT记录,无法实现完全的无人值守。因此,长远来看,支持API的全自动模式是更好的选择。
未来趋势:像 `DNS-Persist-01` 或 `DNS-ACCOUNT-01` 这样的新挑战模式正在发展中,它们旨在通过一次性的持久化DNS记录来避免每次续期都修改DNS,让自动化更安全和快速,可以保持关注。
希望这些信息对用户有帮助。如果你在配置具体DNS服务商的API时遇到问题,可以告诉我服务商的名字,我可以帮用户查找更具体的配置参数。