在 Linux 下使用 acme.sh 为 Nginx 配置免费 SSL 证书并实现自动续期,是一个非常流行且高效的方案。acme.sh 是一个纯 Shell 脚本,轻量且功能强大。
整个流程主要分为 安装 、签发 、部署 和 验证 四个步骤。
🚀 第一步:安装 acme.sh
安装过程非常简单,一条命令即可完成。acme.sh 会自动将自身安装到你的家目录,并配置好环境变量和默认的定时续期任务。
-
执行安装命令(请将
my@example.com替换为你的邮箱,用于接收证书到期通知):curl https://get.acme.sh | sh -s email=my@example.com -
安装完成后,重新加载一下环境变量,让
acme.sh命令立即生效source ~/.bashrc -
验证安装是否成功
acme.sh --version
📜 第二步:签发 SSL 证书
Webroot 模式 (推荐)
这种方式适用于你的服务器已经运行了 Nginx,并且 80 端口可以被证书颁发机构(CA)访问。acme.sh 会在你的网站目录下生成一个临时验证文件来完成域名所有权校验。
-
命令示例 :bash
acme.sh --issue -d yourdomain.com -d www.yourdomain.com --webroot /var/www/html-d: 指定你的域名,可以指定多个(如主域名和 www 子域名)。--webroot: 指定你网站的根目录,acme.sh会在此目录下创建验证文件夹。
第三步:安装并配置 Nginx
证书签发成功后,文件会保存在 ~/.acme.sh/yourdomain.com/ 目录下。但生产环境不建议直接使用此路径,应通过 --install-cert 命令将证书复制到指定位置,并配置 Nginx 在续期后自动重载。
-
创建 SSL 证书存放目录(如果不存在)
sudo mkdir -p /etc/nginx/ssl -
执行安装命令
sudo acme.sh --install-cert -d yourdomain.com \ --key-file /etc/nginx/ssl/yourdomain.com.key \ --fullchain-file /etc/nginx/ssl/yourdomain.com.cer \ --reloadcmd "systemctl reload nginx"--key-file: 指定私钥文件的目标路径。--fullchain-file: 指定完整证书链文件的目标路径。--reloadcmd: 关键命令,指定证书更新后要执行的命令,这里设置为重载 Nginx,实现无缝续期。
-
修改 Nginx 配置文件 ,启用 HTTPS:
编辑你的站点配置文件(如
/etc/nginx/conf.d/yourdomain.com.conf),添加或修改server块server { listen 443 ssl http2; server_name yourdomain.com www.yourdomain.com; ssl_certificate /etc/nginx/ssl/yourdomain.com.cer; ssl_certificate_key /etc/nginx/ssl/yourdomain.com.key; # ... 其他 SSL 相关配置 ... # ... 你的网站其他配置 ... } # 可选:将 HTTP 请求重定向到 HTTPS server { listen 80; server_name yourdomain.com www.yourdomain.com; return 301 https://$host$request_uri; } -
测试并重载 Nginx 配置
sudo nginx -t sudo systemctl reload nginx
🔁 第四步:验证自动续期
acme.sh 在安装时会自动创建一个 cron 定时任务,检查证书有效期,并在证书到期前(通常是60天)自动续期。通常情况下,acme.sh 在安装时会自动为你配置好定时任务(Cron Job),无需手动干预。
-
检查定时任务 :
你可以使用
crontab -l命令查看是否已存在acme.sh的任务。 -
手动触发续期测试 :
如果你想立即测试续期流程是否顺畅,可以强制续期
sudo acme.sh --renew -d yourdomain.com --force如果一切正常,Nginx 会自动重载,网站将使用新证书,整个过程无需人工干预。
完成以上所有步骤后,你的 Nginx 服务器就已经配置好了免费的 SSL 证书,并且可以永久自动续期了。
如果你不做任何额外配置,acme.sh 默认的自动续期机制会在证书到期前 30 天触发更新。
以下是关于这一机制的详细解释:
1. 核心机制:30天阈值
虽然 acme.sh 的定时任务(Cron Job)默认是每天运行一次检查,但它不会每天都去申请新证书。
- 检查频率:每天一次(默认在凌晨 0 点)。
- 触发条件 :只有当证书的剩余有效期少于 30 天时,它才会真正执行续期操作。
2. 为什么要提前 30 天?
这与 Let's Encrypt 等证书颁发机构(CA)的策略有关:
- 证书有效期 :目前 Let's Encrypt 签发的证书有效期通常为 90 天。
- 续期窗口:CA 规定只能在证书生命周期的最后 30 天内进行续期。
- 安全缓冲 :
acme.sh设定在"到期前 30 天"更新,是为了确保在第一次续期尝试失败(例如网络波动、DNS 验证超时)时,你还有足够的时间(约一个月)去手动干预或让脚本在第二天再次尝试,从而避免证书真正过期导致网站无法访问。
3. 更新后的状态
一旦续期成功:
- 新证书的有效期将从申请成功的那一刻重新计算 90 天。
acme.sh会自动替换旧证书文件,并执行你配置的--reloadcmd(如service nginx reload)让新证书立即生效。- 下次检查时,由于新证书还有 90 天有效期(远大于 30 天阈值),脚本会跳过该域名,继续等待下一个周期。
总结
你不需要手动计算时间。只要安装了 acme.sh 且定时任务正常,它会自动在证书到期前 30 天的某个时间点(取决于每天定时任务的具体执行时间)完成更新,实现"无感"续期。