acme.sh 申请并自动续期 ssl 证书

acme.sh 是一个 ACME Shell 脚本

  • 一个完全用 Shell(Unix shell)语言编写的 ACME 协议客户端
  • 完整的 ACME 协议实现
  • 支持 ECDSA 证书
  • 支持 SAN 和通配符证书
  • 简单、强大且非常易于使用。您只需要 3 分钟即可学会
  • Bash、dash 和 sh 兼容
  • 纯粹用 Shell 编写,不依赖于 python
  • 只需一个脚本即可自动颁发、更新和安装您的证书

这可能是最简单最好用的的自动颁发和更新免费证书的 shell 脚本。

可能在2021年8月份吧,acme 将默认 CA 更改为 ZeroSSL,所以默认按照以前的就方法申请 letencrypt 证书会有一些报错,所以我们有必要再记录一下或适应一下现在新版的 acme.sh

使用 acme.sh 申请并自动续期 SSL 证书

一、安装 acme.sh

很简单,一个命令:

curl https://get.acme.sh | sh
  • 国内安装可能有时候由于网络问题,导致安装不成功,确保安装过程日志:Install success!
  • 如果安装不成功可以再次运行安装命令,继续尝试安装。
  • 安装完成会自动创建一个计划任务,每天 0 点左右自动检测所有的证书,如果证书快过期了,则会自动更新证书。

二、申请证书

强烈推荐用 DNS API 模式申请证书,没必要尝试其他方法。完美支持在阿里云购买的域名使用 DNS API 模式,仅需 Ali_Key 与 Ali_Secret,我们需要提前在阿里云上开通子账户功能,为了安全请配置好仅用于DNS API的子账户的权限。

1、配置API key

Ali_Key 和 Ali_Secret 将保存在 ~/.acme.sh/account.conf 中,并在需要时重复使用。

# 分别执行以下命令配置 API key
export Ali_Key="LT********S"
export Ali_Secret="O******************F"

2、申请证书

申请的是通配符证书

# 注意这里指定 CA 为 letsencrypt。 --server letsencrypt
/root/.acme.sh/acme.sh --issue --dns dns_ali -d sgtfz.cn -d *.sgtfz.cn --server letsencrypt

因为在 acme.sh 没有更换默认 CA 为 ZeroSSL 之前,我的是 letsencrypt 申请颁发的 SSL 证书,因此如果你还是想使用 letsencrypt 作为默认 CA,可以使用下面的命令配置

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

如果你按照以前的命令申请证书:

# 注意这里没有指定 CA,默认 CA 为 ZeroSSL
/root/.acme.sh/acme.sh --issue --dns dns_ali -d sgtfz.cn -d *.sgtfz.cn

会提示你需要电子邮件更新账户:

root@aly-ECS-T5-sgtfz:~# /root/.acme.sh/acme.sh --issue --dns dns_ali -d sgtfz.cn -d *.sgtfz.cn
[Sun 02 Jan 2022 10:19:58 PM CST] Using CA: https://acme.zerossl.com/v2/DV90
[Sun 02 Jan 2022 10:19:59 PM CST] Create account key ok.
[Sun 02 Jan 2022 10:19:59 PM CST] No EAB credentials found for ZeroSSL, let's get one
[Sun 02 Jan 2022 10:19:59 PM CST] acme.sh is using ZeroSSL as default CA now.
[Sun 02 Jan 2022 10:19:59 PM CST] Please update your account with an email address first.
[Sun 02 Jan 2022 10:19:59 PM CST] acme.sh --register-account -m my@example.com
[Sun 02 Jan 2022 10:19:59 PM CST] See: https://github.com/acmesh-official/acme.sh/wiki/ZeroSSL.com-CA
[Sun 02 Jan 2022 10:19:59 PM CST] Please add '--debug' or '--log' to check more details.
[Sun 02 Jan 2022 10:19:59 PM CST] See: https://github.com/acmesh-official/acme.sh/wiki/How-to-debug-acme.sh

如果我们选择使用默认 CA 为 ZeroSSL 申请 SSL 证书,可以按照提示更新账户:

/root/.acme.sh/acme.sh --register-account -m sgtfz@sgtfz.cn --server zerossl

三、安装证书

注意, 默认生成的证书都放在安装目录下:~/.acme.sh/,请不要直接使用此目录下的文件,例如: 不要直接让 nginx/apache 的配置文件使用这下面的文件。这里面的文件都是内部使用,而且目录结构可能会变化。

正确的使用方法是使用 --install-cert 命令,并指定目标位置,然后证书文件会被复制到相应的位置。

# 证书匹配apache与nginx。
# nginx使用key.pem、chain.pem
# apache使用cert.pem、key.pem、chain.pem
/root/.acme.sh/acme.sh --install-cert -d sgtfz.cn \
--cert-file      /etc/nginx/cert/sgtfzcn_cert.pem \
--key-file       /etc/nginx/cert/sgtfzcn_key.pem \
--fullchain-file /etc/nginx/cert/sgtfzcn_chain.pem \
--reloadcmd     "service nginx force-reload"

或者 --reloadcmd "service apache2 force-reload" 对应重载 apache

一个小提醒,这里用的是 service nginx force-reload,不是 service nginx reload,据测试,reload 并不会重新加载证书,所以用的 force-reload

Nginx 的配置 ssl_certificate 使用 /etc/nginx/ssl/fullchain.cer ,而非 /etc/nginx/ssl/<domain>.cer ,否则 SSL Labs 的测试会报 Chain issues Incomplete 错误。

--install-cert 命令可以携带很多参数,来指定目标文件。并且可以指定 reloadcmd,当证书更新以后,reloadcmd 会被自动调用,让服务器生效。

详细参数请参考: https://github.com/Neilpang/acme.sh#3-install-the-issued-cert-to-apachenginx-etc

值得注意的是,这里指定的所有参数都会被自动记录下来,并在将来证书自动更新以后,被再次自动调用

四、更新 acme.sh

目前由于 acme 协议和 letsencrypt CA 都在频繁的更新,因此 acme.sh 也经常更新以保持同步

升级 acme.sh 到最新版:

acme.sh --upgrade

如果你不想手动升级,可以开启自动升级:

acme.sh --upgrade --auto-upgrade

之后,acme.sh 就会自动保持更新了。

你也可以随时关闭自动更新:

acme.sh --upgrade --auto-upgrade 0

更多详细说明,请到官方代码库查看

https://github.com/acmesh-official/acme.sh

发表评论