前言

其实网上已经有很多关于acme.sh的教程了,但是我还是想写一篇,这里面部分参考了官方WIKI。

因为大多数都没有使用cloudflare的apikey来自动完成dns challenge的中文教程,都是使用nginx插件或者在根目录下放一个文件之类的来验证域名所有权,而我正巧需要续签的服务器上是不开放访问的私人后台,没办法公开访问来让Let’s Encryption验证,没办法只好使用dns验证域名所有权了。

而且我的有图片流程,配置cfkey的流程会更详细一点吧

顺便一提Let’s Encryption的SSL证书的有效期真的是越来越短了,前不久还取消了邮件证书到期通知,总是过期了以后才想起来手动续签实在麻烦,所以还是用acme.sh来自动续签吧。

acme.sh会自动为你创建 cronjob, 每天 0:00 点自动检测所有的证书,如果快过期了需要更新,就会自动更新证书并安装。这样就再也不怕过期了。


安装acme.sh

ssh登录到你的服务器

建议创建一个 ~/.acme.sh/ 目录

在目录下执行以下命令

1
curl https://get.acme.sh | sh -s email=youremail@example.com

配置cloudflare的apikey

首先去cloud flare官网创建一个 API 令牌

在dashbord右上角的配置文件里面选择API令牌。

创建API令牌的传送门

第一步

点击创建令牌。

第二步

使用编辑区域DNS的模板。

第三步

在区域资源里选择你要续期的顶级域名,其他的都不要改,然后点击继续以显示摘要。

第四步

点击创建令牌。

第五步

点击复制令牌,在复制之前千万别关闭这个页面,否则这个令牌key就不会再次展示了,只能重新创建一个了。

第六步

好了,令牌创建完了,先临时保存到一个地方,等会要用到。

回到dashbord主页复制区域ID

找到要续期的域名,然后它右边的三个点,选择复制区域ID。

第七步

修改acme.sh的默认CA

acme.sh 脚本默认 CA 服务器是 ZeroSSL,有时可能会导致获取证书的时候一直出现:Pending,The CA is processing your order,please just wait.

所以还是Let’s Encrypt比较好用,把 CA 服务器改成 Let’s Encrypt

1
acme.sh --set-default-ca --server letsencrypt

配置acme.sh

在服务器的ssh上配置环境变量

1
2
3
4
5
6
7
8
#你刚刚复制的cloudflare apikey
export CF_Token="xTLmwbvY6h8XbLYLRgzY3rosNxgez0lAidahOtZA"

#你刚刚复制的cloudflare区域ID
export CF_Zone_ID="bc3be8eeaf5ebf5986739dc533d8491ef"

#你的cloudflare邮箱
export CF_Email="youremail@example.com"

这些设置的环境变量会被保存在 ~/.acme.sh/account.conf 中,以便在将来使用 dns_cf 签发新证书或续期现有证书时自动使用。

生成证书

1
acme.sh --issue --dns dns_cf -d example.com

执行成功后会输出类似以下的信息

1
2
3
4
Your cert is in: /root/.acme.sh/your.example.com_ecc/your.example.com.cer
Your cert key is in: /root/.acme.sh/your.example.com_ecc/your.example.com.key
The intermediate CA cert is in: /root/.acme.sh/your.example.com_ecc/ca.cer
And the full-chain cert is in: /root/.acme.sh/your.example.com_ecc/fullchain.cer

复制安装证书

证书生成好以后,需要把证书复制给对应的服务器目录去使用。

每次自动续签证书也会自动执行下面配置的安装命令

注意:必须使用 –install-cert 命令来把证书复制到目标文件,请勿直接使用 ~/.acme.sh/ 目录下的证书文件,acme官方wiki说这里面的文件都是内部使用,而且目录结构将来可能会变化。

不过就目前而言直接复制然后改个名字用好像也没什么大问题
1
2
3
4
5
acme.sh --install-cert -d example.com \
--cert-file /path/to/certfile/in/server/cert.pem \
--key-file /path/to/keyfile/in/server/key.pem \
--fullchain-file /path/to/fullchain/certfile/server/fullchain.pem \
--reloadcmd "the reload cmd for your webserver"

默认情况下,证书每 60 天更新一次(可自定义)。

更新证书后,reloadcmd 里的命令会自动执行,重启网页服务并更新证书。

自动更新 acme.sh

开启自动升级:

1
acme.sh --upgrade --auto-upgrade

之后,acme.sh 就会自动保持更新了。

完成啦,以后就再也不用担心证书过期的问题了。


参考

acme.sh官方WIKI

这也算是我写过第一篇技术相关的长篇博客吧,好像这个blog自创建以来也没写什么正经东西。