给群晖添加ssl证书
2021-10-05
acme.sh已经把申请默认证书从Let’s Encrypt改为了ZeroSSL了. 本文利用acme.sh给群晖申请ZeroSSL证书, 并自动续期, 步骤包括:
- 获取DNS的API用以后续验证域名属于你.
- 申请zerossl帐户.
- 利用acme.sh申请证书.
- 安装证书
- 自动续期证书.
获取DNS服务商的API
在申请证书的时候需要验证DNS属于是属于你的, 所以要先获取dns服务商的API以便在利用acme.sh申请时自动验证. 我这里使用的是godaddy的域名服务商自带的dns, 所以这里以godaddy举例.
首先打开godaddy的开发者网页, 点击API Keys
根据提示申请一个Production的API Key
之后获得Key和Secret
其他服务商获取方法大同小异.
申请ZeroSSL帐户
打开ZeroSSL官网, 根据提示申请帐户, 这里需要提供一个邮箱, 这个邮箱在acme.sh申请证书时需要用到. 这里多说一句, 利用ZeroSSL官网就已经可以通过图形界面来申请证书了, 并不一定需要acme.sh, 但是我们可以利用acme.sh来自动化续签, 所以还是采用acme.sh的方法来申请证书.
acme.sh申请证书
首先下载acme.sh
# 下载并解压acme.sh
wget https://github.com/acmesh-official/acme.sh/archive/master.tar.gz
tar xvf master.tar.gz
cd acme.sh-master/
chmod a+x acme.sh
在acme.sh的目录下, 有一个dnsapi的目录, 里面存放的是修改各个DNS服务商的API的样本文件, 我这里使用的godaddy, 所以编辑dnsapi/dns_gd.sh, 修改GD_Key和GD_Secret为之前申请的值.
#!/usr/bin/env sh
#Godaddy domain api
#
#GD_Key="这里修改为申请到的GD_Key"
#
#GD_Secret="这里修改为申请到的GD_Secret"
GD_Api="https://api.godaddy.com/v1"
申请证书, --email
参数为申请ZeroSSL时所用的邮箱, --dns
为dns服务商
./acme.sh --email example@email.com --issue -d example.com --dns dns_gd
如果没有问题的话, 证书已经位于~/.acme.sh/example.com
路径下了.
安装证书
申请好证书后, 安装到群晖上. 首先登陆到群晖的web管理页面, 打开控制面板, 进入高级模式, 点击安全性点击证书, 到达以下界面
点击新增->导入新证书->导入证书
, 按步骤导入~/.acme.sh/example.com
下的私钥和证书. 将导入的证书设为默认, 此时https已经是加密状态了.由于免费证书只有90天的有效期, 下一步, 自动更新证书.
证书更新
证书更新
./acme.sh --renew -d example.com
证书更新后依旧存放在~/.acme.sh/example.com
下, 需要再次上传到群晖中. 但是可以通过脚本来实现.
自动上传
查看证书存放路径
# 查看证书
ls /usr/syno/etc/certificate/_archive
该路径下一般有多个子路径, 包括自带了synology证书和我们自己申请的证书, 确定好我们自己申请的证书目录, 假设为dQPaUd
, 那么就可以将证书上传(这里上传表示更新)
./acme.sh --install-cert -d example.com \
--certpath /usr/syno/etc/certificate/_archive/dQPaUd/cert.pem \
--keypath /usr/syno/etc/certificate/_archive/dQPaUd/privkey.pem \
--fullchainpath /usr/syno/etc/certificate/_archive/dQPaUd/fullchain.pem \
--capath /usr/syno/etc/certificate/_archive/dQPaUd/chain.pem \
--reloadcmd
同步默认的证书
rsync -avzh /usr/syno/etc/certificate/_archive/dQPaUd/ /usr/syno/etc/certificate/system/default
重启服务
/usr/syno/etc/rc.sysv/nginx.sh reload
此时, 证书更新完成.
自动更新证书
证书更新部分属于每90天更新一次, 可以通过自动执行脚本去实现, 而不是每90天自己去执行. 这设定每个月执行一次. 打开控制面板->任务计划
更新证书
首先新增一个更新证书脚本, 周期设置如下
添加一个脚本
由于我把acme.sh执行文件放在了/volume1/docker/cert/acme.sh-master
下, 所以我的脚本为
# 不要忘了吧example.com换成你自己的域名
/volume1/docker/cert/acme.sh-master/acme.sh --renew -d example.com
自动上传
和上一步一样, 再增加一个计划事件, 但是事件运行时间改为4:30
, 比更新证书晚30分钟, 脚本设置如下
/volume1/docker/cert/acme.sh-master/acme.sh \
--install-cert -d example.com \
--certpath /usr/syno/etc/certificate/_archive/dQPaUd/cert.pem \
--keypath /usr/syno/etc/certificate/_archive/dQPaUd/privkey.pem \
--fullchainpath /usr/syno/etc/certificate/_archive/dQPaUd/fullchain.pem \
--capath /usr/syno/etc/certificate/_archive/dQPaUd/chain.pem \
--reloadcmd
rsync -avzh /usr/syno/etc/certificate/_archive/dQPaUd/ /usr/syno/etc/certificate/system/default/
/usr/syno/etc/rc.sysv/nginx.sh reload
至此, 自动更新证书完成.