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
更多详细说明,请到官方代码库查看

