我选择使用 lego
https://go-acme.github.io/lego/ 自动更新证书
同时个人不建议使用
acme.sh 。
很多人使用
acme.sh 是觉得 shell 脚本安装简单,没有外部依赖。实际上 shell 脚本因为自身功能太弱,很多功能都要依赖外部工具实现,如提取字符串需要依赖外部的 grep 。加上 shell 脚本是动态解释运行的,如果缺失了某个依赖的程序,只有实际运行到才会报错,很容易遇到执行了一半出错的情况。
我以前在特殊的路由器系统上运行
acme.sh ,就遇到了很多依赖缺失的情况。虽然说脚本可以在启动时进行检测,但是这也是要人工添加的,难免会有疏漏。
其次 shell 脚本没有解析 JSON 的能力,外部解析 JSON 的工具如 jq 等又要额外安装,所以很多情况下会直接用 grep 正则表达式提取 JSON 中的数据,这么做有提取出错的风险。
最后 shell 脚本很容易把变量等数据当成代码执行,出现远程代码执行漏洞的风险较高,同时
acme.sh 曾经确实出现过远程代码执行漏洞。
选择使用 lego ,是因为它基于 Golang ,真正实现了单文件无外部依赖。不足之处是不支持自动添加定时任务,只能手动配置。