acme.sh实现免费证书自动续签

661 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第22天,点击查看活动详情

一、前言

使用HTTPS协议可以在原有HTTP的基础上添加一层数据加密的模块,使用HTTPS相比HTTP有效提高了在数据传输中受到网络嗅探和中间人攻击的成本。虽然HTTPS协议会影响请求性能,但是对于许多涉及用户数据交换的场景,HTTPS的作用十分显著。目前,大部分网站也都支持使用HTTPS协议了,如果我们的搭建的网站没有配置HTTPS,那么浏览器将对用户发出警告。

但是,对于咱们这样的小团队或个人开发者来说,难以承担证书的高额费用,索性有Let's Encrypt这样免费的证书,给我们留下了一条“活路”。

免费也有免费的代价,对于Let's Encrypt来说,为了减少非法使用,其证书有效期仅三个月,如果每三个月都要进行续签,加上申请的证书数量一大,就会让人头疼。

当然也有一些“免费”的证书托管网站,但是对数量、功能进行了限制,需要使用完整功能就需要付费了。

既然我们自己拥有服务器,使用acme.sh脚本进行自动续签,相比托管平台则更加省事。

二、配置脚本

使用下述命令实现脚本的简易配置:

curl https://get.acme.sh | sh

通过该命令完成了脚本拷贝、添加别名(方便运行)、启动定时器三个任务。

image.png

完成安装后,使用source ~/bashrc或重新开命令行后,输入acme.sh -h就能看到相关帮助:

image.png

三、设置DNS API

使用DNS API申请并进行证书验证是实现自动续签最方便的方法。

首先需要从域名商那边获得DNS API的key和secret,以阿里云为例,创建一个子用户并进行获取:

image.png

然后填入即可,不同的域名商的参数名不一样,可参考:github.com/Neilpang/ac…

export Ali_Key="your_key"
export Ali_Secret="your_secret"

四、证书申请

配置完成后,就可以申请证书了,以申请一个泛域名证书为例,--dns指定域名商,通过-d参数指定需要进行申请的域名:

acme.sh --issue --dns dns_ali -d example.com -d *.example.com

写文章的时候发现acme.sh默认证书换成了ZeroSSL,也是一个优秀的免费证书,这里提示需要注册邮箱,填写命令进行注册:

acme.sh --register-account -m my@example.com

image.png

然后再次执行申请指令,acme.sh通过我们授权的API进行了一系列申请操作(包括设置DNS的txt解析、验证、解析删除等),等待一会,相关证书就申请好了:

image.png

申请到的证书将被存于~/.acme.sh/example.com

完成此过程后,acme.sh会自动创建一个crontab任务,自动完成续签。当然也可以强制触发更新过程,命令如下:

acme.sh --cron -f

image.png