mod_log_config无法记录SSL/TLS握手失败的错误代码,因其仅在握手成功后参与日志记录;失败事件由OpenSSL底层处理并记录在error_log中,需通过LogLevel调试和openssl s_client等工具定位。

不能。
mod_log_config 无法记录 SSL/TLS 握手失败的具体错误代码,因为它根本收不到失败的握手事件。
握手失败发生在 TLS 层建立连接的最前端——此时连接尚未进入 Apache 的 HTTP 请求处理流程,mod_log_config 还没被触发,日志模块完全不参与。所有失败都终止在 OpenSSL 底层,不会生成访问日志(access log)条目,更不会填充 %{...}x 类变量。
你看到的 SSL_do_handshake() failed、error:1407609C 这类信息,只出现在 error_log 中,且需配合正确的日志级别才能捕获。
✅ 正确做法:用 error_log + LogLevel 抓取失败原因
要拿到具体 OpenSSL 错误码和失败阶段,必须:
- 将
LogLevel调至info或debug(尤其开启ssl:info) - 检查
/var/log/apache2/error.log(Ubuntu)或/var/log/httpd/error_log(CentOS)
常见可定位的线索包括:
-
SSL_do_handshake() failed或SSL_accept() failed -
SSL Library Error: error:XXXXXXX:...→ 可用openssl errstr XXXXXXX解析 -
no shared cipher→ 密码套件无交集 -
unknown protocol或TLSv1.3 is not supported→ 协议版本不兼容 -
bad certificate/certificate verify failed→ 证书链、过期或验证失败
示例配置:
LogLevel info ssl:info
重启后复现问题,再用 tail -n 50 error.log 查看上下文(前几行常含 ClientHello 版本/SNI/支持套件,后几行常暴露根因)。
❌ mod_log_config 能记什么?(仅限成功握手后)
一旦 TLS 握手成功,HTTP 请求开始流转,mod_log_config 才能通过 %{...}x 记录会话级信息,例如:
-
%{SSL_PROTOCOL}x→TLSv1.2 -
%{SSL_CIPHER}x→ECDHE-ECDSA-AES256-GCM-SHA384 -
%{SSL_CLIENT_VERIFY}x→NONE或SUCCESS -
%{SSL_SERVER_S_DN_CN}x→ 服务器证书 CN
这些值对分析已建立连接的质量有用,但对排查“为什么连不上”毫无帮助。
? 补充建议:快速验证失败原因
-
用
openssl s_client模拟客户端行为:openssl s_client -connect yoursite.com:443 -tls1_2 -servername yoursite.com
观察输出中的
Protocol,Cipher,Verify return code。 -
抓包分析(需私钥):
sudo tcpdump -i any port 443 -w ssl.pcap
用 Wireshark 打开,启用 TLS 解密(TLS 1.2 有效,TLS 1.3 需应用层密钥日志)。
-
检查证书与私钥是否匹配:
openssl x509 -noout -modulus -in cert.pem | md5sum openssl rsa -noout -modulus -in key.pem | md5sum
两个 md5 值必须一致。
不复杂但容易忽略。











