关键是要显式启用并配置 SSL 日志变量:启用 mod_ssl 模块,定义含 %{SSL_PROTOCOL}x、%{SSL_CIPHER}x 等的自定义 LogFormat,绑定至 443 虚拟主机的 CustomLog,并确保仅记录握手成功请求。

要在 Apache 日志中记录完整的 HTTPS 加密协议信息,关键不是“开启 HTTPS”,而是**显式启用并配置 SSL 相关日志变量**。默认的 combined 或 common 日志格式完全不包含 TLS 版本、加密套件、证书校验状态等字段——这些必须靠自定义 LogFormat + 启用 mod_ssl 的扩展变量来实现。
必须启用 mod_ssl 并确认模块已加载
如果 mod_ssl 未启用,所有 %{SSL_*}x 变量都会为空或报错:
- 检查是否已加载:
apachectl -M | grep ssl,应看到ssl_module (shared) - 若未启用,Debian/Ubuntu 运行
a2enmod ssl;CentOS/RHEL 确保mod_ssl包已安装且配置文件(如/etc/httpd/conf.modules.d/00-ssl.conf)未被注释 - 重启前务必执行
apachectl configtest验证语法
定义含 SSL 变量的 LogFormat
在主配置或虚拟主机配置中添加自定义日志格式,例如:
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" \
%{SSL_PROTOCOL}x %{SSL_CIPHER}x %{SSL_CLIENT_VERIFY}x %{SSL_SERVER_S_DN_CN}x" ssl_enhanced常用 SSL 日志变量说明:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
-
%{SSL_PROTOCOL}x:实际协商的协议,如
TLSv1.2、TLSv1.3 -
%{SSL_CIPHER}x:完整加密套件名,如
ECDHE-ECDSA-AES256-GCM-SHA384 -
%{SSL_CLIENT_VERIFY}x:双向认证结果,
NONE(未认证)、SUCCESS、FAILED:depth=1等 - %{SSL_SERVER_S_DN_CN}x:服务器证书主题 CN(可辅助排查多域名证书匹配问题)
绑定 CustomLog 到 HTTPS 虚拟主机
仅定义 LogFormat 不生效,必须在 块内指定使用该格式:
<virtualhost> SSLEngine on SSLCertificateFile /etc/apache2/ssl/example.com.crt SSLCertificateKeyFile /etc/apache2/ssl/example.com.key # ... 其他 SSL 配置 <p>CustomLog /var/log/apache2/https_access.log ssl_enhanced ErrorLog /var/log/apache2/https_error.log </p></virtualhost>
注意:
- 不要复用 HTTP 的 access_log 文件路径,避免混杂;建议为 HTTPS 单独建日志路径
- 该日志只记录握手成功后进入 HTTP 处理流程的请求;握手失败(如协议不支持、证书错误)不会出现在这里,而是在 error_log 中
- 若字段值全为空,常见原因是 SSL 握手失败导致请求未到达日志写入阶段,需先查 error_log
验证与调试技巧
配置生效后,可通过以下方式快速验证:
- 用 curl 发起 HTTPS 请求:
curl -I https://yourdomain.com,再查看日志末尾是否出现新条目及非空 SSL 字段 - 用浏览器访问,打开开发者工具 → Security 标签页,对比页面显示的协议/套件与日志中 %{SSL_PROTOCOL}x 和 %{SSL_CIPHER}x 是否一致
- 若某字段始终为空(如 %{SSL_CLIENT_VERIFY}x),检查是否启用了客户端证书验证(
SSLVerifyClient require);否则默认为 NONE










