mod_log_config无法记录SSL/TLS握手失败的OpenSSL错误码,因其仅在握手成功且HTTP请求进入处理流程后才运行,而失败连接根本不会到达该模块;真正捕获错误码的唯一位置是Apache的error_log,需设置LogLevel info ssl:warn或更高,并关注SSL_do_handshake() failed、SSL Library Error等日志模式。

不能。
mod_log_config 无法记录 SSL/TLS 握手失败的底层协议错误码。
原因很明确:
握手失败时,TLS 连接根本未建立成功,请求连 Apache 的日志模块都进不去。mod_log_config 只在 HTTP 请求进入处理流程后才运行,依赖的是 OpenSSL 提供的已建立会话的上下文变量(如 %{SSL_PROTOCOL}x、%{SSL_CIPHER}x)。这些变量在握手失败时根本不存在,因此日志中不会出现任何对应字段,更不可能输出 OpenSSL 错误码(如 error:1417A0C1)。
真正能捕获握手失败错误码的地方只有一个:Apache 的 error_log。
如何获取 SSL 握手失败的 OpenSSL 错误码
-
确保
LogLevel足够高
在 Apache 配置中设置:LogLevel info ssl:warn # 调试阶段可临时设为: # LogLevel debug ssl:debug
注意:
ssl:debug是模块级日志级别,必须显式指定,仅LogLevel debug不足以启用 SSL 细节。 -
关注
error_log中的关键模式
失败时典型日志行包含:SSL_do_handshake() failedSSL_accept() failed-
SSL Library Error: error:XXXXXXX:...(这就是你要的 OpenSSL 错误码)
例如:
SSL_do_handshake() failed (SSL: error:1417D18D:SSL routines:tls_process_client_hello:version too low) -
解析错误码(可选但推荐)
把十六进制码(如1417D18D)交给 OpenSSL 工具:openssl errstr 1417D18D
输出:
error:1417D18D:SSL routines:tls_process_client_hello:version too low
为什么不能用 CustomLog + mod_log_config 替代
-
%{}x变量全部要求“握手已完成且请求已派发”,失败场景下全为空或不可用。 - 即使你写
%{SSL_CLIENT_VERIFY}x或%{SSL_PROTOCOL}x,失败连接的日志行中这些字段只会显示-或留空,不报错也不记录原因。 - 没有类似
%{SSL_ERROR_CODE}x或%{OPENSSL_ERRSTR}x的内置字段,Apache 不向mod_log_config暴露失败上下文。
补充建议:让错误码更易追踪
-
在
VirtualHost中开启 SNI 和详细环境变量,辅助定位:SSLOptions +StdEnvVars
这会让
error_log中更可能附带SSL_SERVER_NAME、SSL_PROTOCOL(若协商到某一步)等线索。 结合
tcpdump抓包(如需分析 ClientHello 内容或 ALPN/SNI 字段),但注意:
错误码本身仍只出现在error_log,抓包只能看原始字节,不解密则看不到语义级失败原因。
基本上就这些。











