在Nginx中,于http{}块定义含$ssl_protocol和$ssl_cipher的日志格式,并在启用SSL的server{}块中调用access_log,即可准确记录HTTPS连接实际协商的TLS版本与加密套件;需确保已启用ssl_module、listen 443 ssl;配置正确且证书路径有效。

直接在 Nginx 的 http{} 块中定义含 $ssl_protocol 和 $ssl_cipher 的日志格式,并在启用 SSL 的 server{} 块中调用,就能准确记录每次 HTTPS 连接实际协商的 TLS 版本与加密套件。这两个变量由 TLS 握手完成后自动填充,真实、不可伪造。
确认基础前提
确保以下三点已满足,否则变量始终为空:
- Nginx 已编译并启用了
--with-http_ssl_module(运行nginx -V 2>&1 | grep ssl_module验证) - 对应 server 块使用了
listen 443 ssl;(不能漏掉ssl关键字) - 配置中包含有效的
ssl_certificate和ssl_certificate_key
定义专用日志格式
在 http{} 块内添加如下格式(推荐竖线或空格分隔,便于后续解析):
log_format ssl_detail '$remote_addr|$time_local|$ssl_protocol|$ssl_cipher|$ssl_server_name|$status|$request_method|$uri|$request_time|"$http_user_agent"';
其中关键字段说明:
-
$ssl_protocol:如TLSv1.3或TLSv1.2 -
$ssl_cipher:如TLS_AES_256_GCM_SHA384(TLS 1.3)或ECDHE-RSA-AES256-GCM-SHA384(TLS 1.2) -
$ssl_server_name:客户端通过 SNI 发送的域名,用于识别虚拟主机路由
在 HTTPS server 块中启用日志
把 access_log 指令明确写在监听 443 的 server 块里,例如:
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /etc/nginx/ssl/example.crt;
ssl_certificate_key /etc/nginx/ssl/example.key;
access_log /var/log/nginx/ssl_detail.log ssl_detail;
}
⚠️ 注意:不要将 access_log 放在 http{} 或 HTTP server 块中,否则非 HTTPS 请求会因变量未定义导致字段为空或日志错位。
验证与常见问题
重启 Nginx 后,发起 HTTPS 请求(如 curl -k https://example.com),检查日志文件是否输出类似:
192.168.1.100|26/Oct/2026:15:22:33 +0000|TLSv1.3|TLS_AES_256_GCM_SHA384|example.com|200|GET|/|0.012|"curl/8.9.1"
若出现 - 或空白,优先排查:
– 是否误用了 listen 443 而非 listen 443 ssl
– 证书路径是否正确、Nginx 是否有读取权限
– 客户端是否真的走 HTTPS(HTTP 请求不会触发这些变量)











