DDNS 域名签发 SSL 证书方案

温馨提示:
本文所述内容具有依赖性,可能因软硬条件不同而与预期有所差异,故请以实际为准,仅供参考。

AKA:在端口封闭和 DNS 受限环境下使用 ACME 签发 SSL 证书的终极指南

背景:为什么需要给 DDNS 域名签发证书?

在网络安全日益重要的今天,为我们的服务启用 HTTPS 已是标配。然而,在一些复杂的家庭或小微企业网络环境中,我们常常会遇到一些棘手的限制,例如:

  • 动态公网IP:IP 地址不固定,必须依赖 DDNS(动态 DNS)。
  • 端口封闭:运营商封禁了建站必备的80443端口。
  • DNS功能受限:使用的 DDNS 服务商(如ChangeIP)不支持添加TXT记录。

在这种看似“无解”的情况下,我们还能否使用 ACME 协议(如acme.sh工具)来自动签发和续订免费的 SSL 证书呢?答案是肯定的。本文将从问题分析到最终实践,为您提供一套完整的解决方案。

问题根源:为何标准 ACME 验证方法会失败?

ACME 协议为了确认您对域名的所有权,提供了三种主流的验证“挑战”(Challenge)。但在上述限制下,它们都会一一失效。

验证方式工作原理在当前环境下的困境
HTTP-01ACME 服务器通过80端口访问您域名下的一个特定文件。失败:公网80端口被禁止访问。
TLS-ALPN-01ACME 服务器通过443端口在 TLS 握手阶段验证一个特殊证书。失败:公网443端口被禁止访问。
DNS-01ACME 客户端在您的 DNS 记录中添加一个特定的TXT记录供 ACME 服务器查询。失败:DDNS 服务商不支持添加TXT记录。

所有常规的路都被堵死了,我们必须另辟蹊径。

解决方案:DNS 别名模式 (DNS Alias Mode)

这个方案的核心思想是“权限转移”。既然主域名的 DNS 服务商功能受限,那我们就把 ACME 验证的“权力”通过CNAME记录,委托给一个功能强大的、支持 API 操作的 DNS 服务商(如 Cloudflare, 华为云 DNS 等)。

操作流程

1、准备第二个域名: 您需要拥有另一个域名(我们称之为“工具域名”,可以是子域名),并将其 DNS 管理权完全托管在支持 API 的服务商上(例如,将vircloud.net托管在华为云 DNS)。

2、设置 CNAME 别名记录 (关键步骤): 在您功能受限的 DDNS 服务商(如 ChangeIP)的管理面板上,为需要签发证书的域名(例如changeip.ddns.mobi)添加一条特定CNAME记录。

 **主机/名称**: `_acme-challenge.changeip.ddns.mobi`
 **类型**: `CNAME`
 **值/指向**: `_acme-challenge.sub.vircloud.net` (指向您在华为云上控制的那个域名下,要作为验证的子域名)

工作原理: 当 ACME 服务器查询 _acme-challenge.changeip.ddns.mobi 的 TXT 记录时,DNS 系统会告诉它:“这里没有 TXT 记录,但请你去查询 _acme-challenge.sub.vircloud.net”。这样,验证的压力就成功转移到了华为云 DNS 上。

3、执行 acme.sh 命令: 使用--domain-alias参数来执行签发。

acme.sh --issue \
        --dns dns_huaweicloud \
        -d changip.ddns.mobi \
        --domain-alias _acme-challenge.sub.vircloud.net

acme.sh会足够智能地通过华为云 API,在_acme-challenge.sub.vircloud.net上自动创建和删除所需的 TXT 记录,从而完成对changeip.ddns.mobi的验证。签发前首先需设置华为云的 API 密钥为环境变量,可参考《acme.sh 已支持华为云解析 API 自动验证签发证书

故障排查:当签发失败时

在实践中,您可能会遇到 acme.sh执行失败的情况,一个典型的错误日志是:

The retryafter=86400 value is too large (> 600), will not retry anymore.

这表示 CA 服务器在验证时遇到了它认为是“永久性”的错误,直接拒绝了后续重试。90% 以上的情况是 CA 的 DNS 解析器未能成功找到最终的 TXT 记录。

请遵循以下步骤进行排查:

1. 验证 CNAME 记录 (必须执行)

在任何一台有dig命令的服务器上,检查您的 CNAME 记录是否已正确设置并生效。

dig CNAME _acme-challenge.changeip.ddns.mobi +short
  • 正确的输出 应该是 _acme-challenge.sub.vircloud.net.
  • 错误的输出 如果没有任何返回,说明您在 ChangeIP 上的 CNAME 记录设置有误(比如设成了changeip.ddns.mobi而不是_acme-challenge.chengip.ddns.mobi)或者还未生效。请务必修正此项。

2. 切换 ACME 服务商并增加等待时间

不同的 CA 有不同的网络和策略。切换到兼容性最好的 Let's Encrypt,并给 DNS 记录更长的传播时间,是标准的调试手段。

acme.sh --issue \
        --server letsencrypt \
        --dns dns_huaweicloud \
        -d changeip.ddns.mobi \
        --domain-alias _challenge.sub.vircloud.net \
        --dnssleep 120 \
        --force
  • --server letsencrypt: 切换到 Let's Encrypt。
  • --dnssleep 120: 在创建 TXT 记录后,强制等待 120 秒再通知 CA 验证。
  • --force: 强制重新走一遍签发流程。

3. 开启 Debug 模式获取详细信息

如果问题依旧,开启--debug 2可以看到与 CA 通信的完整日志,从中找到最根本的失败原因。

acme.sh --issue ... --debug 2

附录:主流免费ACME服务商

acme.sh支持多个 ACME CA,您可以在它们之间轻松切换。

服务商acme.sh 参数特点
Let's Encryptletsencrypt行业标准,兼容性最佳,90 天证书,调试首选
ZeroSSLzerosslacme.sh新版默认,商业公司,90 天证书,可能屏蔽 CN。
Buypassbuypass挪威服务商,已停止免费 acme.sh 服务,请注意。
GooglegoogleGoogle 提供的公共 CA,基础设施强大,90 天证书。

切换默认 CA 的命令:

acme.sh --set-default-ca --server letsencrypt

总结

通过巧妙地运用 DNS 的 CNAME 记录和 acme.sh--domain-alias 功能,我们可以完美地将 DDNS 更新与 ACME 验证解耦,从而突破端口封闭和 DNS 功能受限带来的困境,实现 SSL 证书的自动化签发。尽管配置过程略显曲折,但一旦成功,您将拥有一套一劳永逸的 HTTPS 解决方案。


相关文章:

1、《利用华为云 API 实现自动 DDNS 功能|支持IPv4|IPv6


ArmxMod for Typecho
个性化、自适应、功能强大的响应式主题

推广

 继续浏览关于 SSLddnsacme动态IP安全证书部署方案 的文章

 本文最后更新于 2025/12/16 11:09:33,可能因经年累月而与现状有所差异

 引用转载请注明: VirCloud's Blog > 运维 > DDNS 域名签发 SSL 证书方案

精选评论

  1. Jonty
    Jonty 回复

    Windows 10Chrome 122.0.6261.95来自 上海 的大神

    学习了!!