监控多域名共用SSL证书需验证SNI匹配与证书SAN覆盖,用openssl检查证书域名列表及s_client模拟握手,确保Nginx单server块配置、路径权限正确,并脚本化主动探测告警。

监控多域名共用 SSL 证书在 Nginx 中的匹配与加载状态,核心不是看“Nginx 是否启动”,而是验证 TLS 握手阶段 SNI 是否正确触发对应证书,以及证书本身是否真实覆盖所有声明的域名。单靠 Nginx 日志或进程状态无法发现证书错配问题——浏览器报 ERR_SSL_UNRECOGNIZED_NAME_ALERT 或 NET::ERR_CERT_COMMON_NAME_INVALID 时,往往已晚。
检查证书 SAN 字段是否完整包含全部域名
这是前提。若证书没写全,再精准的配置也无效。
- 运行命令查看证书实际支持的域名:
openssl x509 -in /etc/letsencrypt/live/example.com/fullchain.pem -text -noout | grep -A1 "Subject Alternative Name" - 输出中必须显式列出所有
server_name中的域名,例如:DNS:example.com, DNS:www.example.com, DNS:api.example.com - 注意通配符限制:*.example.com 不自动包含 example.com,也不匹配二级子域如 a.b.example.com
用 openssl s_client 模拟真实 TLS 握手验证匹配
这是最直接、最可靠的监控手段,能复现浏览器行为。
- 对每个域名单独测试,强制指定 SNI:
openssl s_client -connect example.com:443 -servername example.com -showcerts 2>/dev/null | openssl x509 -noout -subject - 观察返回的 subject 和 SAN 是否与当前域名一致;多次替换
-servername参数,分别测 www.example.com、api.example.com 等 - 若返回的证书 subject 是 site-b.com,说明该域名被 fallback 到了默认 server 块,SNI 匹配失败
确认 Nginx 配置中无隐性 fallback 或证书路径冲突
多个域名共用一张 SAN 证书时,常见错误是配置结构不统一,导致部分请求被错误兜底。
- 确保只有一个 HTTPS server 块监听 443 ssl,并在其中用空格列出全部域名:
server_name example.com www.example.com api.example.com; - 禁用其他监听 443 ssl 的 server 块,否则 Nginx 可能按定义顺序 fallback 到第一个块的证书
- 检查
ssl_certificate和ssl_certificate_key路径是否可读、文件存在、权限为 600,Nginx 运行用户(如 www-data)能访问
接入轻量级主动探测做常态化监控
把上面的 openssl 测试脚本化,定时执行并告警。
- 写一个简单 Bash 脚本,循环调用
openssl s_client测每个域名,提取 CN 或 SAN 匹配结果 - 若返回证书不包含目标域名,或连接超时、握手失败,就触发邮件或钉钉告警
- 配合 cron 每 5 分钟执行一次,比依赖访问日志更早发现问题


















