HTTPS 进程可能是健康的,而公共证书却临近过期、为错误的名字签发,或在另一条边缘上被不同地提供。一条有用的检查,是向公共端点索取它会给真实客户端的那张证书。
包含主机名
TLS 虚拟主机依赖服务器名称。把主机名作为 SNI 传入,并检视对端证书:
host=www.example.test
openssl s_client -connect "$host:443" -servername "$host" </dev/null 2>/dev/null \
| openssl x509 -noout -subject -issuer -dates -fingerprint -sha256
这条命令是只读的。它不会续签任何东西,也不能证明每个中间证书都被每个客户端接受。但它确实给出为该主机名呈现的证书的 not-before、not-after、subject、issuer 与指纹。
在阈值上告警
选择能留出续期失败、DNS 问题与人工响应时间的阈值。确切数字属于服务的恢复目标;并非普通的"30 天"规则就能替代这个决定。配套的TLS 过期检查会打印过期时间,并在剩余区间低于你传入的阈值时以非零退出。
尽可能从主机外部运行检查。本地进程看到的监听器、证书文件或代理路径,可能与公共网络上的访问者不同。
把观察与验证分开
SNI 用于选择虚拟主机,并不验证证书是否匹配该名称。即使 s_client 报告验证问题,这条管道也可能打印证书,而且它隐藏了标准错误。另做主机名与证书链验证,保留诊断信息并使用已知信任库。不要把这条检视管道最后一个命令的退出码当成 TLS 健康结论。
配套脚本以 OpenSSL -checkend 检查 notAfter,并不能证明主机名匹配、信任关系、吊销状态或 notBefore 已经到来。把到期告警与握手检查、续期失败告警配合使用。阈值应小于证书正常寿命,短期证书尤其如此;还应抽查相关边缘与地址族。
来源
- Caddy Automatic HTTPS,自动 TLS 证书管理,已核验 2026-10-15。
- OpenSSL
s_client文档,SNI 与证书检查选项,已核验 2026-10-15。 - OpenSSL
x509文档,证书解析、日期与指纹,已核验 2026-10-15。