HTTPS 证书到期前怎么自动续期?Nginx + Let's Encrypt(certbot)完整流程
HTTPS 证书到期前怎么自动续期?Nginx + Let's Encrypt(certbot)完整流程
很多站长第一次上 HTTPS,是“手动申请一次证书 → 过 90 天忘了续 → 浏览器红警”。Let’s Encrypt 证书有效期短,但它的设计思路就是让你用自动化续期来解决。
这篇文章给你一套可复制的流程:
- Nginx 网站如何用 certbot 申请证书
- 如何验证自动续期是否真的生效
- 续期后如何自动 reload Nginx
- 常见报错怎么排(80 端口占用、校验失败、重定向循环等)
适用:Ubuntu/Debian/CentOS(系统命令略有差异),以及宝塔/1Panel/原生 Nginx 环境。
1)先确认你的域名解析与端口
在开始前,先确认两点:
- 域名 A/AAAA 记录已解析到服务器公网 IP
- 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”。
你按本文跑通后,后面基本不需要再管证书到期的问题了。
