官方安装和使用文档:https://github.com/Neilpang/acme.sh/wiki/说明
HTTP 方式生成证书
该方法生成的证书不支持泛域名。
还有一点,acme.sh 检测的 nginx 配置文件必须位于 /etc/nginx/sites-enabled
下。
acme.sh --issue -d cdn.example.com --nginx
发现的问题
acme.sh 并不能增量的增加子域名,如现在已有 a.example.com 的证书,想要增加 b.example.com,该脚本就会替换现有的 fullchain.cer 文件,从而导致之前的证书失效。
所以想要添加子域名 b.example.com 的话,要同时创建 a.example.com 和 b.example.com,当子域名数量过多的话,就会触发 Let's Encrypt
的速率限制,比较恶心。
DNS 方式生成证书
该方法生成的证书支持泛域名,从长远角度考虑比较方便,笔者最终采用的就是这种方法。
DNS 方式简单来说就是需要你在 DNS 解析上增加一个 TXT 记录,用于表明该域名归属于你。
但这里有个问题:Let’s Encrypy 的证书 3 个月后就会过期,难不成每 3 个月都重新手动操作一遍吗?这也违背了 acme.sh 脚本的初衷。所以这里需要利用 DNS 服务商的 API,这样 acme.sh 可以自动的完成这一切。每一家 DNS 的具体配置方式不一致,请自行查阅官方文档:https://github.com/Neilpang/acme.sh/wiki/dnsapi
export CF_Key="***************************"
export CF_Email="******@163.com"
acme.sh --issue --dns dns_cf -d example.com -d *.example.com
安装证书
acme.sh --installcert -d example.com \
--key-file /etc/nginx/ssl/example.com.key \
--fullchain-file /etc/nginx/ssl/fullchain.cer \
--reloadcmd "systemctl force-reload nginx"
注意这里的 reloadcmd 参数,这是 nginx 重启的命令,如果你没有使用 systemd 或者说你是直接用的 nginx 命令,那请修改对应的命令为:
- 关闭 nginx
- 开启 nginx
因为 nginx -s reload 命令并不能重新加载证书。
遇到的一些其他问题
怎么避免连续多次失败触发 Rate limit ?
运行 acme.sh 的时候加上参数 --test
触发 Let’s Encrpty 的 Rate limit 怎么办?
可以删除 ~/.acme.sh
再重新安装操作。
提示 Failed to connect to dns.google port 如何解决?
使用参数 --dnssleep 300
。acme.sh
默认情况会使用 google dns 来验证是否生效,该参数可以跳过该验证,文档: dnssleep。