acme.sh 是一个开源的纯 shell 脚本编写的 acme 客户端,可自动申请更新 https 证书。相比其他工具,acme.sh 更轻量,主要表现在:

  1. 只是一个脚本,无需编译安装。
  2. 无侵入性,不会更改任何 web server 的配置。

修改 CA

acme.sh 默认 CA 是 ZeroSSL,可是在申请证书时添加 --server 参数临时修改。

修改默认 CA 执行(修改为 let's encrypt):

acme.sh --set-default-ca --server letsencrypt

支持的 CA 列表

申请证书

已有 web server

acme.sh --issue -d example.com -w /www/wwwroot/example.com
  1. -w 后为 vhost public 根目录。
  2. 如需一个证书包含多个域名可传递多个 -d 参数。

默认申请的证书保存在 ~/.acme.sh/example.com/但不要直接用于部署,这个目录的结果可能会随时改变。

DNS Alias

reference

若希望自动化通过 DNS 来验证(根域名必须使用 DNA 验证),但 DNS 服务商没有提供 API 该咋办呢?如果我们恰好还有一个域名,它的 DNS 服务商恰好支持 API,那就好办了。

假设要为 example.com 申请证书,proxy.com 是我们拥有的另一个域名,支持 API 设置 DNS。

  1. 添加 _acme-challenge.example.com 的 CNAME 记录,指向 _acme-challenge.proxy.com
  2. 设置 proxy.com 的 DNS API 密钥
  3. 使用 alias mode 验证。

    acme.sh --issue  \
      -d  example.com --challenge-alias proxy.com --dns {your dns provider}

上面的方法要求代理域名的主机名也必须是 _acme-challenge,当然也可以自定义这个名称。

假设现在我们设置 _acme-challenge.example.com -> custom.proxy.com,那么申请证书时使用 --domain-alias 参数就行了:

acme.sh --issue  \
  -d  example.com --domain-alias custom.proxy.com --dns {your dns provider}
  • --challenge-alias:只需指定域名,主机名默认为 _acme-challenge
  • --domain-alias:需要指定 FQDN(主机名+域名),可以自定义主机名。

部署证书

Nginx:

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"
  1. acme.sh 不会修改 nginx 配置,所以需要自己设置好。
  2. 部署时将保留现有目标文件的权限。所以如果有需求,先手动部署一般设置好权限。
  3. --reloadcmd 用于部署完成后刷新 web server。

其他命令

更多命令帮助执行 acme.sh --help 查看。

手动续期

acme.sh --renew -d example.com --force [--ecc]

不再续期

acme.sh --remove -d example.com [--ecc]

此命令不会删除证书文件

查看活跃的证书列表

acme.sh --list
Last modification:June 9, 2022