nginx ssl握手失败不直接报错,需通过info级error_log捕获ssl模块错误码(如error:1408f10b)、上下文线索(如no shared cipher、version too low)及触发点(如tls_process_client_hello)定位协议/套件不匹配、证书链缺失、sni未启用等问题。

SSL 握手失败时,Nginx error_log 通常不会直接打印“SSL handshake failed”这类明确提示,而是通过特定错误码、模块标识和上下文线索间接反映问题。能否快速定位,关键在于日志级别设置、错误来源识别,以及对 OpenSSL 错误码的解读。
确保 error_log 能捕获 SSL 层错误
Nginx 默认的 error_log 级别(如 error 或 warn)可能遗漏部分 SSL 握手细节。SSL 相关错误多由 ngx_ssl_module 或底层 OpenSSL 触发,需至少设为 info 级别才能看到关键信息:
- 在
http、stream或server块中显式配置:error_log /var/log/nginx/ssl_error.log info; -
debug级别可输出完整握手流程(含 Client Hello 版本、SNI、cipher list),但仅用于临时排查,生产环境避免长期启用 - 注意:若使用
systemd管理 Nginx,还需确认journalctl -u nginx是否被重定向或截断
识别典型的 SSL 握手失败日志模式
常见错误行结构为:[error] XXX#YYY: *ZZZ SSL_do_handshake() failed (SSL: ...) 或 [info] ... SSL_read() failed (SSL: ...)。重点提取三类字段:
-
错误码:括号内如
SSL: error:1408F10B:SSL routines:ssl3_get_record:wrong version number—— “1408F10B” 是 OpenSSL 错误码,可用openssl errstr 1408F10B解析(需 OpenSSL dev 包) -
触发点:
ssl3_get_record表示记录层解析失败;tls_process_client_hello表示 Client Hello 处理异常;SSL_CTX_use_certificate则指向证书加载问题 -
上下文线索:日志前后是否出现
no suitable certificate、unable to get local issuer certificate、SSL alert number 40(handshake failure)等提示
高频原因与对应日志特征
以下情况在 error_log 中有较明显痕迹:
-
协议或加密套件不匹配:客户端用 TLS 1.0 发起连接,而 Nginx 配置了
ssl_protocols TLSv1.2 TLSv1.3;,日志常含ssl3_get_record:wrong version number或no ciphers available -
证书链不完整或格式错误:Nginx 启动时未报错,但握手时失败,日志可能出现
SSL_CTX_use_certificate_chain_file() failed或unable to get issuer certificate -
SNI 不匹配或无 SNI 扩展:当多个 server 块共用 IP 且依赖 SNI 选择证书,旧客户端(如 Java 6、嵌入式设备)不发 SNI,Nginx 可能返回默认证书或直接中断,日志中可见
no matching server name或空 cipher list - OCSP stapling 配置异常:若开启
ssl_stapling on但 OCSP 响应不可达,部分客户端会拒绝握手,日志中可能伴随SSL_do_handshake() failed (SSL: error:27069065:OCSP routines:OCSP_basic_verify:certificate verify error)
辅助排查手段
单靠 error_log 有时不足以定论,建议组合验证:
- 用
openssl s_client -connect example.com:443 -servername example.com -tls1_2模拟特定协议版本连接,观察返回的Verify return code和服务端发送的证书链 - 检查 Nginx 配置中
ssl_certificate和ssl_certificate_key文件路径、权限(需 Nginx worker 进程可读)、PEM 格式是否正确(无多余空行或非 ASCII 字符) - 启用
ssl_log_level info(1.19.4+)可单独控制 SSL 模块日志粒度,比全局info更精准 - 抓包分析(如
tcpdump -i any port 443 -w ssl.pcap)配合 Wireshark 查看 Client Hello 内容,确认实际协商参数是否与 Nginx 配置一致











