目 录CONTENT

文章目录

使用acme.sh申请免费SSL证书并且自动验证域名自动续期(阿里云域名)

成培培
2024-10-23 / 0 评论 / 0 点赞 / 79 阅读 / 0 字

需求来源

自己在家里的NAS上搭建了blog网站以及WebDAV网盘服务,需要用到SSL证书保证数据传输的安全性,曾经都是在阿里云上申请免费的SSL证书,在域名上手动添加TXT记录校验,然后把申请到的证书部署到Nginx上即可,麻烦是麻烦点,但是曾经阿里云上申请到的免费证书有效期是一年,一年手动操作一次也不算太费劲。但是如今申请的证书有效期全部调整为3个月了,这就比较麻烦了,所以就想能不能找到一种方案可以在证书过期时自动申请部署证书。

名词解释

  1. acme.sh:github上一个开源项目,ACME协议客户端,地址:https://github.com/acmesh-official/acme.sh

  2. Let’s Encrypt: 一家免费、开放、自动化的公益性证书颁发机构(CA), 由互联网安全研究组(ISRG)运作,支持ACME协议来签发证书,官网地址:https://letsencrypt.org/

acme安装

安装非常简单,一条命令即可安装,其中email后面环境你自己的邮箱,应该是接受通知的邮箱,但是实测申请安装证书过程中好像也并没有接收到什么邮件

curl https://get.acme.sh | sh -s email=472799208@qq.com

这条命令会做三件事情

  1. 下载安装acme.sh脚本到你当前用户的~/.acme.sh/目录下

  2. 创建别名:acme.sh=~/.acme.sh/acme.sh,以便你在任何目录可以执行acme.sh操作,但是可能会失败,也无所谓反正进入acme.sh目录下操作也行

  3. 创建每日 cron 作业来检查并更新证书

如果安装成功会有提示“Install success!”,执行acme.sh -v也会打印出安装的版本

签发证书

安装成功后,可以通过acme.sh脚本命令去申请签发证书了,签发证书需要域名,我这里使用的域名是阿里云购买的域名,同时也是在阿里云上管理域名解析,签发时为了证明你对该域名的所有权,一般会如下有两种方式来验证:

  • HTTP验证:http 方式需要在你的网站根目录下放置一个文件, 来验证你的域名所有权,完成验证. 然后就可以生成证书了

  • DNS验证:在签发的域名上添加证书颁发机构指定的TXT解析记录,证书颁发机构通过校验该域名是否解析到指定TXT来确认域名所有权

我这里时使用的DNS校验的方式,因为acme脚本内置了阿里云的整套校验逻辑,不需要我再去阿里云控制台手动添加TXT记录,非常方便,前提是在当前环境中添加阿里云的key和secret,以便acme可以调用阿里云域名解析相关接口自动完成TXT记录的添加。

我在/etc/profile文件中添加了如下两行代码:

export Ali_Key="xxxxxx"

export Ali_Secret="xxxxxxxxxxxx"

具体key和secret需要你登录到阿里云控制台去获取,然后重新登录ssh执行一下命令就可以开始签发证书:

acme.sh --issue --dns dns_ali -d chengpei.top -d *.chengpei.top --server letsencrypt

其中的chengpei.top是我的域名,更新为你自己的,而且我这里申请的是通配符的证书,满足所有二级域名公用一套证书非常方便!如果提示找不到acme.sh命令你可以去~/.acme.sh/目录下执行,执行成功会打印出签发的域名存放的位置:

证书安装

证书签发成功后,需要安装到你的Nginx里,这里执行一下命令即可:

acme.sh --install-cert -d chengpei.top \

--key-file /mnt/m2/nginx/cert/key.pem  \

--fullchain-file /mnt/m2/nginx/cert/cert.pem \

--reloadcmd "docker restart nginx8443"

其中chengpei.top是你的域名替换一下,–key-file和–fullchain-file参数是证书安装的位置,根据实际情况修改,–reloadcmd是证书安装成功后要执行的命令,一般是需要重新加载配置“nginx -s reload”,但是我这里因为nginx是docker安装的,所以你可以根据自己实际情况修改

自动续期

自动续期不需要再单独配置什么了,执行一下命令查看计划任务

crontab -l

你会发现已经新增了一个任务:

18 14 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null

这就代表的每天指定时间点检查证书是否过期,目前证书在 60 天以后会自动更新, 无需任何操作. 今后有可能会缩短这个时间, 不过都是自动的, 我们也不用关心。

0

评论区