前言
申请免费的ssl证书途径有很多,例如阿里云的1年期,或者freessl这种站点。
如果你想自己部署一个服务来管理并自动更新,则可以使用 acme.sh
acme.sh 是一个开源程序,托管在github上。
安装
https://github.com/acmesh-official/acme.sh/wiki/说明#1-安装-acmesh
参考官方文档即可,很简单,不过国内经常受限于网络问题导致无法下载,因此你可以在 gitee 上下载
不过 gitee 上看起来并不是最新的
使用
申请 ssl
以阿里云的dns托管解析为例,给abc.com创建免费ssl证书 Let’s Encrypt
创建访问阿里云dns解析所需的ram策略,请直接使用管理员策略,但是可以附加源ip限制
💁说实话我单独授权云解析策略就是不行,至于原因没有具体去验证。所以如果你授权了管理员策略,务必添加源ip限制
DnsAccessKey=
DnsAccessSecret=
export Ali_Key=${DnsAccessKey}
export Ali_Secret=${DnsAccessSecret}
D1=abc.com
DnsMode=dns_ali
acme.sh --issue --dns ${DnsMode} -d ${D1} -d *.${D1}
–dns 指定域名所在的托管解析商
-d 证书关联的域名
这个步骤会给域名添加新的txt记录,用来校验域名是否归你所有
但是在写这篇文章的时候,有新的问题出现,就是acme.sh默认调用cloudflare和google的dns去验证添加的记录是否已生效,而国内一些服务商访问国际接口那是一个稀烂🤕 所以可能会无限的卡在校验这里。
根据官方文档,你可以添加 --dnssleep 300 去忽略掉。
部署ssl
将生成的密钥和证书放在指定位置,这里的key和cer分别对应nginx所需的key和cert
acme.sh --installcert -d ${D1} --key-file ${D1_DIR}/${D1}.key --fullchain-file ${D1_DIR}/fullchain.cer
更新
acme.sh 会在用户级别的crontab中添加自动更新指令。通过crontab -l
可以看到。
如果你需要手动强制更新,则可以执行
acme.sh --renew -d ${D1} -d *.${D1}
配置
acme.sh 的配置文件默认放在 ~/.acme.sh/account.conf 中,一般来说需要用户提供的环境变量,都会以 SAVED_
开头。
通告
如果你想接收 acme.sh 处理后的消息,则需要配置,不同的消息体可以看官方文档
主要分为三个部分:
- 消息级别
- 消息模式
- 消息钩子
以自定义的 smtp 为例,你需要提供以下变量
export SMTP_FROM=
export SMTP_TO=
export SMTP_HOST="smtp.feishu.cn"
export SMTP_SECURE="tls"
export SMTP_PORT="587"
export SMTP_USERNAME=
export SMTP_PASSWORD=
# export SMTP_BIN="/path/to/python_or_curl"
export SMTP_TIMEOUT="30"
并执行
acme.sh --set-notify --notify-level 3 --notify-mode 0 --notify-hook smtp --accountconf ~/.acme.sh/account.conf
如此以来,acme.sh 会将你配置的环境变量追加存入 account.conf
其它问题
单一托管商多账户的问题
在写这篇文章的时候,acme.sh 当前并不支持(19年作者提出有时间会搞 🤺 ),但是你可以通过配置多个 account.conf,并在计划任务中使用 --accountconf 来写入多条更新计划命令来实现配置文件级别的轮询处理。就像下面这样:
34 0 * * * "/home/it/.acme.sh"/acme.sh --cron --home "/home/it/.acme.sh" --accountconf /home/it/.acme.sh/account.conf.aliyun
34 1 * * * "/home/it/.acme.sh"/acme.sh --cron --home "/home/it/.acme.sh" --accountconf /home/it/.acme.sh/account.conf.aws
34 2 * * * "/home/it/.acme.sh"/acme.sh --cron --home "/home/it/.acme.sh" --accountconf /home/it/.acme.sh/account.conf.godaddy
当然因为域名在生成ssl证书的时候,acme.sh并没有给域名关联某个配置的记录。因此每一条更新计划任务均会处理所有的域名,这必然会产生一些错误信息(即:xxx托管商找不到xxx域名),不过这无关紧要。