群晖 NAS 用 acme.sh 申请 SSL 证书:DNS-01 不开端口做法

什么时候适合用 DNS-01

群晖 NAS 想使用 Let's Encrypt 证书,但不方便把 80、443 端口开放到公网时,可以用 acme.sh 配合 DNS-01 验证。这个方式通过 DNS TXT 记录证明域名归属,不需要把 DSM 登录页暴露出去。

下面以 Cloudflare DNS 为例。其他 DNS 服务商也能做,关键是到 acme.sh 的 DNS API 文档里找到对应的 --dns 参数和环境变量。

准备工作

  • 一个已托管到 Cloudflare 的域名,或其他支持 API 的 DNS 服务。
  • 群晖 DSM 管理权限,并能通过 SSH 登录。
  • 一个受限的 Cloudflare API Token,权限只给目标域名的 DNS 编辑能力。

安装 acme.sh

如果机器上还没有 acme.sh,可以先安装到固定目录。已经安装过的环境,不要重复覆盖,直接沿用原来的 --home 路径。

sudo -i
mkdir -p /usr/local/share/acme.sh
wget -O - https://get.acme.sh | sh -s email=you@example.com --home /usr/local/share/acme.sh --nocron
. "/usr/local/share/acme.sh/acme.sh.env"

这里用 --nocron,是为了后面在 DSM 的任务计划里统一配置续期任务。

配置 Cloudflare DNS

旧教程里常见的 CF_Key 是 Cloudflare Global API Key。现在更建议使用权限更小的 API Token,泄露后的影响范围也更容易控制。

export CF_Token="CF_TOKEN_HERE"
export CF_Zone_ID="ZONE_ID_HERE"

CF_Zone_ID 适合只给一个域名申请证书;如果同一账号下要处理多个域名,也可以按 acme.sh 文档改用 CF_Account_ID。不要把真实 Token 写进公开文章、截图或群聊记录里。

申请证书

先把要申请证书的域名写成变量,再执行 DNS-01 申请。

export CERT_DOMAIN="nas.example.com"
/usr/local/share/acme.sh/acme.sh --issue --server letsencrypt --home /usr/local/share/acme.sh -d "$CERT_DOMAIN" --dns dns_cf

如果要申请泛域名证书,可以写成:

/usr/local/share/acme.sh/acme.sh --issue --server letsencrypt --home /usr/local/share/acme.sh -d "example.com" -d "*.example.com" --dns dns_cf

部署到 Synology DSM

如果 acme.sh 就运行在 DSM 本机,优先使用 Synology deploy hook 的临时管理员方式。这样不需要把自己的 DSM 管理员账号密码保存到 acme.sh 配置文件里。

export SYNO_USE_TEMP_ADMIN=1
export SYNO_HOSTNAME="localhost"
export SYNO_PORT="5000"
export SYNO_CREATE=1
/usr/local/share/acme.sh/acme.sh --deploy --home /usr/local/share/acme.sh -d "$CERT_DOMAIN" --deploy-hook synology_dsm

SYNO_CREATE=1 只在第一次创建证书时需要。后续续期部署一般不需要再设置。

如果必须远程部署到 DSM,再按官方 deploy hook 文档配置现有管理员、OTP 和 HTTPS 端口。旧文里的 Synology 变量大小写不要再照抄,也不要把真实 DSM 密码写进公开文章、截图或群聊记录里。

自动续期

在 DSM「控制面板 > 任务计划」中新建一个 root 用户执行的计划任务,每天运行一次即可。

/usr/local/share/acme.sh/acme.sh --cron --home /usr/local/share/acme.sh

acme.sh 会判断证书是否快到期,不是每天都重新申请。第一次跑通后,建议手动执行一次任务,看日志里有没有 DNS、权限或 DSM 登录错误。

常见检查点

  • Cloudflare Token 只授予目标 zone 的 DNS 编辑权限,不要使用全局密钥。
  • 保护 /usr/local/share/acme.sh/account.conf,里面会保存续期需要的环境变量。
  • DSM 开了两步验证时,按官方文档处理 OTP 或设备 ID,不要把验证码种子写进脚本。
  • 证书部署成功后,到 DSM「安全性 > 证书」里确认服务是否绑定到新证书。

简单总结:DNS-01 负责安全地签发证书,Synology deploy hook 负责把证书放进 DSM。Cloudflare 用受限 Token,DSM 本机部署优先用临时管理员方式,后期维护会少很多风险。

参考:acme.sh DNS API 文档Synology DSM deploy hook 文档

Caleb
Caleb管理员

上一篇:找不到苹果(iphone)手机显示的未读短信怎么办?
下一篇:M-SHOP -内容分发-知识付费-卡密系统-虚拟商品销售系统-自动发货商城系统

留言评论

暂无留言
请先 登录 再评论,若不是会员请先 注册
取消
扫码支持