linux 下用 acme.sh 搞定 Nginx 免费 SSL 证书自动续期(上)

在 Linux 下使用 acme.sh 为 Nginx 配置免费 SSL 证书并实现自动续期,是一个非常流行且高效的方案。acme.sh 是一个纯 Shell 脚本,轻量且功能强大。

整个流程主要分为 安装签发部署验证 四个步骤。

🚀 第一步:安装 acme.sh

安装过程非常简单,一条命令即可完成。acme.sh 会自动将自身安装到你的家目录,并配置好环境变量和默认的定时续期任务。

  1. 执行安装命令(请将 my@example.com 替换为你的邮箱,用于接收证书到期通知):

    复制代码
    curl https://get.acme.sh | sh -s email=my@example.com
  2. 安装完成后,重新加载一下环境变量,让 acme.sh 命令立即生效

    复制代码
    source ~/.bashrc
  3. 验证安装是否成功

    复制代码
    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 在续期后自动重载。

  1. 创建 SSL 证书存放目录(如果不存在)

    复制代码
    sudo mkdir -p /etc/nginx/ssl
  2. 执行安装命令

    复制代码
    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,实现无缝续期。
  3. 修改 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;
    }
  4. 测试并重载 Nginx 配置

    复制代码
    sudo nginx -t
    sudo systemctl reload nginx

🔁 第四步:验证自动续期

acme.sh 在安装时会自动创建一个 cron 定时任务,检查证书有效期,并在证书到期前(通常是60天)自动续期。通常情况下,acme.sh 在安装时会自动为你配置好定时任务(Cron Job),无需手动干预。

  1. 检查定时任务

    你可以使用 crontab -l 命令查看是否已存在 acme.sh 的任务。

  2. 手动触发续期测试

    如果你想立即测试续期流程是否顺畅,可以强制续期

    复制代码
    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 天的某个时间点(取决于每天定时任务的具体执行时间)完成更新,实现"无感"续期。

相关推荐
大阿明3 小时前
使用vite打包并部署vue项目到nginx
前端·vue.js·nginx
wzb563 小时前
把 Vim 打造成 Nginx 开发 / 调试 IDE(WSL Ubuntu 完整教程)
linux·ide·nginx·ubuntu·vim·c/c++
FreeBuf_4 小时前
Nginx-UI 备份恢复漏洞 PoC 公开:攻击者可篡改加密备份并注入恶意配置
运维·nginx·ui
014-code4 小时前
Nginx 反代与 WebSocket 常见坑排查清单
websocket·nginx
老虎06274 小时前
Nginx
运维·nginx
chxii16 小时前
Nginx性能优化-压缩(返回头报文介绍)
运维·nginx·性能优化
chxii1 天前
Nginx性能优化-压缩
运维·nginx
RDCJM1 天前
nginx 代理 redis
运维·redis·nginx
J2虾虾2 天前
Caddy GO语言写的Nginx平替
nginx·caddy