HTTPS 进程可能是健康的,而公共证书却临近过期、为错误的名字签发,或在另一条边缘上被不同地提供。一条有用的检查,是向公共端点索取它会给真实客户端的那张证书。

公共主机名通过 SNI 选择证书。观察到的 subject、issuer、指纹、notBefore 与 notAfter 都是证据,不是验证结果。剩余时间与按服务恢复目标选择、且小于正常证书寿命的阈值比较。另行检查主机名、证书链与信任库、notBefore 和吊销状态,并保留诊断信息。管道可能打印证书却隐藏验证错误,因此最后一个命令的退出码不能证明 TLS 健康。
先检视真实客户端看到的证书,再独立验证。到期告警应使用服务自己的响应阈值,配合握手检查、续期失败告警,以及相关边缘和地址族抽查。

包含主机名

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 已经到来。把到期告警与握手检查、续期失败告警配合使用。阈值应小于证书正常寿命,短期证书尤其如此;还应抽查相关边缘与地址族。

来源