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

相关推荐
tonydf14 小时前
Nginx爆新的RCE漏洞!别担心,平滑升级即可。
后端·nginx
曹牧14 小时前
Nginx 504
运维·nginx
rockmelodies17 小时前
CentOS Stream 源码编译安装 Nginx 1.31.0(静态依赖版)
运维·chrome·nginx
成为你的宁宁18 小时前
【Prometheus监控Nginx/Mysql/Redis/Docker/Rabbitmq】
mysql·nginx·prometheus
阿里-于怀18 小时前
告别 Ingress Nginx:云原生 API 网关 Gateway API 使用指引
nginx·云原生·gateway
難釋懷19 小时前
Nginx应用场景
运维·nginx
持梦远方19 小时前
Nginx 静态资源挂载与前端部署实战笔记
linux·前端·笔记·nginx
艾莉丝努力练剑19 小时前
【Linux网络】Linux 网络编程:HTTP(四)从手写服务器到生产级 Nginx 与 cpp-httplib 实战
linux·运维·服务器·网络·c++·nginx·http
Linux运维技术栈19 小时前
一次暴力枚举攻击的防御实践:从 IP 封禁到 WAF,再到 Nginx+Lua 业务层防御
tcp/ip·nginx·安全·lua·云服务器
周杰伦的稻香1 天前
Ollama访问限制
nginx·ai