必须在启用SSL的443 server块中使用$ssl_protocol变量记录实际协商的TLS版本,配合专用log_format和access_log指令,并确保ssl_protocols仅含TLSv1.2/TLSv1.3等配置生效。

要在 Nginx 中通过访问日志准确记录 SSL/TLS 协议版本,用于安全审计与合规验证,关键不是“记录配置”,而是捕获每次 HTTPS 连接真实协商出的协议版本——这必须依赖 TLS 握手完成后由 Nginx 自动填充的内置变量,且仅在启用 SSL 的上下文中有效。
必须启用 $ssl_protocol 变量并限定作用域
$ssl_protocol 是唯一能反映实际协商结果的变量,值为 TLSv1.2 或 TLSv1.3(不会出现 TLSv1.0/1.1,前提是配置已禁用)。它只在 HTTPS 请求中可用,HTTP 请求里为空。因此:
- 不能在全局 http 块或监听 80 的 server 块中使用,否则日志中该字段为空或报错
- 必须在明确启用 SSL 的 443 server 块中调用,例如:
listen 443 ssl; - 变量无需额外模块或编译选项,Nginx 1.11.5+ 原生支持
定义专用日志格式并绑定到 HTTPS server 块
推荐在 http 块中定义结构清晰、便于解析的格式,例如:
log_format ssl_audit '$time_iso8601|$remote_addr|$ssl_protocol|$ssl_cipher|$ssl_server_name|$request_method|$uri|$status|$bytes_sent|$request_time|"$http_user_agent"';
然后仅在对应 443 server 块中启用:
access_log /var/log/nginx/ssl-audit.log ssl_audit;
- 路径需确保目录存在,且 nginx worker 进程有写权限(如
chown nginx:adm /var/log/nginx) - 避免使用空格分隔,竖线(|)更利于后续用 awk、Logstash 或 SIEM 工具提取字段
- 不建议复用默认的 combined 格式,防止混淆 HTTP 与 HTTPS 日志语义
确保底层 SSL 配置真正生效
日志能记下协议版本,不代表客户端真用了 TLSv1.2+。必须同步检查三项基础配置:
-
协议限制:确认
ssl_protocols TLSv1.2 TLSv1.3;,显式禁用 TLSv1.0 和 TLSv1.1 -
服务端优先:启用
ssl_prefer_server_ciphers on;,避免客户端主导导致降级 -
无冗余指令:删除过时的
ssl_dhparam(TLSv1.3 下已不必要)或模糊的ssl_ciphers DEFAULT
配置后执行 nginx -t && nginx -s reload,再用浏览器或 curl 访问一次 HTTPS 页面,检查日志是否出现含 TLSv1.2 或 TLSv1.3 的完整条目——这是验证是否真正可审计的直接依据。


















