Let’s Encrypt证书自动续期
如果你正在为网站 HTTPS 证书过期而烦恼,希望找到一种可靠的自动续期方案,那么 acme.sh 配合 Let's Encrypt 是目前非常流行的选择。
本文将从零开始,带你完成 acme.sh 的安装、证书签发、自动续期配置以及常见问题处理,最终实现证书到期前自动更换,无需人工干预。
准备工作:环境与权限检查
在开始之前,请确保你拥有一台 Linux 服务器(本文以 CentOS 7 和 Ubuntu 20.04 为例),并已安装 curl 或 wget。
你需要一个已经解析到该服务器的域名,并且服务器 80 或 443 端口未被其他程序占用。
建议使用 root 用户或具有 sudo 权限的账号操作。
首先更新系统软件包并安装依赖:
# CentOS
sudo yum install -y curl socat
# Ubuntu
sudo apt update && sudo apt install -y curl socat
注意:acme.sh 支持多种验证方式,本文推荐使用 --standalone 模式,它会临时启动一个 Web 服务进行验证,适合没有运行 Web 服务的场景。
如果服务器已有 Nginx 或 Apache,也可使用 webroot 模式。
安装 acme.sh 并签发证书
acme.sh 是一个纯 Shell 脚本,安装过程简单。
执行以下命令,它会自动下载脚本并设置定时任务:
curl https://get.acme.sh | sh -s email=你的邮箱@example.com
安装完成后,需要重新加载 Shell 环境或退出重新登录,使 acme.sh 命令生效:
source ~/.bashrc
随后签发证书。
假设你的域名是 example.com,使用 standalone 模式:
~/.acme.sh/acme.sh --issue -d example.com -d www.example.com --standalone
如果 80 端口被占用,可以改用 --alpn 模式(需要 443 端口空闲):
~/.acme.sh/acme.sh --issue -d example.com -d www.example.com --alpn
重要:首次签发时,acme.sh 会自动向 Let's Encrypt 注册账户,并生成证书文件,默认保存在 ~/.acme.sh/example.com/ 目录下。
部署证书到 Web 服务
证书签发后,需要将其安装到 Web 服务器(如 Nginx)并配置续期后自动重载。
使用 --install-cert 命令:
~/.acme.sh/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"
--key-file和--fullchain-file指定证书文件的存放路径,请确保目录存在且 Nginx 有读取权限。--reloadcmd定义证书更新后执行的命令,这里设置为重载 Nginx 使新证书生效。
然后修改 Nginx 配置文件,指向新的证书路径:
server {
listen 443 ssl;
server_name example.com www.example.com;
ssl_certificate /etc/nginx/ssl/example.com.crt;
ssl_certificate_key /etc/nginx/ssl/example.com.key;
# 其他配置...
}
保存后测试 Nginx 配置并重载:
nginx -t && systemctl reload nginx
自动续期机制与验证
acme.sh 安装时会自动创建 cron 任务,每天检查证书是否即将到期(默认剩余 30 天时续期)。
你可以通过以下命令查看定时任务:
crontab -l | grep acme.sh
应该看到类似 0 0 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null 的行。
验证自动续期:可以手动模拟续期过程,观察输出和证书文件时间戳变化:
~/.acme.sh/acme.sh --cron --home ~/.acme.sh
如果输出显示 Cert success 或 Skipping, not yet due,说明续期逻辑正常。
也可以使用 --force 参数强制续期进行测试:
~/.acme.sh/acme.sh --renew -d example.com --force
续期成功后,--reloadcmd 会自动执行,Nginx 会加载新证书,无需手动操作。
避坑指南:常见错误与处理
- 80 端口被占用导致 standalone 验证失败:先停止占用端口的服务(如
systemctl stop nginx),验证完成后再启动。 - Nginx 重载失败:检查
--reloadcmd中的命令路径是否正确,确保 Nginx 有权限读取证书文件。 - 证书文件权限问题:acme.sh 生成的证书默认在用户目录下,安装到 /etc/nginx/ssl 时需确保目录存在且权限为 644。
- cron 任务未生效:确认 crontab 服务已启动,并且 acme.sh 的 cron 任务未被注释。
- Let's Encrypt 速率限制:避免频繁测试签发,每周同一域名最多 5 次。测试时可使用
--staging参数。
检查与维护建议
完成配置后,建议每月检查一次证书有效期和 cron 日志。
可以使用以下命令查看证书到期时间:
echo | openssl s_client -connect example.com:443 2>/dev/null | openssl x509 -noout -dates
如果发现证书未自动续期,优先检查 acme.sh 的日志文件 ~/.acme.sh/acme.sh.log,根据错误提示调整配置。
小结:acme.sh 通过简单的命令和自动化的 cron 任务,让 Let's Encrypt 证书续期变得轻松可靠。
只要正确安装、部署并验证,就能彻底告别证书过期警告。
如果在操作中遇到问题,请先回看避坑部分,大部分错误都能找到对应解决方案。