apache标准mod_log_config不支持tls协议与密钥位长记录,因其仅能访问请求处理层变量,而tls细节由mod_ssl管理且未默认导出为日志字段;自2.4.12起可通过%{ssl_protocol}x、%{ssl_cipher_algkeysize}x等mod_ssl扩展字段实现。
虚拟主机层级无法直接通过 mod_log_config 记录 tls 握手协议(如 tlsv1.2)和密钥位长(如 256 位),因为这些信息在 apache 的日志模块中**不作为标准可记录字段提供**,且 mod_log_config 本身不解析或暴露底层 openssl 握手细节。
为什么标准 mod_log_config 不支持 TLS 协议与位长
mod_log_config 只能访问 Apache 请求处理流程中已解析并导出的变量(如 %h、%{User-Agent}i),而 TLS 版本、协商的密码套件、密钥交换位长等属于 SSL/TLS 层信息,由 mod_ssl 管理,并未默认映射为 %{...}n 或 %{...}e 类型的日志字段。
即使启用 SSLProtocol 和 SSLCipherSuite,Apache 也不会自动将本次连接实际协商出的 TLS 版本(如 TLSv1.3)或对称加密位长(如 AES-256-GCM)注入日志上下文。
可行替代方案:使用 mod_ssl 的自定义日志字段
从 Apache 2.4.12 起,mod_ssl 提供了若干以 %{...}x 格式访问 SSL 连接信息的扩展字段,可在 LogFormat 中直接使用:
-
%{SSL_PROTOCOL}x→ 实际协商的 TLS 协议版本(如TLSv1.2、TLSv1.3) -
%{SSL_CIPHER}x→ 完整密码套件名称(如ECDHE-ECDSA-AES256-GCM-SHA384) -
%{SSL_CIPHER_ALGKEYSIZE}x→ 对称加密密钥位长(如256) -
%{SSL_CIPHER_USEKEYSIZE}x→ 实际用于本次连接的密钥位长(多数情况同上) -
%{SSL_VERSION}x→ SSL/TLS 库版本(非协商版本,一般不用)
✅ 这些字段在虚拟主机配置中完全可用,无需额外模块。
在虚拟主机中配置示例
在对应 <virtualhost></virtualhost> 块内添加:
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %{SSL_PROTOCOL}x %{SSL_CIPHER}x %{SSL_CIPHER_ALGKEYSIZE}x" ssl_combined
CustomLog /var/log/apache2/example.com-ssl.log ssl_combined
重启 Apache 后,日志行类似:
203.0.113.42 - - [10/Jan/2025:14:22:33 +0000] "GET / HTTP/1.1" 200 1234 "-" "curl/8.6.0" TLSv1.3 ECDHE-ECDSA-AES256-GCM-SHA384 256
注意:%{SSL_*}x 字段仅对 HTTPS 请求有效;HTTP 请求对应位置显示为短横线(-)。
验证与排错要点
- 确保启用
mod_ssl(a2enmod ssl或检查LoadModule ssl_module) - 确认 Apache ≥ 2.4.12(旧版本不支持
%{SSL_CIPHER_ALGKEYSIZE}x) - 若字段始终为空或为
-,检查是否误将日志指令写在非 HTTPS 的<virtualhost></virtualhost>中 - 密码套件位长需结合
openssl ciphers -V查看具体套件说明(例如AES256-GCM明确表示 256 位)










