用户机器在没有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`参数输出详细日志帮助定位问题。

系统时间:确保服务器系统时间准确,时间偏差过大可能导致验证失败。