群晖相关
群晖一条龙申请泛域名 HTTPS 证书(acme.sh + Cloudflare DNS 验证)
群晖一条龙申请泛域名 HTTPS 证书(acme.sh + Cloudflare DNS 验证)
给群晖上的多个域名申请一张 Let's Encrypt 泛域名(通配符)证书,全程走 Cloudflare DNS 验证:不用开放 80 端口、不要求域名直接指向群晖,签发后导入 DSM,并配置自动续期 + 自动部署,所有子域名永久绿锁、全程无人值守。
适用场景
- 有一个一级域名 + 若干个二级域名,DNS 都托管在同一个 Cloudflare 账号
- 想用一张证书覆盖所有子域名(包括以后新增的子域名)
- 域名走 CDN/代理或指向其它服务器,无法用 HTTP 验证
- 群晖 DSM 7.2 及以上(带 Docker / Container Manager)
- 所有域名的 DNS 都在同一个 Cloudflare 账号
- 登录 Cloudflare → 右上角头像 → 我的个人资料
- 左侧菜单 → API 令牌 → 创建令牌
- 选择模板 编辑区域 DNS → 使用模板
- 权限保持模板默认:区域 → DNS → 编辑、区域 → 区域 → 读取
- 区域资源 → 包括 → 所有区域(所有域名区域都要能改)
- 继续以显示摘要 → 创建令牌
- 令牌只显示一次,立刻复制保存
本文以
example.com(一级域名)和 vip.example.net、cf2.example.net、12.example.net(二级域名)为例,实际操作时替换成你自己的域名即可。准备工作
一、Cloudflare 创建 API 令牌
二、群晖运行 acme.sh(首次签发)
SSH 登录群晖,执行:
mkdir -p /volume1/docker/acme
docker run -d --name acme.sh --restart unless-stopped \
-v /volume1/docker/acme:/acme.sh \
-e CF_Token='你的Cloudflare令牌' \
neilpang/acme.sh daemon
三、签发泛域名证书
docker exec acme.sh --issue --dns dns_cf --server letsencrypt \
-d example.com -d '*.example.com' \
-d vip.example.net -d '*.vip.example.net' \
-d cf2.example.net -d '*.cf2.example.net' \
-d 12.example.net -d '*.12.example.net'
等 1~2 分钟,签发成功后会提示证书位置:
/acme.sh/example.com_ecc/example.com.key
/acme.sh/example.com_ecc/fullchain.cer
在群晖里的完整路径就是
/volume1/docker/acme/example.com_ecc/。要点:裸域和通配符要一起填,因为
*.example.com 只覆盖子域名、不覆盖 example.com 本身;域名之间用英文逗号分隔、不要带空格。四、导入 DSM
wildcard-all(后面自动部署会用到这个名字)/volume1/docker/acme/example.com_ecc/example.com.key/volume1/docker/acme/example.com_ecc/fullchain.cer也可以用 File Station 直接到
/volume1/docker/acme/example.com_ecc/ 里选这两个文件。五、应用到反向代理
wildcard-all六、配置自动续期 + 自动部署到 DSM
acme.sh 每天自动检查证书,到期前自动续期。再配置一个部署钩子,续期完成后自动把新证书更新到 DSM,实现全自动。
1. 重建容器,加入 DSM 连接信息
docker rm -f acme.sh
docker run -d --name acme.sh --restart unless-stopped \
-v /volume1/docker/acme:/acme.sh \
-e CF_Token='你的Cloudflare令牌' \
-e SYNO_Username='DSM管理员账号' \
-e SYNO_Password='DSM管理员密码' \
-e SYNO_HOSTNAME='192.168.1.100' \
-e SYNO_PORT='5000' \
-e SYNO_SCHEME='http' \
-e SYNO_CERTIFICATE='wildcard-all' \
neilpang/acme.sh daemon
说明:
SYNO_HOSTNAME:容器里访问 DSM 用群晖的局域网 IP(不能填 localhost,把示例 192.168.1.100 换成你的实际 IP)SYNO_PORT=5000、SYNO_SCHEME=http:走 DSM 的 HTTP 管理端口,无需处理自签名证书信任问题(如果你的 DSM 管理端口不是 5000,按实际改)SYNO_CERTIFICATE='wildcard-all':对应导入证书时填的描述,钩子靠它找到要替换的证书SYNO_Username:需要能登录 DSM 的管理员账号2. 首次部署(如果 DSM 账号开了两步验证)
如果账号开启了 2FA,首次部署时填一次动态码,acme.sh 会自动保存"受信任设备",之后不再需要:
docker exec -e SYNO_DEVICE_NAME='CertRenewal' -e SYNO_OTP_CODE='123456' acme.sh --deploy -d example.com --deploy-hook synology_dsm
把
123456 换成验证器里当前的 6 位动态码(30 秒内执行)。没有开 2FA 的话直接执行下一条。3. 验证免码自动部署
docker exec acme.sh --deploy -d example.com --deploy-hook synology_dsm
看到
Success 就说明设备信任已保存,以后续期自动部署不再需要动态码。4. 强制续签验证(可选,推荐做一次)
docker exec acme.sh --renew -d example.com --force
这条会用 Cloudflare 令牌重新走一遍 DNS 验证 → 续签 → 自动部署到 DSM,全链路无报错即说明整个自动化流程已打通。
总结
安全提示:令牌只在创建时显示一次;部署配置完成后,建议在 Cloudflare 删除不再使用的旧令牌。
评论(0)