监控ssl证书链完整性需外部主动探测:用openssl s_client实测链完整性和签发关系,openssl verify验证系统信任,定期检查有效期并告警,集成heartbeat或云api实现自动化闭环。

监控 SSL 证书链完整性,核心是验证客户端能否从服务器证书一路回溯到系统信任的根证书——Nginx 本身不检查也不告警,必须靠外部主动探测和脚本化验证。
用 openssl s_client 实测真实发送的证书链
这是最贴近真实客户端行为的方式,直接反映微信、安卓 WebView、curl 等是否能建立信任:
- 执行命令:
openssl s_client -connect example.com:443 -servername example.com -showcerts 2>/dev/null - 观察输出中
-----BEGIN CERTIFICATE-----出现次数:只出现 1 次 → 链不完整;出现 2 次及以上 → 至少含域名证书 + 中间证书 - 加管道快速核对签发关系:
... | grep "subject\|issuer",第一段 subject 应为你的域名,第二段 issuer 应与之匹配
用 openssl verify 检查证书文件是否可被系统信任
该命令模拟系统根证书库(如 /etc/ssl/certs/ca-certificates.crt)做链回溯验证:
- 运行:
openssl verify -CAfile /etc/ssl/certs/ca-certificates.crt /path/to/fullchain.pem - 返回
OK表示链完整且可信;若报unable to get issuer certificate,说明中间证书缺失或顺序错误 - 注意:
fullchain.pem必须按“域名证书 → 中间证书”顺序排列,不能含私钥、空行或根证书
定期检查有效期并自动告警
证书过期常伴随链问题,需提前干预(建议 15 天预警):
- 提取到期时间并转为秒数:
openssl x509 -in fullchain.pem -noout -enddate | awk '{print $4, $5, $7}' | xargs -I{} date -d "{}" +%s 2>/dev/null - 与当前时间比较:
echo $(( (EXPIRE_TS - $(date +%s)) / 86400 )),结果小于 15 就触发邮件或企业微信通知 - 把逻辑写入 cron 脚本,每 6 小时执行一次,避免凌晨过期无人响应
集成到可观测平台实现长期闭环
手动检查不可持续,推荐轻量级自动化方案:
- 用
Elastic Heartbeat或cipherscan主动探测 HTTPS 端点,采集证书信息并上报至 Prometheus - 调用腾讯云 API
CheckCertificateChain接口,传入 Base64 编码的证书链字符串,获取IsValid和IsTrustedCA结果 - 结合
spatie/ssl-certificate(PHP)或自研 Python 脚本,统一管理多个域名,生成日报并标记风险项











