使用Acme.sh自动生成和续订Lets Encrypt免费SSL证书

使用Acme.sh自动生成和续订Lets Encrypt免费SSL证书

💡 原文中文,约3800字,阅读约需9分钟。
📝

内容提要

acme.sh 是兼容 ACME 协议的 Shell 脚本,可自动获取、续订并安装 SSL/TLS 证书,支持 HTTP、DNS、TLS-ALPN 验证及通配符、ECC/RSA 证书。安装后默认 CA 为 Let's Encrypt,可通过 DNS API 签发证书并安装到 Nginx 后重载,同时自动创建定时任务续订证书。

🔎

延伸解读

为何选择 acme.sh 而非 Certbot

acme.sh 是一个纯 Shell 脚本,无额外依赖,兼容 Linux、FreeBSD、macOS 等系统。它支持 HTTP、DNS、TLS-ALPN 等多种验证方式,并集成大量 DNS 服务商 API,特别适合需要通配符证书或无法进行 HTTP 验证的场景。此外,acme.sh 可自动续订并安装证书到 Nginx 等服务,还支持 ECC 和 RSA 证书以及自定义钩子,灵活性较高。

国内服务器安装注意事项

由于默认安装脚本从 GitHub 拉取,国内服务器可能网络受限,建议使用 Gitee 镜像克隆仓库后手动安装。安装后需设置别名方便调用,并建议将默认 CA 从 ZeroSSL 更换为 Let's Encrypt,以避免签发时出现 Pending 状态。同时可启用自动更新以保持脚本最新。

通配符证书的 DNS 验证要点

申请通配符证书必须使用 DNS 验证,并同时指定主域名和通配符域名,且主域名必须放在前面,否则即使签发成功也可能没有证书文件输出。需要提前获取 DNS 服务商的 API 密钥,如 DNSPod 的 ID 和 Token,或 Cloudflare 的 Key 和 Email。这些凭证会保存在 account.conf 中,后续自动使用。

证书安装与自动续订机制

使用 --install-cert 命令可将证书安装到指定路径,并通过 --reloadcmd 在安装后自动重载 Nginx 等服务。acme.sh 会自动创建 crontab 定时任务,每日检查证书有效期,到期自动续订并重新加载服务。可通过 acme.sh --list 查看证书下次更新时间,确保续订正常进行。

❓

Q&A

acme.sh 是什么?它有什么主要特点?

acme.sh 是一个使用 ACME 协议的 Shell 脚本,用于自动获取、续订和安装 SSL/TLS 证书。它兼容 Unix 和类 Unix 系统,无依赖,支持 HTTP-01、DNS-01 和 TLS-ALPN-01 验证模式,集成 DNS API,可自动续订和安装证书,支持 ECC 和 RSA 证书,并允许自定义钩子。

如何安装 acme.sh?

国外服务器:运行 curl https://get.acme.sh | sh -s email=my@example.com,然后设置别名 alias acme.sh=~/.acme.sh/acme.sh,并设置默认 CA 为 Let's Encrypt:acme.sh --set-default-ca --server letsencrypt。国内服务器:先克隆仓库 git clone https://gitee.com/neilpang/acme.sh.git,进入目录后运行 ./acme.sh --install -m my@example.com,再设置别名和默认 CA。

如何使用 acme.sh 生成通配符证书?

首先获取 DNS 厂商的 API 密钥,例如 DNSPod 的 DP_Id 和 DP_Key,然后导出环境变量:export DP_Id="<DNSPod ID>" 和 export DP_Key="<DNSPod Token>"。接着运行命令:acme.sh --issue --dns dns_dp -d example.com -d '*.example.com'。注意:生成泛域名证书必须同时包含 example.com 和 *.example.com,且 example.com 必须在前。

如何将 acme.sh 签发的证书安装到 Nginx?

使用 --install-cert 命令,例如: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 "systemctl reload nginx"。然后更新 Nginx 配置,将 ssl_certificate 指向 fullchain.pem,ssl_certificate_key 指向 key.pem,最后重载 Nginx。

acme.sh 如何自动续订证书?

acme.sh 安装后会自动在 crontab 中添加定时任务,每日检查一次证书,如果证书需要更新则自动续订并安装,并执行重载命令(如重载 Nginx)。可以通过 acme.sh --list 查看证书的下次更新时间。

如何检查 SSL 证书是否生效?

可以使用命令 echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -dates 查询证书有效期,或通过浏览器访问域名查看证书信息,也可以使用第三方 SSL 证书检测机构如 https://myssl.com/ 进行检测。

🏷️

标签

➡️

继续阅读