先说结论:SSL/TLS 证书过期时,先确认访问的域名、服务器时间、实际返回证书、证书链和终止 TLS 的节点,再续期并部署。签发成功不等于线上已生效:CDN、负载均衡、反向代理和多台源站都可能仍在使用旧证书。正确闭环是“诊断 → 备份 → 续期 → 配置检查 → 平滑加载 → 外部验证 → 自动化和告警”,不要直接运行来源不明的远程脚本。

先判断到底哪里出错
浏览器显示证书错误,不一定只有“过期”这一种原因。先检查:
- 有效期:当前时间是否晚于 Not After,服务器与客户端时间是否准确;
- 域名:访问域名是否包含在证书 SAN 中,是否误用了别的站点证书;
- 证书链:服务端是否发送正确的中间证书链;
- 部署节点:CDN、WAF、负载均衡、Nginx、Ingress 或应用谁在终止 TLS;
- 解析:IPv4、IPv6 和不同地区 DNS 是否指向不同旧节点;
- 客户端:只有特定老设备失败时,检查信任链和协议兼容性。
可从外部查看线上实际返回的证书:
openssl s_client -connect example.com:443 -servername example.com -showcerts </dev/null
再核对本地证书文件:
openssl x509 -in /path/to/fullchain.pem -noout -subject -issuer -dates -ext subjectAltName
不要在聊天、工单或命令输出中复制私钥内容。
证书过期后的应急顺序
- 记录告警时间、影响域名、用户范围和当前证书指纹;
- 确认 DNS、CDN、负载均衡和所有源站清单;
- 备份当前证书文件、Web 配置和自动续期配置;
- 用原来的受控 ACME 客户端或证书平台续期,避免临时更换整套工具;
- 在测试路径验证新证书的域名、链、私钥匹配和有效期;
- 先执行服务配置检查,再平滑 reload;
- 从不同网络和 IPv4/IPv6 外部验证每个域名;
- 修复自动化根因,补告警并记录事件复盘。
HTTP-01 与 DNS-01 怎么选?
| 方式 | 适合 | 关键限制 |
|---|---|---|
| HTTP-01 | 普通单域名网站,80 端口可从公网访问 | 通过 80 端口验证,不能签发通配符证书 |
| DNS-01 | 通配符、内网源站、多入口或不能开放 80 | 需安全更新 DNS TXT,传播和权限要管理 |
| 平台托管证书 | CDN、负载均衡或托管平台终止 TLS | 确认续期是否自动、源站证书是否仍需维护 |
Let’s Encrypt 挑战类型文档说明了 HTTP-01 与 DNS-01 的机制和限制。DNS API 凭据应只允许修改必要记录,尽量使用单独、范围受限的凭据,不能把全局主账号密钥散落在服务器脚本里。
续期前必须检查什么?
- 域名 A、AAAA、CNAME 是否仍指向当前验证入口;
- 80/443 端口、安全组、防火墙和反向代理是否允许需要的流量;
- CAA 是否允许当前 CA 签发;
- ACME 账户、续期配置、DNS 插件和凭据权限是否正常;
- 是否触发 CA 速率限制,失败时不要无休止重复请求;
- 服务器磁盘、时间同步和文件权限是否正常;
- 通配符与普通域名是否在同一证书中被正确管理。

Nginx 部署新证书的安全示例
路径因系统和 ACME 客户端而异,先确认 Nginx 配置引用的真实文件。部署前检查证书与私钥是否匹配,不要输出私钥:
openssl x509 -in /path/to/fullchain.pem -pubkey -noout | openssl sha256
openssl pkey -in /path/to/privkey.pem -pubout | openssl sha256
两个摘要一致后,检查配置并平滑加载:
sudo nginx -t
sudo systemctl reload nginx
不要为了更新证书直接重启整台服务器。若配置检查失败,保留旧服务运行,修复错误后再 reload。证书和私钥文件权限应满足运行服务的最小读取需求,不能机械地对所有环境套用一个权限数值。
怎样验证已经恢复?
至少从服务器外部验证以下内容:
- 每个正式域名和别名都返回新证书;
- 证书 SAN、签发者、有效期和完整链正确;
- IPv4 与 IPv6、主要地区、CDN 与直连路径一致;
- 所有负载均衡后端和多台 Web 节点都已部署;
- 页面、API、回调、WebSocket 和移动客户端可正常建立 TLS;
- HTTP 到 HTTPS 跳转与 HSTS 没有制造循环或锁死错误域名。
浏览器正常只是一个样本。多节点环境可临时逐个指向节点测试,完成后恢复正常 DNS 或负载均衡配置。
Certbot 自动续期怎样做?
先查看当前证书和续期配置,再做测试续期:
sudo certbot certificates
sudo certbot renew --dry-run
如果证书更新后需要让服务加载新文件,应使用受控的部署钩子。Certbot 官方文档说明,deploy hook 只在成功续期后执行:
sudo certbot renew --deploy-hook "/usr/local/sbin/reload-web-after-cert-renewal"
钩子脚本应先执行配置检查,成功后才 reload,并把失败发送到监控。不要让 cron 每次都无条件重启 Web 服务,也不要把未经审计的网络脚本通过 curl | bash 或 wget | bash 交给 root。
多节点、CDN 与负载均衡怎么处理?
先维护 TLS 终止点清单,逐项明确证书所有者和续期方式:
- 若 CDN 终止 TLS,检查 CDN 边缘证书和 CDN 到源站证书;
- 若负载均衡终止 TLS,证书可能应部署在负载均衡而非每台源站;
- 若每台源站终止 TLS,需可靠分发并确认全部节点加载;
- Kubernetes/Ingress 应检查 Secret、控制器和证书管理器状态;
- 不能把同一私钥无限复制到未知节点,应有密钥轮换和访问审计。
发布流程应把证书部署、配置验证和服务 reload 作为一个可回退步骤,参考服务器部署与上线检查。
证书监控与告警怎样设置?
- 从外部按域名和 SNI 探测线上证书,而非只读本地文件;
- 按不同提前量分级告警,并确保负责人真正收到;
- 监控续期任务退出码、日志、下一次计划时间和部署钩子;
- 对 DNS、ACME API、时间同步、80/443 和配置检查建立监控;
- 定期演练 dry-run 与真实部署流程,避免到期前才发现凭据失效。
可按网站与服务器监控指南建立域名、证书和服务告警。
复盘要解决哪些根因?
过期只是结果。根因可能是 DNS 凭据过期、80 端口被拦、定时器停用、部署钩子失败、证书续期了但服务没加载、旧节点没下线、告警无人接收或资产清单缺失。复盘应记录时间线、影响、检测方式、恢复动作、根因、纠正措施、负责人和期限。
需要更换或新购服务器吗?
单纯证书过期通常不需要换服务器。若同时存在系统停止维护、控制面失效、无法自动化、磁盘不足或旧环境无法安全升级,应先备份并验证恢复,再评估迁移。可参考云服务器长期运行评估与备份恢复指南。需要新建迁移目标时,再到萤光云 VPS 产品页核对当前节点和配置。
常见问题
续期成功但浏览器仍显示旧证书怎么办?
检查 Nginx 实际引用路径、服务是否 reload、CDN/负载均衡是否终止 TLS、是否有旧节点,以及 IPv4/IPv6 是否指向不同机器。
能删除旧证书后重新签发吗?
不要先删除。先备份并找出续期失败原因;盲目重签可能触发限制并失去快速回退能力。
证书续期后需要清 CDN 缓存吗?
TLS 证书通常由连接终止节点管理,不依赖普通页面缓存。应在 CDN 控制台更新或确认托管证书状态,而不是把清缓存当作通用修复。







