欢迎光临
我们一直在努力

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

在 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 的配置中,.pem 和 .cer(或者 yourdomain.com.cer)在本质上没有任何区别,它们通常都是 PEM 格式的文本文件(即 Base64 编码的文本)。

        你可以放心地将命令中的后缀从 .cer 改为 .pem,这不仅可行,而且是更标准、更推荐的做法。

        你可以直接将命令修改为如下形式(仅修改了文件后缀):

        sudo acme.sh –install-cert -d yourdomain.com \\
        –key-file /etc/nginx/ssl/yourdomain.com.key \\
        –fullchain-file /etc/nginx/ssl/yourdomain.com.pem \\ # 这里改为了 .pem
        –reloadcmd "systemctl reload nginx"

  • 修改 Nginx 配置文件,启用 HTTPS: 编辑你的站点配置文件(如 /etc/nginx/conf.d/yourdomain.com.conf),添加或修改 server 块

    # 1. HTTP 服务器配置:强制跳转 HTTPS
    server {
    listen 80;
    server_name chxi.ltd; # 替换为你的域名或IP

    # 所有 HTTP 请求 301 重定向到 HTTPS
    return 301 https://$host$request_uri;
    }

    # 2. HTTPS 服务器配置:核心 SSL 设置
    server {
    listen 443 ssl http2; # 开启 SSL 并启用 HTTP/2 (提升性能)
    server_name chxi.ltd; # 替换为你的域名

    # — 证书配置 (核心) —
    ssl_certificate /etc/nginx/ssl/chxi.ltd.cer; # 证书文件路径
    ssl_certificate_key /etc/nginx/ssl/chxi.ltd.key; # 私钥文件路径

    # — 安全优化配置 (推荐) —
    ssl_session_timeout 5m;
    ssl_session_cache shared:SSL:10m;
    ssl_session_tickets off;

    # 仅启用安全的 TLS 协议 (禁用 TLS 1.0/1.1)
    ssl_protocols TLSv1.2 TLSv1.3;

    # 加密套件配置
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
    ssl_prefer_server_ciphers on;

    # — 网站根目录配置 —
    location / {
    root /usr/share/nginx/html; # 你的网站文件目录
    index index.html index.htm;
    }
    }

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

    本文亲自在腾讯云上实验.

    【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中

    yum list 只显示最新版本。要查看所有历史版本,必须加上 –showduplicates 参数。

    1yum list nginx –showduplicates

    nginx 默认显示的版本只有1.14.

    可以根据下面配置进行更新

  • 创建官方源配置文件:bash vi /etc/yum.repos.d/nginx.repo
  • 粘贴以下内容(启用稳定版本,如果要主线版本, 把mainline下的 enabled设置为1): [nginx-stable]
    name=nginx stable repo
    baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
    gpgcheck=1
    enabled=1
    gpgkey=https://nginx.org/keys/nginx_signing.key
    module_hotfixes=true

    [nginx-mainline]
    name=nginx mainline repo
    baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
    gpgcheck=1
    enabled=0
    gpgkey=https://nginx.org/keys/nginx_signing.key
    module_hotfixes=true

  • 再次查询版本: 此时再运行 yum list nginx –showduplicates,你应该就能看到最新的版本了。
  • 赞(0)
    未经允许不得转载:171主机测评 » linux 下用 acme.sh 搞定 Nginx 免费 SSL 证书自动续期(上)
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址