群晖DSM 7.2 部署acme.sh自动更新SSL证书,避免红色https警告提醒

群晖DSM 7.2 自动更新SSL证书实战
6月30日突发证书失效危机,老汪带你从零排查并解决!

大家好,我是你们的老朋友老汪! 一个在弱电行业摸爬滚打**17+**年的职场“老人”。
🔴 突发故障:6月30日证书失效
莫名其妙的,群晖的SSL证书失效了!
-
所有的Drive和https网页都在提示**“证书不受信任”**。
-
明明docker部署了acme.sh,且2024年至今从未出过问题。
-
重新部署acme.sh报错**“code:7”**(与DSM通信失败)。
**心路历程:**断断续续排查几小时,请求次数过多导致被letsencrypt限制。心意已决:删除所有配置重新来过!
🛠️ 准备工作:Cloudflare配置
**前提:**域名已托管在Cloudflare(如eu.org域名),具体方法自行搜索。
1. 准备区域ID (CF_Zone_ID) 登陆Cloudflare → 点击域名 → 右下角找到 “区域ID” → 复制备用。
2. 准备Token (CF_Token) 右上角头像 → 配置文件 → API令牌 → 创建令牌 → **“编辑区域DNS”**模板 → 选定域名 → 继续 → 复制Token备用。

🐳 Docker部署:acme.sh
-
**拉取镜像:**推荐使用1ms加速镜像
docker.1ms.run,搜索neilpang/acme.sh。 -
**创建文件夹:**在File Station创建配置存放目录,如
/volume1/docker/acme.sh。 -
**运行容器:**映射上述文件夹,网络类型选 host,执行命令填 daemon。
环境变量配置:
-
CF_Token= 填写Cloudflare API令牌 -
CF_Zone_ID= 填写Cloudflare 区域ID
📝 脚本与自动化:任务计划
- 准备脚本文件
将代码保存为 acme.sh,放入 /volume1/docker/acme.sh 目录下。
#改为你的域名
DOMAIN='**.eu.org'
#证书供应商
CERT_SERVER='letsencrypt'
#DNS供应商 可选 dns_dp(腾讯云) dns_ali(阿里云) dns_cf 其他可查https://github.com/acmesh-official/acme.sh/wiki/dnsapi
DNS="dns_cf"
#改为你的群晖账号密码
SYNO_Username='*****'
SYNO_Password='*****'
#如果开启了双重验证请在浏览器登录时选中保存此设备,然后从COOKIE中获取did cookie
SYNO_Device_Name="CertRenewal"
SYNO_DID=''
#以下群晖配置非必要不要更改
SYNO_Hostname="localhost" # Specify if not using on localhost
SYNO_Scheme="http"
#改为你的群晖http端口
SYNO_Port="****"
#要添加的证书的名字,空字符串("")的话就是替代默认证书,一般建议使用空字符串,除非你有多个证书
SYNO_Certificate='*.eu.org' #以下三选一
#DNSPOD.CN 腾讯云
DP_Id=''
DP_Key=''
#阿里云
Ali_Key=''
Ali_Secret=''
#CF,使用了API令牌token和区域ID这儿可以不填,docker内部脚本会调用docker环境变量
CF_Key='*****'
CF_Email='****' case $DNS in
"dns_dp")
a="DP_Id=${DP_Id}"&&b="DP_Key=${DP_Key}"
;;
"dns_ali")
a="Ali_Key=${Ali_Key}"&&b="Ali_Secret=${Ali_Secret}"
;;
"dns_cf")
a="CF_Key=${CF_Key}"&&b="CF_Email=${CF_Email}"
;;
esac
SYNOUsername="SYNO_Username=${SYNO_Username}"
SYNOPassword="SYNO_Password=${SYNO_Password}"
SYNODeviceID="SYNO_Device_ID=${SYNO_DID}"
SYNOHostname="SYNO_Hostname=${SYNO_Hostname}"
SYNOScheme="SYNO_Scheme=${SYNO_Scheme}"
SYNOPort="SYNO_Port=${SYNO_Port}"
SYNOCertificate="SYNO_Certificate=${SYNO_Certificate}"
SYNODID="SYNO_DID=${SYNO_DID}"
SYNODeviceName="SYNO_Device_Name=${SYNO_Device_Name}" #acme是docker容器名称
docker exec -e ${a} -e ${b} acme acme.sh --log --server "${CERT_SERVER}" --issue -d "${DOMAIN}" -d "*.${DOMAIN}" --dns "${DNS}" >> /volume1/docker/acme.sh/log.txt 2>&1
docker exec -e ${SYNOUsername} -e ${SYNOPassword} -e ${SYNODeviceID} -e ${SYNOHostname} -e ${SYNOScheme} -e ${SYNOPort} -e ${SYNOCertificate} -e ${SYNODID} -e ${SYNODeviceName} acme acme.sh --issue -d "${DOMAIN}" -d "*.${DOMAIN}" --dns "${DNS}" --deploy --deploy-hook synology_dsm >> /volume1/docker/acme.sh/log.txt 2>&1- 新建计划任务
-
用户: 选 root (权限不足会导致失败)
-
计划: 建议 每月重复 (Let's Encrypt证书有效期已缩减到60天)
-
命令:
bash /volume1/docker/acme.sh/acme.sh >>/volume1/docker/acme.sh/log.txt 2>&1



✅ 成功验证
查看 log.txt,若出现以下日志即为成功:
[Wed Jul 1 07:15:08 UTC 2026] Getting certificates in Synology DSM...
[Wed Jul 1 07:15:08 UTC 2026] Generating form POST request...
[Wed Jul 1 07:15:08 UTC 2026] Upload certificate to the Synology DSM.
[Wed Jul 1 07:15:28 UTC 2026] Restart HTTP services succeeded.
[Wed Jul 1 07:15:28 UTC 2026] Success
(证书获取、上传、HTTP服务重启成功)
看了很多教程,暂时还没找到很详细的。斗胆写了一个,未尽之处请见谅,错误之处请指正!
还有什么疑问欢迎留言
—— 老汪 | 弱电行业老炮儿