HTTPS证书快过期别等用户打不开:Nginx + Certbot 自动续期排查实战
2026/8/6 5:58:04 网站建设 项目流程

网站 HTTPS 证书过期,是非常典型的“小问题拖成生产事故”。证书一过期,用户浏览器会出现安全警告,API 调用可能失败,小程序、App、支付回调、Webhook 都可能受影响。更麻烦的是,很多证书其实已经续期成功,但 Nginx、负载均衡或 CDN 仍在使用旧证书,最终表现还是“用户打不开”。

本文按生产排查顺序写:先确认当前线上证书到期时间,再检查 Certbot 自动续期,接着验证 Nginx 配置和 reload,最后排查 CDN、负载均衡、多台服务器和权限问题。适用于腾讯云、阿里云、AWS、Azure、Oracle Cloud、普通 VPS 上的 Nginx HTTPS 站点。

参考来源:

  • Certbot 官方 User Guide:https://eff-certbot.readthedocs.io/en/stable/using.html
  • Nginx 官方 HTTPS 配置文档:https://nginx.org/en/docs/http/configuring_https_servers.html
  • 腾讯云 Nginx 服务器 SSL 证书安装部署:https://cloud.tencent.com/document/product/400/35244
  • Let’s Encrypt FAQ:https://letsencrypt.org/docs/faq/

1. 先看线上证书,而不是只看服务器文件

第一步从外部检查域名当前返回的证书:

DOMAIN=example.comecho|openssl s_client-connect${DOMAIN}:443-servername${DOMAIN}2>/dev/null|openssl x509-noout-subject-issuer-dates

重点看:

notBefore=... notAfter=... subject=... issuer=...

如果notAfter已经很近,说明线上证书确实快到期。注意这里查的是用户真实访问到的证书,比你在服务器目录里看到的文件更可靠。

2. 查 Certbot 管理了哪些证书

如果使用 Certbot:

sudocertbot certificates

你会看到证书名称、域名列表、到期时间、证书路径和私钥路径。典型输出包括:

Certificate Name: example.com Domains: example.com www.example.com Expiry Date: 2026-09-10 Certificate Path: /etc/letsencrypt/live/example.com/fullchain.pem Private Key Path: /etc/letsencrypt/live/example.com/privkey.pem

Certbot 官方文档说明,certbot reconfigure可用于更改证书续期选项,并通过测试续期验证新选项,成功后应用到后续续期。生产环境不要随便改 renewal 配置,先做 dry-run。

3. 先 dry-run,不要直接正式续期

sudocertbot renew --dry-run

如果成功,说明 ACME 验证链路基本可用。
如果失败,常见原因包括:

  • 80端口没有开放。
  • DNS解析到错误机器。
  • Nginx 没有把/.well-known/acme-challenge/放行。
  • Webroot 路径错误。
  • Cloudflare/CDN/WAF 拦截了验证请求。
  • 机器时间不准。
  • 续期配置里的域名已经不用或解析已变化。

4. 正式续期后,必须确认 Nginx 加载新证书

正式续期:

sudocertbot renew

然后检查 Nginx:

sudonginx-tsudosystemctl reload nginx

Nginx 官方 HTTPS 配置文档说明,HTTPS server 需要在 server block 中启用ssl监听,并指定ssl_certificatessl_certificate_key。也就是说,Nginx 实际加载哪个证书,取决于配置文件里写的路径。

示例:

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; location / { proxy_pass http://127.0.0.1:3000; } }

如果 Nginx 配置指向的是旧目录,比如/usr/local/nginx/conf/cert/example.crt,而 Certbot 更新的是/etc/letsencrypt/live/example.com/fullchain.pem,续期成功也不会生效。

5. 自动续期要看 systemd timer 或 cron

很多 Linux 发行版通过 systemd timer 管理 Certbot 自动续期:

systemctl list-timers|grepcertbot systemctl status certbot.timer journalctl-ucertbot.timer-n50--no-pager journalctl-ucertbot.service-n100--no-pager

也有机器用 cron:

sudocrontab-lls-lah/etc/cron.d/grep-R"certbot"/etc/cron*2>/dev/null

如果没有自动续期任务,就要补上。Certbot 安装方式不同,系统默认行为可能不同,不要假设“装了就会自动续”。

6. 续期后自动 reload Nginx

推荐使用 deploy hook,只在证书实际更新后执行 reload:

sudocertbot renew --deploy-hook"systemctl reload nginx"

如果写入配置,可创建:

sudomkdir-p/etc/letsencrypt/renewal-hooks/deploysudotee/etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh>/dev/null<<'EOF' #!/bin/sh nginx -t && systemctl reload nginx EOFsudochmod+x /etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh

然后再跑:

sudocertbot renew --dry-run

7. 腾讯云/手动证书场景

如果证书来自腾讯云 SSL 证书控制台,部署到 Nginx 时通常需要下载 Nginx 证书包,将证书文件和私钥上传到服务器,并在 Nginx 配置中指定路径。腾讯云文档也提醒,安装证书前需要开启 HTTPS 默认端口 443。

手动证书的常见问题:

  • 证书文件和私钥不匹配。
  • 证书链不完整。
  • 443端口未开放。
  • 配置后没有nginx -t
  • 修改配置后没有 reload。
  • 多台服务器只更新了一台。
  • CDN或负载均衡还在用旧证书。

私钥文件权限建议严格限制:

sudochownroot:root /path/to/private.keysudochmod600/path/to/private.key

8. CDN、负载均衡和多台服务器要单独排查

如果网站前面有 CDN、WAF、负载均衡,用户看到的证书不一定来自源站 Nginx。

排查顺序:

  1. 查浏览器看到的证书颁发者和到期时间。
  2. 绕过 CDN 查源站证书。
  3. 查负载均衡 HTTPS 监听证书。
  4. 查每台后端服务器 Nginx 证书。
  5. 确认证书更新后是否同步到所有入口。

绕过 CDN 可以临时指定 Host:

curl-vk--resolveexample.com:443:1.2.3.4 https://example.com/

这里的1.2.3.4替换成源站 IP。

9. 最终验证

外部验证:

DOMAIN=example.comecho|openssl s_client-connect${DOMAIN}:443-servername${DOMAIN}2>/dev/null|openssl x509-noout-issuer-subject-datescurl-Ihttps://${DOMAIN}

Nginx验证:

sudonginx-tsudosystemctl status nginx --no-pagersudotail-n50/var/log/nginx/error.log

业务验证:

  • 首页能打开。
  • 登录接口正常。
  • API 回调正常。
  • 小程序/App 无证书错误。
  • CDN缓存刷新后仍正常。
  • 监控没有 5xx 异常。

10. 预防清单

建议至少做这些:

  • 证书到期前30天告警。
  • 每周自动检查一次线上证书notAfter
  • Certbot dry-run 纳入巡检。
  • deploy hook 中执行nginx -t && reload
  • CDN/负载均衡证书到期也纳入监控。
  • 证书路径、域名、续期方式写入运维文档。
  • 多台服务器统一证书分发或统一在入口层终止 TLS。

HTTPS 证书续期不是一次性配置,而是长期运维流程。真正可靠的做法,是把“证书到期时间、自动续期、Nginx reload、CDN/负载均衡同步、外部验证”连成闭环。这样即使证书30天后才到期,也能提前发现问题,而不是等用户截图告诉你网站打不开。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询