用户手动更新 SSL证书不仅繁琐,还容易因忘记续期导致网站无法访问。`acme.sh` 是一个纯 Shell 脚本工具,能帮你实现证书的自动申请、安装和续期,配置好后可以完全不用再操心。
整个搭建过程可以分为以下四个步骤:
mermaid
flowchart TD
A[开始:安装 acme.sh] --> B[申请 SSL 证书]
B --> C{选择验证方式}
C -- 方式一 --> D[HTTP 验证<br>需 80 端口访问]
C -- 方式二 --> E[DNS 验证<br>推荐泛域名证书]
D --> F[安装证书到 Web 服务器<br>如 Nginx/Apache]
E --> F
F --> G[验证自动续期<br>cron 任务 + 手动测试]
G --> H[完成:全自动管理]
第一步:安装 acme.sh
在你的服务器上执行以下命令即可完成安装。它会自动安装在 `~/.acme.sh/` 目录下,并设置好别名。
bash
# 安装 acme.sh,请将邮箱替换为你自己的
curl https://get.acme.sh | sh -s email=my@example.com
# 使别名在当前会话中生效
source ~/.bashrc
# 查看版本,确认安装成功
acme.sh --version
> 💡 小提示:`acme.sh` 的默认证书颁发机构是 ZeroSSL。如果你更习惯使用 Let's Encrypt,可以切换默认 CA:
> `acme.sh --set-default-ca --server letsencrypt`
第二步:申请 SSL证书
`acme.sh` 支持多种方式验证你对域名的所有权。这里介绍最常用的两种。
方式一:HTTP 验证
适用场景:你的网站已经部署,且 80 端口可以从公网访问。
这是最简单的方法,`acme.sh` 会自动在网站根目录下生成验证文件,验证通过后自动删除。
bash
# --nginx 参数会自动识别 Nginx 配置并完成验证
acme.sh --issue -d example.com -d www.example.com --nginx
# 如果你的 Web 服务器是 Apache,可以使用 --apache
# acme.sh --issue -d example.com --apache
# 如果服务器没有运行 Web 服务,也可以使用 --standalone 模式,它会临时启用一个 Web 服务器
# acme.sh --issue -d example.com --standalone
方式二:DNS 验证(推荐,支持泛域名)
适用场景:需要申请泛域名证书(如 `*.example.com`),或者服务器没有公网 IP。
这种方式需要你的 DNS 服务商支持 API。`acme.sh` 支持绝大多数 DNS 服务商(阿里云、腾讯云、Cloudflare 等)。
以阿里云为例:
bash
# 1. 设置你的 API 密钥(注意:这些信息不要泄露)
export Ali_Key="你的阿里云AccessKey ID"
export Ali_Secret="你的阿里云AccessKey Secret"
# 2. 申请泛域名证书(-d 参数可以多次使用,同时申请多个域名)
acme.sh --issue --dns dns_ali -d example.com -d '*.example.com'
首次使用时,`acme.sh` 会提示你添加一条 TXT 解析记录来验证,**第二次申请相同域名时就会全自动完成,无需手动干预**。
申请成功后,API 密钥会被 `acme.sh` 保存,后续续期时会自动调用。
第三步:安装证书到 Web 服务器
非常重要的一点:`acme.sh` 不建议直接使用 `~/.acme.sh/` 目录下的证书文件。正确的做法是使用 `--install-cert` 命令将证书安装到指定目录,这样在证书自动续期后,`acme.sh` 也会自动将新证书复制过去,并重启 Web 服务。
以 Nginx 为例:
bash
acme.sh --install-cert -d example.com \
--key-file /etc/nginx/ssl/example.com.key \
--fullchain-file /etc/nginx/ssl/example.com.crt \
--reloadcmd "systemctl reload nginx"
命令执行后:
1. 证书文件会被复制到 `/etc/nginx/ssl/` 目录。
2. `--reloadcmd` 指定的命令会在证书更新后自动执行,使 Nginx 重新加载新证书,整个过程无需人工参与。
之后,记得在你的 Nginx 站点配置中指定这两个文件路径:
nginx
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /etc/nginx/ssl/example.com.crt;
ssl_certificate_key /etc/nginx/ssl/example.com.key;
# ... 其他配置
}
第四步:验证自动续期是否生效
`acme.sh` 在安装时会自动为你创建一个 `cron` 定时任务,通常每天会检查一次,当证书剩余有效期小于 60 天时就会自动续期。你可以通过以下命令查看定时任务:
bash
crontab -l
你应该能看到一条类似 `... acme.sh --cron ...` 的记录。如果想手动测试续期逻辑是否正常,可以执行:
bash
# --force 参数会强制续期,用来测试整个流程
acme.sh --renew -d example.com --force
如果上述命令执行成功,且 Web 服务被正确重载,那么你的自动续签系统就搭建完成了。
快速上手指南
根据你的实际情况,可以参考以下配置路径:
你的场景 推荐方案 关键命令
已有Nginx/Apache HTTP 验证 `acme.sh --issue -d 你的域名 --nginx`
需要泛域名证书 DNS 验证 `acme.sh --issue --dns dns_你的DNS商 -d 你的域名 -d '*.你的域名'`
申请完成后 安装证书 `acme.sh --install-cert -d 你的域名 --key-file 路径 --fullchain-file 路径 --reloadcmd "重载命令"`
配置完成后,就放心地把SSL证书管理交给 `acme.sh`,告别手动更新的焦虑吧。