群晖Synology使用ACME获取SSL证书
Kyrrin
编辑于 2026年04月16日 15:58

废话

之前一直用的是Docker的方案,无奈莫名其妙的无法正常使用,恰逢域名到期换新域名,索性推倒重来。

acme.sh是一款方便,强大的域名证书申请&续签工具,支持一键申请&持久化续签。其支持HTTP验证和 DNS 两种域名验证方式,并且可同时申请多张单域名,泛域名证书,并自动续签证书和部署到项目。

本文记录自己使用regery注册的.su域名通过Cloudflare托管获得SSL证书。

目录

一、Cloudflare

    1.Cloudflare托管设置

    2.关闭加密模式

    3.获取Cloudflare API TOKEN

二、群晖准备工作

    1.新建用户

三、安装ACME

    1.安装ACME

    2.创建变量

    3.创建证书

    4.证书登录到群晖

一、Cloudflare

由于regery注册域名需要使用俄罗斯籍护照,照猫画虎的概率不大,这里就跳过域名注册只说Cloudflare托管的操作。

1.Cloudflare托管设置

登录CloudFflare控制面板 https://dash.cloudflare.com/ ,在网站 - 主页中选择添加站点

输入迁入的一级域名并点击添加站点,计划选择free足够使用。

通过Cloudflare的指引前往域名注册商更改已注册域名的名称服务器(NAME SERVERS),每个域名服务商的方法不同,我这里提供我这边的修改方法。

修改之后等待修改生效即可,Cloudflare会发送邮件提示已生效。以后添加DNS记录就通过Cloudflare来操作。

2.关闭加密模式

点击SSL/TLS - 概述,选择关闭(不安全);然后继续点击SSL/TLS - 边缘证书,关闭自动HTTPS重写(这个在后续很重要,之前注册域名的时候疯狂报错,因为他会把HTTP流量重定向至HTTPS导致ACME超时,后续才排查到这个问题。)

3.获取Cloudflare API TOKEN

点击现在界面的右上角人像标志 - 点击我的个人资料

依次点击 API令牌 - 创建令牌 - 编辑区域DNS - 使用模板

进入模板之后选择需要控制的域名之后下一步并创建令牌

此时已经添加了令牌权限并生成了令牌,把生成结果保存后续留用。

二、群晖准备工作

1.新建用户

群晖(以DSM7为例)中点击控制面板 - 用户与群组 - 用户账号 - 新增

我这里使用了ACME作为名称,之后选择下一步 在加入用户群组里赋予账户administrators权限,之后一路下一步(此操作是为了与主用户区分,不受主用户的AF2(两步验证影响))。

三、ACME

1.安装ACME

使用刚才新建的用户进入群晖shell界面,输入如下命令。注意下面的sudo chown -R acme中的acme是你群晖注册的用户名

代码块
JavaScript
自动换行
复制代码
cd ~
wget https://github.com/acmesh-official/acme.sh/archive/master.tar.gz
tar xvf master.tar.gz
sudo mv acme.sh-master/ /usr/local/share/acme.sh
sudo chown -R acme /usr/local/share/acme.sh/
cd /usr/local/share/acme.sh
复制成功

2.创建变量

现在我们已经获取了必要的文件,接下来需要为脚本配置一些变量。请务必将以下内容替换为你自己的信息。由于我的域名后缀是 .su,ZeroSSL 会直接拒绝我的证书申请,因此下面使用 Let's Encrypt 进行签发。

代码块
JavaScript
自动换行
复制代码
export CF_Token="先前获取的API Token"
export CF_Mail="Cloudflar的注册邮箱"
export SYNO_Username="acme(刚才群晖注册的用户名)"
export SYNO_Password="刚才群晖注册用户的密码"
export SYNO_Certificate="Let's Encrypt"
export SYNO_Create=1
复制成功

接下使用以下命令获取第一个证书。请务必更新您的域名。

3.创建证书

--server letsencrypt(使用 letsencrypt 注册) -d "*.abc.com"(通配符二级子域名) -d"abc.com"(顶级域名本身)

代码块
JavaScript
自动换行
复制代码
./acme.sh --server letsencrypt --issue -d "通配符二级子域名" -d "顶级域名本身" --dns dns_cf --home $PWD
复制成功

完成该过程大约需要 1 分钟。屏幕上有文字可以让您知道发生了什么。此过程只是创建证书并将其下载到您的 Synology 设备,它并没有告诉 Synology 开始使用它。

4.证书登录到群晖

代码块
JavaScript
自动换行
复制代码
./acme.sh -d "通配符二级子域名" -d "顶级域名本身" --deploy --deploy-hook synology_dsm --home $PWD
复制成功

您应该会看到一些文本,表明脚本能够登录到您的 Synology 设备、获取证书、应用证书并重新启动 Web 服务器。如果您现在使用 https 登录 Synology 设备,您应该会看到一个有效的证书(有锁了)。

现在您已经拥有了一个可以正常工作的SSL证书,但期限只有90天。通过登录 Synology 进入控制面板 - 任务计划,可以很容易地自动更新证书。单击新增并选择计划任务和用户定义的脚本。

给任务赋予一个名字,我用的是acme,转到计划选择在以下日期运行 - 每月重复,这样就能每个月都自动触发一次。转到任务设置里填入以下脚本代码并确定。

代码块
JavaScript
自动换行
复制代码
/usr/local/share/acme.sh/acme.sh --renew -d "通配符二级子域名" -d "顶级域名本身" --home /usr/local/share/acme.sh --server letsencrypt
复制成功

做好如下设置之后脚本就会在每月自动续期一次,就此ACME部署完毕。

后记

如果群晖不想新开用户且主用户开了2FA(两步验证),则需要在第三段第2小节里增加DID(如下代码),其中DID的获取方法可以参考https://post.smzdm.com/p/a6d5dl6e/ 中主要内容的第一段第二小节,说的很详细。

代码块
JavaScript
自动换行
复制代码
export SYNO_Device_ID=你的DID
复制成功

如果更改了群晖登录端口为1234,那么还需要创建变量:export SYNO_Port="1234"

代码块
PlainText
自动换行
复制代码
export SYNO_Port="1234"
复制成功

部署时下载的压缩包可以删除,命令如下

代码块
JavaScript
自动换行
复制代码
cd ~
rm -rf master.tar.gz
复制成功