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 [email protected] --issue --debug \
--dns dns_ali \
-e Ali_Key="xxxxxx" \
-e Ali_Secret="xxxxxx" \
-d liu12.com -d *.liu12.com
--register-account
自动注册账号
自动注册账号的邮箱
--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 [email protected] --issue --debug \
--dns dns_dp \
-e DP_Id="xxxxxx" \
-e DP_Key="xxxxxx" \
-d liu12.com -d *.liu12.com
国内主要这两家,如果是其它域名,请参考:
dnsapi · acmesh-official/acme.sh Wiki · GitHub
成功生成证书后,在 ~/acme.sh 目录下,将产生一个目录,本例中为 "liu12.com"
目录下的文件结构如下:
其中,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 [email protected] \
--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)的权限
注意,一定要加下边这个 解析 权限
最近使用 acme.sh 对 腾讯云 dnspod 带通配符域名 生成证书时,没有什么报错,证书也成功生成了,但是查看证书数据,并不包含通配符域名。一直没有研究出来原因,放弃了,如有遇到类似问题的朋友一起切磁切磁
本文原始网址:Acme.sh 自动更新 Lets Encrypt 证书,转载请保留出处