Apache可通过%{SSL_PROTOCOL}x和%{SSL_CIPHER}x变量记录TLS版本与加密套件,需在LogFormat中显式启用并仅在启用了SSLEngine的HTTPS虚拟主机中生效,日志字段为空表明未建立SSL上下文。

Apache 本身不直接记录 TLS 协议版本和加密套件到常规访问日志中,但可通过 %{SSL_PROTOCOL}x 和 %{SSL_CIPHER}x 日志格式变量实现——这两个变量由 mod_ssl 提供,需在自定义日志格式中显式启用。
启用 SSL 协议与套件日志字段
在 Apache 配置(如 httpd.conf 或虚拟主机配置块)中,定义包含 SSL 信息的自定义日志格式:
- 添加如下日志格式(推荐放在全局或
<VirtualHost *:443>内):
<IfModule mod_log_config.c>
LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\" %{SSL_PROTOCOL}x %{SSL_CIPHER}x" combined-ssl
</IfModule> - 在 HTTPS 虚拟主机中使用该格式:
CustomLog /var/log/apache2/ssl_access.log combined-ssl - 确保
mod_ssl和mod_log_config已启用(多数发行版默认开启)
验证变量是否可用
若日志中对应字段为空或显示为“-”,说明请求未走 HTTPS 或 SSL 上下文未建立:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
-
%{SSL_PROTOCOL}x和%{SSL_CIPHER}x仅在SSLEngine on的 443 虚拟主机中有效;HTTP(80端口)虚拟主机中始终为空 - 确认该虚拟主机已正确加载证书、私钥,并启用了 TLS 握手(例如未因
SSLProtocol配置过严而拒绝客户端) - 重启 Apache 后,用
curl -I https://yoursite.com或浏览器访问一次,再检查日志是否出现类似TLSv1.3 TLS_AES_256_GCM_SHA384的条目
增强可读性与分析支持
为便于后续分析(如统计 TLS 1.3 使用率或发现弱套件),可进一步优化:
- 将字段命名更清晰(非必需,但利于团队协作):
LogFormat "%h %t \"%r\" %{SSL_PROTOCOL}x %{SSL_CIPHER}x %>s %O" ssl-detail - 配合
rotatelogs或logrotate管理日志体积,避免单文件过大 - 若需结构化导出(如接入 ELK),可用
awk或goaccess解析含 SSL 字段的日志,提取协议分布直方图
注意事项
这些变量反映的是实际协商结果,不是配置预期:
- 即使配置了
SSLProtocol TLSv1.2 TLSv1.3,日志中仍可能出现TLSv1.2—— 这是正常现象,说明客户端不支持 TLS 1.3 -
%{SSL_CIPHER}x显示的是最终采用的套件全名(如TLS_AES_128_GCM_SHA256),而非配置中的模糊表达式(如HIGH:!aNULL) - 不建议在高并发生产环境无节制开启该日志(尤其含完整套件名),因其会略微增加每请求日志开销

















