之前一直是使用手动的方式去申请和续签Let's Encrypt
泛域名SSL证书。最近为了更方便的自动化部署,详细研究使用了acme.sh
这个项目,并成功自动申请了多个域名证书.同时该项目还能够自动续签证书,自动安装证书,支持广泛的环境和场景的部署,功能非常强大。
acme.sh 是一款方便,强大的 Let's Encrypt 域名证书申请续签程序。支持一键脚本和 docker 部署,支持 http 和 DNS 两种域名验证方式,其中包括手动,自动 DNS 及 DNS alias 模式方便各种环境和需求。可同时申请合并多张单域名,泛域名证书,并自动续签证书和部署到项目。
既然Acme.sh功能这么强那就开始吧,我尽量说得详细些,步骤:
首先使用FinalShell或其它工具登陆群晖SSH端口,步骤是:
输入admin及密码
输入sudo -i
输入root及密码
输入以下代码安装acme.sh
wget https://github.com/Neilpang/acme.sh/archive/master.tar.gz tar xvf master.tar.gz cd acme.sh-master/ chmod a+x acme.sh
解压后需将其安全到我们能容易查看的目录内,输入代码:
./acme.sh --install --nocron --home "/volume1/docker/cert/challenges/acme.sh"
设置别名(创建 一个 bash 的 alias,方便使用):
alias acme.sh=/volume1/docker/cert/challenges/acme.sh/acme.sh
测试别名是否应用成功
acme.sh --version
返回上述信息,表示设置成功。
注册acme账号,执行脚本进行账号申请
acme.sh --register-account -m my@example.com --server zerossl
注意:邮箱(my@example.com)记得改成自己的
推荐使用子账户,并赋予子账户 DNS 权限,以确保安全性.
登陆阿里云控制台 - 访问控制 RAM - 用户管理
新建用户并勾选为该用户自动生成AccessKey
,复制保存好生成的AccessKey
信息。
授权该用户,搜索DNS
,并将AliyunDNSFullAccess
移动至右侧确定。
根据官方dnsapi
获取阿里云的API
格式为:
export Ali_Key="LTAI4Fd8J9qs4fxxxxxxxxxx" export Ali_Secret="Xp3Z7NDOW0CJcPLKoUwqxxxxxxxxxx"
腾讯云的域名由dnspod.cn
管理,登陆管理控制台,右上角选择密钥管理
,创建密钥并复制保存好生成的ID
和Token
。
根据官方dnsapi
获取DNSPod.cn
的API
格式为:
export DP_Id="124xxx" export DP_Key="54ddaa41245837600ce713xxxxxxxxxx"
Cloudflare 的 API 分为 global api key 全局 API 和创建 new api token ,网上各种教程都是使用全局 API。为确保安全,推荐创建 new api token 来使用。
登陆 Cloudflare ,我的个人资料>API令牌>创建令牌>开始创建,设置如下
设置完成以后,点击创建令牌。
使用网站给出的代码测试令牌,点击Copy记录下你的令牌(API token)
curl -X GET "https://api.cloudflare.com/client/v4/user/tokens/verify" \ -H "Authorization: Bearer 你的令牌" \ -H "Content-Type:application/json"
返回如上信息表示设置正确。
进入随便一个域名管理界面,概述页面的最右下角有你的帐户ID(Account ID),复制并记录。
根据官方dnsapi
获取CloudFlare
的Using the new cloudflare api token
格式为:
export CF_Token="Latn0w4-*********************k4PtIDVVG" export CF_Account_ID="a106***************************f26a"
1、配置好后,请选用相应的代码进行生成证书,我选用的是阿里云,所以代码是:
acme.sh --issue --dns dns_cf -d example.com -d *.example.com
注意:多域名可以在命令后面加入 -d xxx.com 等等,需要多少个就可增加多少,但是这些域名都需在你Cloudflare帐户下。
等几分钟,返回如上信息,表示生成证书成功,一般如果配置成功的话,可以直接产生相应的证书,文件夹是以你的域名命名的,例如"example.com",里面有7个文件,分别是证书和系统文件,如下图已经在/volume1/docker/cert/challenges/acme.sh/example.com目录中生成了7个文件。
2、配置证书
在NAS文件管理中找到/volume1/docker/cert/challenges/acme.sh/example.com,将example.com.key、fullchain.cer以及ca.cer三个文件,下载到本地。
ca.cer是中间证书,可以不下载,也可不下载,随意。
通过SSH输入以下命令,查看证书的配置目录
cd /usr/syno/etc/certificate/_archive/ ls
记住/usr/syno/etc/certificate/_archive目录下的证书目录。
通过NAS控制面板>安全性>证书>新增,导入证书,导入刚下载的example.com.key和fullchain.cer(以及ca.cer)到NAS服务器中。
导入证书完成后,再到/usr/syno/etc/certificate/_archive目录中看看新增的证书目录名称,我是之前已经配置过的,我的新证书配置目录是JQByw2,记住这个文件夹名称,下面需要用到。
这时你就可以在NAS控制面板>安全性>证书中看到您刚才配置的证书。
设置成默认证书,点击设置,将系统默认选择为刚配置的证书即可。
3、配置自动更新证书
acme.sh --install-cert -d example.com --certpath /usr/syno/etc/certificate/_archive/JQByw2/cert.pem --keypath /usr/syno/etc/certificate/_archive/JQByw2/privkey.pem --fullchainpath /usr/syno/etc/certificate/_archive/JQByw2/fullchain.pem --capath /usr/syno/etc/certificate/_archive/JQByw2/chain.pem --reloadcmd "nginx -s reload"
配置完成,系统会重载Nginx。
添加计划任务,实现自动更新
控制面板>计划任务>新增>计划的任务>用户自定义脚本,用户帐号选择root,勾选已启动。
任务设置选项的用户定义的脚本输入:
cd /volume1/docker/cert/challenges/acme.sh ./acme.sh --home /volume1/docker/cert/challenges/acme.sh --renew --force -d example.com -d *.example.com
因为证书的有效期为90天,所以我们在计划选项中选择每月指定日期运行一次脚本,来更新证书,我设置的是每月20日0点运行。这样就不会出现证书过期的情况。
经过测试,更新后会自动运行配置证书命令,如果不放心,可以再添加一个配置证书的计划任务。过程跟上一个脚本配置基本一样,只是脚本使用:
cd /volume1/docker/cert/challenges/acme.sh ./acme.sh --home /volume1/docker/cert/challenges/acme.sh --install-cert -d example.com --certpath /usr/syno/etc/certificate/_archive/JQByw2/cert.pem \--keypath /usr/syno/etc/certificate/_archive/JQByw2/privkey.pem --fullchainpath /usr/syno/etc/certificate/_archive/JQByw2/fullchain.pem --capath /usr/syno/etc/certificate/_archive/JQByw2/chain.pem --reloadcmd "nginx -s reload"
为保险起见,这个脚本设置运行时间应该比上一个晚半小时到一个小时,因为生成证书会需要几分钟,域名越多,生成证书需要的时间越多。