必须启用mod_ssl并使用%{}x语法记录ssl会话变量,如%{ssl_protocol}x、%{ssl_cipher}x、%{ssl_tls_sni}x等,仅tls握手成功后有效,http请求中为空。

要让 Apache 记录 HTTPS 连接的具体参数(如使用的 TLS 版本、加密套件、客户端证书信息、SNI 域名等),不能依赖默认的 LogFormat "%h %l %u %t \"%r\" %>s %O" 这类基础日志——它只记录 HTTP 层字段,不包含 SSL/TLS 握手层信息。必须启用并配置 mod_ssl 提供的专用日志变量,并确保日志格式显式引用它们。
以下是关键配置步骤和说明:
启用 mod_ssl 并确认已加载
确保 Apache 已加载 SSL 模块:
LoadModule ssl_module modules/mod_ssl.so
在 httpd.conf 或对应配置中检查该行未被注释。若缺失,需先安装 mod_ssl(CentOS/RHEL:yum install mod_ssl;Ubuntu/Debian:a2enmod ssl)。
使用 SSL 日志变量定义自定义 LogFormat
在 httpd.conf 或 ssl.conf 中添加或修改 LogFormat,例如:
LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\" \
%{SSL_PROTOCOL}x %{SSL_CIPHER}x %{SSL_CLIENT_S_DN_CN}x \
%{SSL_SERVER_S_DN_CN}x %{SSL_TLS_SNI}x" combined-ssl
其中常用 SSL 变量含义:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
-
%{SSL_PROTOCOL}x:协商的 TLS 协议版本(如TLSv1.2、TLSv1.3) -
%{SSL_CIPHER}x:实际使用的加密套件(如ECDHE-ECDSA-AES128-GCM-SHA256) -
%{SSL_CLIENT_S_DN_CN}x:客户端证书主题中的 CN(仅当启用并要求客户端证书时有效) -
%{SSL_SERVER_S_DN_CN}x:服务器证书主题 CN(即域名) -
%{SSL_TLS_SNI}x:客户端通过 SNI 扩展声明的目标域名(对虚拟主机多证书场景非常关键)
⚠️ 注意:
%{...}x是mod_ssl提供的 request log variable,仅在 HTTPS 请求上下文中可解析;HTTP 请求中对应字段为空或-。
将自定义格式应用到 VirtualHost
在 <virtualhost></virtualhost> 块内指定 CustomLog,例如:
<virtualhost>
ServerName example.com
SSLEngine on
SSLCertificateFile /path/to/public.crt
SSLCertificateKeyFile /path/to/private.key
SSLCertificateChainFile /path/to/chain.crt
# 启用日志记录
LogFormat "%h %l %u %t \"%r\" %>s %O \"%{SSL_PROTOCOL}x\" \"%{SSL_CIPHER}x\" \"%{SSL_TLS_SNI}x\"" ssl-details
CustomLog "/var/log/httpd/ssl_access_log" ssl-details
</virtualhost>
这样每条 HTTPS 访问日志将类似:
192.168.1.100 - - [06/Jun/2026:10:25:33 +0800] "GET / HTTP/1.1" 200 1234 "TLSv1.3" "TLS_AES_256_GCM_SHA384" "example.com"
可选:记录客户端证书完整信息(双向认证场景)
若启用了客户端证书验证(SSLVerifyClient require),还可记录:
-
%{SSL_CLIENT_S_DN}x:完整客户端证书主题 DN 字符串 -
%{SSL_CLIENT_I_DN}x:客户端证书颁发者 DN -
%{SSL_CLIENT_M_SERIAL}x:客户端证书序列号 -
%{SSL_CLIENT_V_END}x:客户端证书过期时间(格式为MMM DD HH:MM:SS YYYY GMT)
✅ 提示:这些字段只有在成功完成双向 TLS 握手后才可用;未提供证书或校验失败时值为
-。
验证与排查
- 修改配置后执行
apachectl configtest或httpd -t确保语法正确 - 重启 Apache:
systemctl restart httpd(或apache2) - 发起 HTTPS 请求后检查日志文件是否输出预期字段
- 若某字段始终为空,检查是否确为 HTTPS 请求(非 443 端口或未走 SSL)、
mod_ssl是否启用、对应功能(如 SNI、客户端证书)是否实际触发
不复杂但容易忽略的是:所有 SSL 相关日志变量都依赖 mod_ssl 正常工作且请求真实经过 TLS 层——反向代理后端(如 Nginx → Apache)若终止在前端,则 Apache 收到的是 HTTP 请求,%{SSL_*}x 全部失效。










