DS918上使用acme.sh申请SSL证书并部署到群晖,路由器和腾讯云
由于腾讯云的TrustAsia
免费证书有效期从一年改为了三个月,每次重新申请证书及重新部署到各个设备都很麻烦,所以改为使用 ZeroSSL
的免费证书,并实现自动化部署。
安装acme.sh
acme.sh是用来申请免费证书的脚本。由于我使用的是群晖,脚本会在系统更新时删除而且没有 发现使用docker版本部署群晖需要显式提供密码,而且后来发现本来就是sh脚本,没必要硬上docker,唯一的问题是群晖没有crontab
来定期续签,所以使用docker进行安装。crontab
,所以安装时得注意,且得在web端中设置定时任务。使用root安装是为了部署到群晖时有相应权限,详见下文。
sudo -i
git clone --depth 1 https://github.com/acmesh-official/acme.sh.git
cd acme.sh
./acme.sh --install \
--home /volume1/scripts/acme.sh \
--accountemail "[email protected]" \
--noncron
安装完成后需重新登录shell。
签发证书
acme.sh现在默认使用ZeroSSL
发行证书,而不再是Let's Encrypt
了1。首先注册ZeroSSL
账号,并前往左侧栏中Developer页面,获取EAB Credentials
,之后使用以下代码进行注册。这样注册之后是可以在ZeroSSL看到签发的证书的。
acme.sh --register-account --server zerossl \
--eab-kid xxxxxxxxxxxx \
--eab-hmac-key xxxxxxxxx
之后开始申请签发证书,我使用的是DNS验证方法2,我的域名是使用DNSPod解析的,所以使用相应的选项,你也可以在这个页面3找到其他DNS平台的使用方法。
export DP_Id="<id>"
export DP_Key="<key>"
acme.sh --issue --dns dns_dp -d example.com -d *.example.com
之后设置部署钩子(deploy hooks),在每一次证书签发之后都会自动重新进行部署。
部署至群晖
将证书部署到群晖上较为复杂,提供的脚本中有两种方式4:创建临时用户进行设置和使用现有管理员账号密码进行设置。创建临时用户进行设置需要root权限,并且需要在本机上进行,那么用docker版和远程部署。否则的话得使用管理员账号密码,可能还需要二次验证码之类的。
我们这里介绍在本机上使用root进行部署,最为安全方便。直接export SYNO_USE_TEMP_ADMIN=1
,然后acme.sh --deploy --deploy-hook synology_dsm -d example.com
,完事了。
如果你的群晖设置不太一样,需要首先配置其他环境变量:
export SYNO_SCHEME="http"
export SYNO_HOSTNAME="localhost"
export SYNO_PORT="5000"
export SYNO_CREATE=1
export SYNO_CERTIFICATE=""
部署至路由器
首先需要能够直接不用密码ssh到远程服务器,也就是许要使用密钥登陆5。
我的路由器是RT-AX86U Pro
,用的是koolshare的梅林改版固件,版本是3004.388.4
。不知道是不是路由器架构不一样还是固件版本不一样6,我路由器存放证书的位置在/jffs/.cert
里面,证书拷贝进去后/sbin/service restart_httpd
重启网络服务就能更新路由器证书了。
接下来设置以下环境变量:
变量 | 值 | 作用 |
---|---|---|
DEPLOY_SSH_USER | admin | SSH用户名 |
DEPLOY_SSH_SERVER | 192.168.50.1 | 目的服务器/路由器ip地址 |
DEPLOY_SSH_KEYFILE | /jffs/.cert/key.pem | SSL证书key文件安装路径 |
DEPLOY_SSH_FULLCHAIN | /jffs/.cert/cert.pem | SSL证书文件安装路径 |
DEPLOY_SSH_REMOTE_CMD | /sbin/service restart_httpd | 部署后需要执行的命令(这里以梅林固件重启http服务为例) |
DEPLOY_SSH_MULTI_CALL | yes | 是否采用拆分多个SSH调用,以解决命令行缓冲区不足 |
之后执行命令:
acme.sh --deploy -d example.com --deploy-hook ssh
另外由于我部署至群晖和路由器时是分开进行的,所以每次自动部署时只会自动部署最后一项任务。在证书目录example.com_ecc
下找到配置文件example.com.conf
,将Le_DeployHook='ssh'
改为Le_DeployHook='ssh,synology_dsm'
,则每次更新证书都会重新部署所有任务。
部署至腾讯云
- SSH到群晖之后安装miniconda
- 创建虚拟环境
conda create -n web --python=3.11
- 从github下载zfb132/qcloud-ssl-cdn,用来更新腾讯云证书
- 切换到虚拟环境
conda activate web
,并安装依赖项pip install requests tencentcloud-sdk-python
- 修改
config.example.py
参数,根据注释修改每一项内容,然后重命名为config.py
- 运行
python main.py
更新证书
设置群晖定时任务
"/home/user/.acme.sh"/acme.sh --cron --home "/home/user/.acme.sh"
群晖定时任务里设置该命令,将"/home/user/.acme.sh"
改成你自己的安装目录。该命令能够检查acme.sh
的更新,之后检查证书是否快要到期然后续签并部署。
"~/.miniconda3/bin/python" "~/qcloud-ssl-cdn"/main.py
群晖定时任务设置更新腾讯云SSL证书,"~/.miniconda3"
设置为python的绝对路径(可以在虚拟环境里面使用which python
获得),"~/qcloud-ssl-cdn"
设置为你自己的下载地址。
Todos
使用Domain Admin进行多域名证书管理。