Nginx无法记录证书过期的非法访问,因TLS握手失败于HTTP请求前,access_log无记录;有效方式是前置监控,如openssl检查、Certbot自动续期和SSL Labs实时告警。

不能通过 Nginx 日志直接审计“使用过期或无效证书的非法访问尝试”。
浏览器拦截发生在 TLS 握手阶段,Nginx 无法记录这类请求
当客户端(如浏览器)检测到服务器证书过期、域名不匹配、签名无效或根证书不受信时,TLS 握手会在 TCP 连接建立后、HTTP 请求发出前就失败。此时:
- Nginx 根本收不到任何 HTTP 请求,access_log 完全不会记录这一连接;
- error_log 中通常也不会出现对应错误(除非配置了 debug 级别且日志中出现 SSL handshake failed 类提示);
- 用户看到的是浏览器原生警告页(如 “NET::ERR_CERT_DATE_INVALID”),流量未进入 Nginx 应用层。
真正能被 Nginx 日志捕获的,是“已成功建立 HTTPS 连接后的异常行为”
只有 TLS 握手成功,后续 HTTP 请求才会被记录。此时可关注以下线索,间接识别高风险或异常访问模式:
- 大量 499 状态码:表示客户端在 Nginx 返回响应前主动关闭连接——可能因页面加载中途触发证书警告而放弃;
- 高频 /favicon.ico 或 /robots.txt 的 404/403 请求:来自自动化扫描器或爬虫,常伴随 User-Agent 异常(如无 UA、含 sqlmap/nikto 等关键词);
- 非标准 TLS Client Hello 特征:虽不体现在 access_log,但若启用 OpenSSL debug 日志或配合 tcpdump 抓包,可发现使用老旧协议(SSLv3/TLS 1.0)、异常 SNI 域名或自定义 cipher suite 的连接——这些往往与证书探测或中间人测试相关。
更有效的证书有效性监控方式
与其依赖日志“事后审计”,不如前置预警和主动验证:
- 用 openssl s_client -connect yoursite.com:443 -servername yoursite.com 2>/dev/null | openssl x509 -noout -dates 定期检查证书有效期;
- 部署 Certbot 自动续期 + cron 定时任务,并添加 --deploy-hook 执行通知(如发邮件、写入监控平台);
- 使用外部服务如 SSL Labs (ssllabs.com) 或自建 Prometheus + blackbox_exporter 对 443 端口做 TLS 检查,实时告警过期、链路断裂等问题。
补充说明:Nginx 本身不校验自己证书是否过期
Nginx 只负责将证书文件原样发送给客户端。它不验证证书时间、吊销状态或信任链——这些全部由客户端完成。因此,“Nginx 日志中出现证书过期访问”这个前提本身不成立。


















