雷灵模板

HTTPS 证书到期前怎么自动续期?Nginx + Let's Encrypt(certbot)完整流程

avatar

雷灵

🤖AI摘要
文章说明Let’s Encrypt证书需自动续期以避免过期,给出在Nginx上完整流程:先确认域名解析和80 443端口放行,安装certbot,使用Nginx插件或webroot签发证书并配置HTTPS,提供推荐的Nginx模板。随后通过续期测试与定时任务确保自动续期后自动reload,并提示排查端口占用、校验失败、重定向循环等常见问题,适用于多种系统和面板环境。

HTTPS 证书到期前怎么自动续期?Nginx + Let's Encrypt(certbot)完整流程

很多站长第一次上 HTTPS,是“手动申请一次证书 → 过 90 天忘了续 → 浏览器红警”。Let’s Encrypt 证书有效期短,但它的设计思路就是让你用自动化续期来解决。

这篇文章给你一套可复制的流程:

  • Nginx 网站如何用 certbot 申请证书
  • 如何验证自动续期是否真的生效
  • 续期后如何自动 reload Nginx
  • 常见报错怎么排(80 端口占用、校验失败、重定向循环等)

适用:Ubuntu/Debian/CentOS(系统命令略有差异),以及宝塔/1Panel/原生 Nginx 环境。


1)先确认你的域名解析与端口

在开始前,先确认两点:

  1. 域名 A/AAAA 记录已解析到服务器公网 IP
  2. 80/443 端口在安全组/防火墙已放行

快速自检:

# 本机检查 Nginx 是否在监听
ss -lntp | egrep ':80|:443'

# 远端可用时(可选)
# curl -I http://你的域名

2)安装 certbot(推荐官方源 / snap)

不同系统安装方式不同。以下以 Ubuntu/Debian 常见方式为例:

方案 A:snap(较新、较稳)

sudo apt update
sudo apt install -y snapd
sudo snap install core; sudo snap refresh core
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot

方案 B:apt(版本可能略旧)

sudo apt update
sudo apt install -y certbot python3-certbot-nginx

如果你打算让 certbot 自动改 Nginx 配置,装 python3-certbot-nginx 会更省事。


3)签发证书:两种主流方式

方式 1:Nginx 插件(最省事)

certbot 会自动改你的 server 配置,并配置 301 跳转:

sudo certbot --nginx -d example.com -d www.example.com

按提示输入邮箱、同意条款即可。

方式 2:webroot(更可控,适合复杂反代/多站点)

前提:你知道网站根目录(能放 .well-known/acme-challenge/)。

sudo certbot certonly --webroot   -w /var/www/html   -d example.com -d www.example.com

签发成功后,你需要自己在 Nginx 里引用证书路径:

ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

4)Nginx 推荐 HTTPS 配置模板(可直接套用)

下面是一个比较常见、可用性不错的模板(你按需改域名和路径即可):

server {
    listen 80;
    server_name example.com www.example.com;

    # Let’s Encrypt 校验路径(webroot/插件都会用到)
    location ^~ /.well-known/acme-challenge/ {
        root /var/www/html;
    }

    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    server_name example.com www.example.com;

    ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    # 现代浏览器常用的 TLS 配置(可按需微调)
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers off;

    # 你的站点配置
    root /var/www/html;
    index index.html index.htm;

    location / {
        try_files $uri $uri/ =404;
    }
}

5)让“自动续期”真正生效:测试 + 定时器

5.1 先做一次 dry-run(强烈建议)

sudo certbot renew --dry-run

这一步能提前发现:80 端口校验失败、Nginx 配置不通、DNS 解析不对等问题。

5.2 定时续期(两种方式)

很多系统安装后已经自带 systemd timer,你可以先确认:

systemctl list-timers | grep certbot || true

如果没有 timer,你也可以用 cron:

sudo crontab -e
# 每天凌晨 3:15 尝试续期(Let’s Encrypt 不会每次都签发,只有临近到期才会续)
15 3 * * * certbot renew --quiet

6)关键:续期后自动 reload Nginx(否则新证书不生效)

证书续上了,但 Nginx 不 reload,线上可能仍然在用旧证书。

推荐用 deploy-hook:

sudo certbot renew --deploy-hook "systemctl reload nginx"

如果你是宝塔/面板管理的 Nginx,不一定是 systemd 的 nginx 服务名,你可以改成实际可用的 reload 命令。


7)常见问题排错(最实用的几条)

7.1 80 端口被占用(校验失败)

ss -lntp | grep ':80'

如果是其他服务占用了 80(比如另一个 Nginx/Apache/面板),先统一入口,避免抢端口。

7.2 HTTP-01 校验 404 / 403

重点检查:

  • .well-known/acme-challenge/ 是否被你强制跳 HTTPS 或被权限拦截
  • root 是否指向正确目录
  • CDN 是否把校验请求缓存/拦了

7.3 续期成功但浏览器仍提示过期

  • 执行:nginx -t && systemctl reload nginx
  • 清理 CDN 缓存(如果有)
  • 用在线工具查看证书链是否更新(或用 openssl s_client 本地看)

结语

Let’s Encrypt + certbot 的正确姿势就是“签发一次 + 自动续期 + 自动 reload”。

你按本文跑通后,后面基本不需要再管证书到期的问题了。


相关阅读

黔ICP备2022004976号
powered by 雷灵模板