acme.sh 实现了 acme 协议, 可以从 Let’s Encrypt 生成免费的证书。Let’s Encrypt自18年起宣布支持泛域名证书。

使用acme.sh生成泛域名证书,配合acme.sh的自动续期,可以极大节约管理证书的时间成本。

安装acme.sh

仅需一条命令:

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

调用域名提供商的api,用以验证域名

以namesilo为例,api manager >api key>generate,得到特定的api key

1
export Namesilo_Key="xxxxxxxxxxxxxxxxxxxxxxxx"

更多 DNS API 用法参考这里

生成泛域名证书

1
acme.sh --issue --dns dns_namesilo --dnssleep 1800 -d example.com -d *.example.com

在zsh等shell下,命令行不识别 * 等特殊字符,会报错zsh: no matches found: *,加引号即可解决:

1
acme.sh --issue --dns dns_namesilo --dnssleep 1800 -d example.com -d '*.example.com'

完毕会将证书路径输出到屏幕上:

1
2
3
4
[2020年 03月 10日 星期二 20:43:46 CST] Your cert is in  /root/.acme.sh/example.com/example.com.cer
[2020年 03月 10日 星期二 20:43:46 CST] Your cert key is in  /root/.acme.sh/example.com/example.com.key
[2020年 03月 10日 星期二 20:43:46 CST] The intermediate CA cert is in  /root/.acme.sh/example.com/ca.cer
[2020年 03月 10日 星期二 20:43:46 CST] And the full chain certs is there:  /root/.acme.sh/example.com/fullchain.cer

安装证书

官方不建议直接使用 .acme目录下的文件,这里边的文件仅供项目内部使用,且在后续版本升级后,目录结构可能会发生变化。

所以需使用--install-cert 命令,将证书copy指定的使用位置,以 Nginx 为例:

1
2
3
4
acme.sh --install-cert -d example.com \
--key-file       /path/to/keyfile/in/nginx/key.pem  \
--fullchain-file /path/to/fullchain/nginx/cert.pem \
--reloadcmd     "service nginx force-reload"

详细用法参考官方文档