Acme.sh 自动生成、续期 ​Let's Encrypt 免费SSL证书

作者: 刘一二 发布时间: 2022年7月19日 浏览: 2261

​​Let's Encrypt 提供了90天免费证书,而 acme.sh 实现了 acme 协议, 可以从 ​​Let's Encrypt 生成免费的证书.,通过计划任务可实现自动续期,自动部署,完全摆脱了人工,懒人必备。

Acme.sh 官方资料:

https://github.com/acmesh-official/acme.sh

安装:

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

安装目录为 home 下的 .acme.sh,如 root 用户: /root/.acme.sh

生成证书:

$ acme.sh --register-account -m i@liu12.com --issue --debug \ 
    --dns dns_ali \
    -e Ali_Key="xxxxxx" \ 
    -e Ali_Secret="xxxxxx" \
    -d liu12.com -d *.liu12.com

参数解释:

--register-account

自动注册账号

-m i@liu12.com 

自动注册账号的邮箱

--issue

生成证书

--debug

显示调试信息,会输出执行过程中的详细信息,方便发现问题

--dns dns_ali.

通过 DNS 接口验证域名(本例阿里云域名),另有 http 方式验证 --webroot,不推荐使用。因为它不支持生成通配符域名证书(即示例中的 *.liu12.com)
如查你蚬到以下报错,就是这个问题了

The supported validation types are: dns-01 , but you specified: http-01

-e Ali_Key="xxxxxx"
-e Ali_Secret="xxxxxx"

这两个是阿里云的 AccessKey,阿里云两主账号和子账号两种,分配好权限后都可以使用。

-d liu12.com
-d *.liu12.com

要生成证书的域名,可用通配符 *

 

如果是腾讯的 dnspod 域名,则命令行为:

$ acme.sh --register-account -m i@liu12.com --issue --debug \ 
    --dns dns_dp \
    -e DP_Id="xxxxxx" \ 
    -e DP_Key="xxxxxx" \
    -d liu12.com -d *.liu12.com

国内主要这两家,如果是其它域名,请参考:

https://github.com/acmesh-official/acme.sh/wiki/dnsapi

 

成功生成证书后,在 ~/acme.sh 目录下,将产生一个目录,本例中为 "liu12.com"

目录下的文件结构如下:

liu12.com.cert.jpg

其中,liu12.com.cer 和 fullchain.cer  是证书,fullchain.cer 为完整的证书链,一般使用 fullchain.cer, liu12.com.key; 为私钥,配置到 nginx 中示例:

server {
    listen 443 ssl;
    server_name www.liu12.com;

    ssl_certificate /***/liu12.com/fullchain.cer;
    ssl_certificate_key /***/liu12.com/liu12.com.key;
    // ......
}

重启下 nginx,您的域名就可以通过 https 访问了

 

crontab -e 查看计划任务,发现Acme.sh 已自动创建了一条定时任务,每天都会检查,证书到期前 30 天,将自动续期

40 0 * * *  /***/.acme.sh  --cron --home "/***/.acme.sh" > /dev/null

实际应用中,我们不需要这么频繁,因为会提前 30 天续期,因此每周运行一次即可,本例设置为每周一的 2:15。

15 2 * * 1 /***/.acme.sh --cron --home "/***/.acme.sh" > /dev/null

计划任务中可另加一条  3:15 重启 nginx,即执行更新证书后1小时,重新加载 nginx

15 2 * * 1 /***/.acme.sh --cron --home "/***/.acme.sh" > /dev/null
15 3 * * 1 /***/nginx -s reload

有的小伙伴可能担心 nginx 有一段时间使用旧证书是否有问题,这个可以放心,我们测试过,新旧两套证书同时都是有效的!

 

另外,acme.sh 也有一个 docker 封装,使用起来更加方便

docker run --rm -itd -v /cert:/acme.sh \ 
    -e Ali_Key="xxxxxx" -e Ali_Secret="xxxxxx" \
    --name=acme.sh neilpang/acme.sh daemon

docker 运行 neilpang/acme.sh 镜像,参数与命令行方式类似。docker 提供了 -v 参数,可以将存放证书的目录挂载在外部,这里用了 /cert,成功运行后, 通过 docker ps 命令可看看取启动了个 名叫 "acme.sh" 的容器,它是一个基础工具,可以重复便用它生成域名证书

docker exec acme.sh --register-account -m i@liu12.com \
     --issue --debug --dns dns_ali -d liu12.com -d *.liu12.com

执行完成后,在 /cert 目录下同样出现了 liu12.com. 的证书目录

 

添加计划任务,自动对证书续期

15 2 * * 1 docker exec acme.sh --cron

阿里云的域名请注意

阿里云主账号本身的 accessKey,权限足够大,可以忽略这个问题,如果你使用了阿里云的 子账号 AccessToken,可能会遇到下边错误:

Error add txt for domain:_acme-challenge.liu12.com

这个是权限问题,在子账号权限配置里,有两项域名权限:

AliyunDomainFullAccess   -  管理域名服务的权限
AliyunDNSFullAccess - 管理云解析(DNS)的权限

注意,一定要加下边这个 解析 权限

腾讯云的 dnspod 域名

​最近使用 acme.sh 对 腾讯云 dnspod 带通配符域名 生成证书时,没有什么报错,证书也成功生成了,但是查看证书数据,并不包含通配符域名。一直没有研究出来原因,放弃了,如有遇到类似问题的朋友一起切磁切磁

最新文章
热门文章
热门搜索
猜你喜欢
导航