linux☞利用acme.sh管理免费的ssl证书申请

阅读量: zyh 2021-03-09 17:14:00
Categories: > Tags:

前言

申请免费的ssl证书途径有很多,例如阿里云的1年期,或者freessl这种站点。

如果你想自己部署一个服务来管理并自动更新,则可以使用 acme.sh

acme.sh 是一个开源程序,托管在github上。

安装

https://github.com/acmesh-official/acme.sh/wiki/说明#1-安装-acmesh

参考官方文档即可,很简单,不过国内经常受限于网络问题导致无法下载,因此你可以在 gitee 上下载

https://gitee.com/neilpang/acme.sh?_from=gitee_search#https://github.com/acmesh-official/acme.sh/wiki/说明

不过 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域名),不过这无关紧要。