linux 下用 acme.sh 搞定 Nginx 免费 SSL 证书自动续期(上)
在 Linux 下使用acme.sh为 Nginx 配置免费 SSL 证书并实现自动续期是一个非常流行且高效的方案。acme.sh是一个纯 Shell 脚本轻量且功能强大。整个流程主要分为安装、签发、部署和验证四个步骤。 第一步安装 acme.sh安装过程非常简单一条命令即可完成。acme.sh会自动将自身安装到你的家目录并配置好环境变量和默认的定时续期任务。执行安装命令请将myexample.com替换为你的邮箱用于接收证书到期通知curl https://get.acme.sh | sh -s emailmyexample.com安装完成后重新加载一下环境变量让acme.sh命令立即生效source ~/.bashrc验证安装是否成功acme.sh --version 第二步签发 SSL 证书Webroot 模式 (推荐)这种方式适用于你的服务器已经运行了 Nginx并且 80 端口可以被证书颁发机构CA访问。acme.sh会在你的网站目录下生成一个临时验证文件来完成域名所有权校验。命令示例bashacme.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 天这与 Lets Encrypt 等证书颁发机构CA的策略有关证书有效期目前 Lets Encrypt 签发的证书有效期通常为90 天。续期窗口CA 规定只能在证书生命周期的最后 30 天内进行续期。安全缓冲acme.sh设定在“到期前 30 天”更新是为了确保在第一次续期尝试失败例如网络波动、DNS 验证超时时你还有足够的时间约一个月去手动干预或让脚本在第二天再次尝试从而避免证书真正过期导致网站无法访问。3. 更新后的状态一旦续期成功新证书的有效期将从申请成功的那一刻重新计算 90 天。acme.sh会自动替换旧证书文件并执行你配置的--reloadcmd如service nginx reload让新证书立即生效。下次检查时由于新证书还有 90 天有效期远大于 30 天阈值脚本会跳过该域名继续等待下一个周期。总结你不需要手动计算时间。只要安装了acme.sh且定时任务正常它会自动在证书到期前 30 天的某个时间点取决于每天定时任务的具体执行时间完成更新实现“无感”续期。