网上好人多,acme.sh和Let’s Encrypt与ZeroSSL就是其中的代表,后者提供免费的三个月证书,前者提供工具以自动化证书的申请、续期与部署。还记得我刚学会网上冲浪时,一张一年的证书都至少要50,部署还很麻烦,wildcard还得另外加钱,现在既免费又方便,不知道普通的收费DV证书还有什么存在的意义。

之前一直使用的Let’s Encrypt的证书,后来某天突然发现首次打开总得等半天,排除服务器的原因才发现时因为Let’s Encrypt的OSCP服务器地址被莫名墙掉,虽然后来又解开了,但我还是换到了ZeroSSL,现在ZeroSSL还支持对IP地址签发证书,当然也是免费的。

以下记录下使用acme.sh脚本自动续期证书并自动更新部署到群晖DSM的过程,群晖系统版本为DSM 7.1

使用acme.sh配合CloudFlare API签发新证书

首先SSH登陆群晖,下载acme.sh脚本到本地,我选择了非系统目录/volume1/HDD1/acme.sh存放,避免更新DSM后被新系统覆盖。家宽都是屏蔽了80和443端口的,所以只能通过DNS验证域名。我的域名DNS服务器放在CloudFlare,acme.sh自带了他家的API接口,需要登陆这里获取一个API KEY。在acme.sh的目录下新建一个文件,名为account.conf,填入以下内容

SAVED_CF_Key='上面获取到的API KEY'
SAVED_CF_Email='CloudFlare的账号邮箱'
ACCOUNT_EMAIL='[email protected]'

DEFAULT_ACME_SERVER='https://acme.zerossl.com/v2/DV90'
USER_PATH='/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/syno/sbin:/usr/syno/bin:/usr/local/sbin'

保存后尝试新签发张证书看看,./acme.sh --issue --domain test.com --dns dns_cf --home . 注意最后的点,表示使用当前目录为工作目录。等待一会签发没问题的话,就可以在test.com目录下得到新的证书

然后是部署到群晖DSM

之前我还每隔一段时间手动登陆DSM上传新证书,后来想寻找自动化的方法,蓦然回首发现acme.sh脚本竟然自带了一键部署到DSM的功能。需要获取DSM门户的明文账户名与密码,应该是通过群晖的网页API自动提交的。建议不要使用管理员账户,新建一个账户,只给予DSM门户的权限,所有的目录,DSM以外的所有的应用都禁止访问。继续编辑之前保存的account.conf

SAVED_CF_Key='上面获取到的API KEY'
SAVED_CF_Email='CloudFlare的账号邮箱'
ACCOUNT_EMAIL='[email protected]'

SAVED_SYNO_Username='DSM用户名'
SAVED_SYNO_Password='DSM密码'
SAVED_SYNO_Port="DSM的端口"
SAVED_SYNO_Certificate="zerossl"


DEFAULT_ACME_SERVER='https://acme.zerossl.com/v2/DV90'
USER_PATH='/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/syno/sbin:/usr/syno/bin:/usr/local/sbin'

有一点需要注意,上方的SAVED_SYNO_Certificate需要与DSM门户里已经上传的默认证书的描述相同。描述不同的话只会新增加一张证书,并不会替换原有的证书

继续在该目录下新建一个文件,名为auto_renew.sh,内容如下

#! /bin/bash

cd /volume1/HDD1/acme.sh
/volume1/HDD1/acme.sh/acme.sh --renew --domain test.com --force --home /volume1/HDD1/acme.sh
/volume1/HDD1/acme.sh/acme.sh --deploy --insecure --home /volume1/HDD1/acme.sh -d test.com --deploy-hook synology_dsm

exit 0

为避免可能的莫名bug,我都使用了绝对路径。保存后记得chmod +x auto_renew.sh增加执行权限。手动执行一次确认无误,可以看到成功日志:

Logging into localhost:50001
Getting certificates in Synology DSM
Generate form POST request
Upload certificate to the Synology DSM
http services were restarted
Success

定时执行

最后一步就是添加一个计划任务,每个月定时更新一次证书。控制面板->计划任务->新增,我设置为每月运行一次,运行脚本bash /volume1/HDD1/acme.sh/auto_renew.sh