群晖相关

群晖一条龙申请泛域名 HTTPS 证书(acme.sh + Cloudflare DNS 验证)

2026-08-07 28 次阅读 1835 字 · 5 分钟

群晖一条龙申请泛域名 HTTPS 证书(acme.sh + Cloudflare DNS 验证)



给群晖上的多个域名申请一张 Let's Encrypt 泛域名(通配符)证书,全程走 Cloudflare DNS 验证:不用开放 80 端口、不要求域名直接指向群晖,签发后导入 DSM,并配置自动续期 + 自动部署,所有子域名永久绿锁、全程无人值守。

适用场景



  • 有一个一级域名 + 若干个二级域名,DNS 都托管在同一个 Cloudflare 账号

  • 想用一张证书覆盖所有子域名(包括以后新增的子域名)

  • 域名走 CDN/代理或指向其它服务器,无法用 HTTP 验证


  • 本文以 example.com(一级域名)和 vip.example.net、cf2.example.net、12.example.net(二级域名)为例,实际操作时替换成你自己的域名即可。

    准备工作



  • 群晖 DSM 7.2 及以上(带 Docker / Container Manager)

  • 所有域名的 DNS 都在同一个 Cloudflare 账号


  • 一、Cloudflare 创建 API 令牌



  • 登录 Cloudflare → 右上角头像 → 我的个人资料

  • 左侧菜单 → API 令牌 → 创建令牌

  • 选择模板 编辑区域 DNS → 使用模板

  • 权限保持模板默认:区域 → DNS → 编辑、区域 → 区域 → 读取

  • 区域资源 → 包括 → 所有区域(所有域名区域都要能改)

  • 继续以显示摘要 → 创建令牌

  • 令牌只显示一次,立刻复制保存


  • 二、群晖运行 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/ 里选这两个文件。

    五、应用到反向代理



  • 控制面板 → 登录门户 → 高级 → 反向代理服务器

  • 逐条编辑每条规则,HTTPS → 证书 → 选择 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,全链路无报错即说明整个自动化流程已打通。

    总结



  • 一张证书同时覆盖 4 个裸域 + 4 个泛域名,共 8 个域名

  • 全程 DNS 验证,不需要开放 80 端口,不依赖域名是否指向群晖

  • Let's Encrypt 证书 90 天有效期,acme.sh 每天自动检查、到期自动续期

  • 配置部署钩子后,续期完成自动更新到 DSM,全程无人值守

  • 以后新增子域名,把新域名加进签发命令重新签一次即可


安全提示:令牌只在创建时显示一次;部署配置完成后,建议在 Cloudflare 删除不再使用的旧令牌。

评论(0)

8 + 8 =
← 返回首页