用户机器在没有80端口的环境里,DNS-01挑战模式是申请SSL证书最直接有效的方案。它的验证完全通过DNS解析进行,不依赖任何Web服务端口,是内网穿透或全端口转发环境下的最佳选择。
DNS-01挑战简介
DNS-01挑战的核心原理是,证书颁发机构(CA,如Let's Encrypt)会要求你为域名创建一个特定的TXT解析记录,以此来证明你对域名的所有权。整个过程对端口没有任何要求,即使你的服务器完全在内网,只要你能控制域名的DNS解析就能完成。
解决方案:使用DNS-01挑战模式申请证书
下面详细介绍具体操作步骤。
1. 准备环境
你需要确保:
拥有一个域名:这是申请全球信任的SSL证书(如Let's Encrypt)的前提条件。内网IP地址无法申请此类证书。
能控制域名的DNS解析:你需要有权限为你的域名添加TXT解析记录。
2. 选择工具
推荐使用`acme.sh`,它是一个轻量、强大的ACME客户端,对DNS API的支持最为广泛。`Certbot`也是一个优秀的选择,但配置DNS插件可能稍显复杂。
3. 方法一:自动化API方式(强烈推荐)
这是最便捷、最高效的方法,可以实现证书的自动申请和续期。
通用步骤:
1. 安装acme.sh:
bash
curl https://get.acme.sh | sh
2. 设置DNS API凭证:根据你的DNS服务商,设置对应的环境变量。例如,Cloudflare需要设置`CF_Token`。
bash
export CF_Token="你的Cloudflare API Token"
3. 执行申请命令:
bash
acme.sh --issue --dns dns_cf -d example.com -d '*.example.com'
`acme.sh`会自动调用API添加TXT记录并完成验证。
主流DNS服务商参数对照表:为了方便你配置,这里列出了几家主流服务商的环境变量名。
DNS服务商 `acme.sh` 参数 (`--dns`) 所需环境变量 变量值示例/说明
Cloudflare `dns_cf` `CF_Token` |你的Cloudflare API Token
阿里云 `dns_ali` `Ali_Key`<br>`Ali_Secret` AccessKey ID<br>AccessKey Secret
腾讯云 `dns_dp` `DP_Id`<br>`DP_Key` DNSPod API ID<br>DNSPod API Token
GoDaddy `dns_gd` `GD_Key`<br>`GD_Secret` API Key<br>API Secret
4. 方法二:手动DNS方式(备用方案)
当你的DNS服务商不提供API,或你不想使用API时,可以使用手动模式。
1. 执行手动申请命令:
bash
acme.sh --issue --dns -d example.com --yes-I-know-dns-manual-mode-enough-go-ahead-please
2. 手动添加TXT记录:命令执行后,`acme.sh`会提示你一条TXT记录值。你需要登录DNS管理后台,为`_acme-challenge.example.com`添加这条记录。
3. 等待并重新生成证书:DNS解析生效后(可能需要几分钟到几小时),执行以下命令完成证书生成:
bash
acme.sh --renew -d example.com --yes-I-know-dns-manual-mode-enough-go-ahead-please
5. 部署证书
无论用哪种方式,SSL证书生成后,可以将其安装到Web服务器或Nginx Proxy Manager等工具中:
bash
acme.sh --install-cert -d example.com \
key-file /path/to/example.com.key \
fullchain-file /path/to/example.com.pem \
reloadcmd "systemctl reload nginx"
总结:不同场景方案选择
根据你的需求,可以参考下表选择合适的方案:
你的场景 推荐方案 优点 缺点
有DNS API访问权限 自动化API方式 全自动申请和续期,无需人工干预 需要配置API凭证
无DNS API权限 手动DNS方式 通用性强,无需配置API 续期需要人工操作,无法自动化
全端口转发/NAT环境 自动化API方式 证书申请与你的服务器网络环境完全解耦 | 同上
内网环境 自动化API方式 同上 | 同上
注意事项
DNS传播延迟:手动添加TXT记录后,DNS解析在全球生效需要时间,可能导致验证超时。
Let's Encrypt速率限制:每个域名每周最多申请5次证书,测试时请使用`--dry-run`参数。
API凭证安全:切勿将API凭证提交到公开代码仓库或分享给他人。
续期:自动化方式配置后`acme.sh`会自动续期。手动方式则需重复手动操作。
调试:如果申请失败,可以使用`--debug`参数输出详细日志帮助定位问题。
系统时间:确保服务器系统时间准确,时间偏差过大可能导致验证失败。