2025/4/24:发现一些问题和技巧,群晖在系统更新后会清空/root路径下所有文件;
由于腾讯云归并了dnspod,腾讯云的API已建议使用腾讯云API密钥代替掉dnspod token
acme dns api的dns_dp官方已建议弃用改为dns_tencent
注:文章内计划任务截图的脚本内容没有更新,具体以文章内文字为准
2024/11/8:内容没有大改动,官方github已经把DSM7相关的hook脚本PR#4646到main分支,当前版本是v3.1.0,已经不用手动替换部署脚本了
2024/3/10:发现证书失效,acme.sh对群晖的证书部署有了不少更新,修正一下这篇文章
好久没有水博客了…………
今天个人总结一下群晖使用acme.sh在一次部署后全自动更新证书以及部署到群晖DSM系统的使用流程
前言
由于DSM有自己“完整”的一套证书部署流程,所以在参考网上目前能轻松搜索到的已有的教程,发现基本都已经过时了,并没有用上DSM7新的API去操作证书部署
后来发现一直在用的acme.sh原来已经有群晖的deploy hook,但是官方Wiki以及外网上的教程也是过时的
并且acme.sh的官方Github项目内的PR已经有大佬针对DSM7的改良部署脚本(感谢@Eagle3386),所以才有了这篇文章
相关issue:issue #2727
相关PR:PR #4646
准备工作
下载安装acme.sh
首先要开启DSM的SSH管理功能,然后使用SSH相关软件登录后台
- 第一种方式
# 提权至root账号
sudo su
# 找一个方便的路径存放acme.sh, 这里我选择了root的根目录/root
cd ~
# 通过官方脚本安装, 因为群晖没有crontab,所以需要加--force参数强制安装
curl https://get.acme.sh | sh -s email=my@example.com --force
- 第二种方式
因为国内网络特殊性以及群晖本身系统奇葩,个人建议还是去Github把master分支在本地方便访问的设备上git clone或者打包zip下来,再上传到群晖内挪到你想要的路径,最后解压
# 解压zip并安装,同上需要--force
unzip acme.sh-master.zip -d acme.sh
cd acme.sh
./acme.sh --install -m my@example.com --force
注:往下部分如果在管理员账号下安装acme.sh,默认路径会是:/var/services/homes/zakikun/.acme.sh
申请证书
参照我以前发过的文章:acme.sh免费90天泛域名证书简易说明
(可选)2024/3/10:目前zerossl对免费申请的证书校验有点毛病,推荐通过--server换成letsencrypt
# 设置环境参数(腾讯云/DnsPod)
export Tencent_SecretId=填写SecretId
export Tencent_SecretKey=填写SecretKey
# 申请泛域名证书
/var/services/homes/zakikun/.acme.sh/acme.sh --issue --dns dns_tencent -d example.com -d *.example.com [--server letsencrypt]
部署默认证书
使用临时管理员
这个方法适合没启用二步认证或者不想定期手动刷新一下二步认证的群晖用户
# 创建并使用临时管理员,部署完成后会自动删除
export SYNO_USE_TEMP_ADMIN=1
# 部署证书
/var/services/homes/zakikun/.acme.sh/acme.sh --deploy --home /var/services/homes/zakikun/.acme.sh -d example.com --deploy-hook synology_dsm
使用已有管理员账号
默认只需要设置账号和密码环境变量即可,如果开启二步认证2FA功能,则必须加上SYNO_DEVICE_NAME给acme.sh调用赋名
export SYNO_Username='Zakikun'
export SYNO_Password='账号密码'
export SYNO_DEVICE_NAME="CertRenewal"
期间会提示你输入一次上述SYNO_Username对应的群晖账号的二步验证密码
"Enter OTP code for user 'Zakikun':
输入完毕成功部署后,脚本就会在对应的域名证书目录下记录保存,以后就不用再输入账号、密码和二步验证密码了
# 查看保存信息
cat /var/services/homes/zakikun/.acme.sh/example.com_ecc/example.com.conf
添加计划任务自动更新和部署证书
这里注意一下,acme.sh默认只在证书到期前一个月才会真正检测到证书即将到期触发更新,想要强制更新可以添加参数 --force
而证书部署只要执行了就会进行部署,所以我个人是每周六执行一次证书检查更新,每个月1日0点执行一次证书部署,避免频繁重新部署DSM的默认证书
# 证书检查更新
/var/services/homes/zakikun/.acme.sh/acme.sh --cron --home /var/services/homes/zakikun/.acme.sh
# 在部署证书前提权一下
sudo su root
# 部署证书
/var/services/homes/zakikun/.acme.sh/acme.sh --deploy --home /var/services/homes/zakikun/.acme.sh --deploy-hook synology_dsm -d example.com
这里只放了检查证书到期更新的命令,有需要连着部署一起执行的,自行添加更改
版权属于:Zakikun
本文链接:https://blog.zakikun.com/archives/80.html
本文采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可。
您可以自由的转载和修改,但请务必注明文章来源并且不可用于商业目的。
34 条评论
抱歉現在才回復,我後面做了幾個操作後部屬成功了,實際是哪個影響到之前的部屬也不太清楚,但我覺得應該是改用非 ECC 憑證的關係?
1. 將 router 的 80 port 開放轉送到 nas 上
2. 將 cloudflare 的 dns_proxy 關閉 (灰色小雲)
3. 在申請證書時指定 --keylength 避免使用 ecc 憑證 `/root/.acme.sh/acme.sh --issue --dns dns_cf -d example.com -d *.example.com --server letsencrypt --keylength 2048`
這樣出來的憑證就是 `/root/.acme.sh/example.com` 而不是 `/root/.acme.sh/example.com_ecc`
SSL證書的使用涉及很多方面,但現代瀏覽器(比如chrome)和網頁系統(比如群暉的DSM)都沒有遇到過因為密鑰採用ECC加密算法導致deploy失敗的,因為我自己測試申請的證書,去DSM的設定裏手動更換默認證書都是能正常替換然後自動重啟DSM的HTTP服務生效的
我感覺是 acme.sh 那邊的問題
因為我如果是 example.com_ecc 文件夾的話
使用 `/root/.acme.sh/acme.sh --deploy --home /root/.acme.sh -d example.com -d *.example.com --deploy-hook synology_dsm` 部屬時會出現找不到 example.com 這個資料夾導致部屬失敗
但如果將 -d 後面改成 example.com_ecc 的話,又會說在這個資料夾內找不到 example.com.conf
可能是需要手動將資料夾名稱後的 _ecc 刪除才能部屬?
感谢博主的教程,我自己测试1年下来,第一次部署好证书以后,只需要使用群晖7.2的计划任务每个星期执行一次renew命令就能一直续证书了,不需要再次部署证书
acme.sh默认会把手动执行的issue或者deploy的参数保存成conf,对应每一个issue的域名文件夹内,后续继续操作都会默认调用所有配置,除非用户手动修改指定
像部署时用临时管理员的环境变量会保存为SAVED_SYNO_USE_TEMP_ADMIN=1,deploy hook会保存为Le_DeployHook='synology_dsm,'
然后acme.sh程序可能在renew的时候自动带上了deploy步骤,所以只要renew就自动重新deploy了,这一点我倒是没测试出来,感谢补充
最近还发现有个问题,就是群晖系统更新过后,/root路径下所有文件都会丢失,也就会导致上述流程所有基于/root步骤会失效,回头我会编辑文章给加上另一个方案
查看一下DSM的默认证书的描述是否为空白或者deploy前带了SYNO_CERTIFICATE参数,dsm的deployhook是通过描述来指定替换对应的证书
最新版本acme需要群晖升级到7.2才能使用,怀疑是openssl版本的问题引起的
这个要怎么部署群晖中间证书?
没研究过
请问下最后一步每月一次的部署定时任务是必须的吗?我看官方的教程里好像只有定期更新证书的定时任务
acme的定期更新证书就真的只是更新证书有效期,群晖的hook并不会触发DSM整体的证书更新,如果不定期触发群晖的证书部署,证书有效期就不会生效更新,这一步骤相当于你手动在设置里新增证书或者替换时勾选默认证书后触发系统全局的证书部署一样
我自己实测renew命令会自动部署证书的,我这一年下来除了最开始用来部署命令,后面都是计划任务每星期自动执行renew,没有问题的,证书到期前一个月内才会自动更新并部署证书,
最后执行脚本的路径显然有问题,dsm7这样执行肯定有问题
不知道你指的是不是截图里的acme.sh路径问题,我个人当时懒得再弄一次截图,就按原来截图放上去了,照葫芦画瓢替换成对应的路径就行了|´・ω・)ノ
感谢博主,附一个环境变量SYNO_PORT可以修改hook调用群晖的默认端口
如果没有在群晖上额外配置DSM的HTTP和HTTPS端口(默认5000和50001),就不需要通过SYNO_PORT指定访问DSM的端口,避免了很多麻烦,因为群晖真的有自己一整套服务功能反代,我没仔细研究全部都有什么端口在用
多谢博主分享。我是群辉DSM 6.2,用群辉计划任务来续签证书,非常丝滑;从证书申请到证书部署,再到推送钉钉通知,一条命令搞定。
/root/.acme.sh/acme.sh --cron --home /root/.acme.sh --force
过期前一周运行一次即可。
博主申请成功了 但是感觉证书使用不成功是怎么情况
我的也没生效,部署的时候没有自动变成默认证书,我手动设置的,并没有用,还是用的原来的无效证书
部署证书调用acme.sh的hook脚本,具体参数是-deploy-hook synology_dsm,默认替换的是dsm的默认全局证书,理论上通配域名证书可以覆盖DSM的各个地方
请问证书部署是不是要另外新建一个任务计划?执行的脚本就是:/root/.acme.sh/acme.sh --deploy --home /root/.acme.sh --deploy-hook synology_dsm -d "example.com"
两个任务执行频率不一样,要自己权衡。因为证书想更新生效,就需要先更新后部署,而acme对证书的默认条件是到期前一个月才会触发更新,所以上边设置的是每周检查一次更新来保证一个月前能有3-4次机会检测并更新证书;然后每月执行一次部署,保证给DSM的默认证书换成最新的
前者更新证书不影响群晖的DSM正常工作,但是后面的部署需要重启DSM,也就是群晖的网页界面会短暂断联,所以我个人做法是分开两个计划任务
部署失败。新版本域名文件夹后面多了一个_ecc
默认方式下issue到的证书都是domain_ecc文件夹下的,用到路径就得自己观察目录结构是怎样的,调用acme的hook脚本,-d参数选好域名是不需要关注路径的
感谢,成功了。分享实现过程中的几个点
1.申请证书 步骤提示:Please install idn to process IDN names.
解决办法:./acme.sh upgrade 更新脚本后重新执行
2. 部署默认证书 步骤提示 Unable to update certificate, error code {"error":{"code":5511},"success":false}
解决办法 ./acme.sh upgrade 更新脚本后重新执行申请证书,再执行部署证书命令
申请证书:[Mon Jan 15 10:42:55 CST 2024] Your cert is in: /root/.acme.sh/xxx.cf_ecc/xxx.cf.cer
部署报错:The domain 'xxx.com' is not a cert name. You must use the cert name to specify the cert to install.
我改成config-home也没用,哪个参数不对,两边路径不匹配
证书路径已经说明问题啦,你申请的证书是xxx.cf,不是xxx.com,deploy的时候参数指定要跟申请的域名对应
有两步验证怎么办
教程里说了呀,脚本会询问你一次二步验证密码,然后就会调用群晖的API记住一个Device ID和token,后续更新和部署证书就不用再输密码了
马了,回头在DSM6上试试
dsm6测试结果如何?
非常感谢,解决了我遇到的问题
感谢博主分享~