直接启用$ssl_protocol和$ssl_cipher变量写入日志即可,需在http块定义含二者及$ssl_server_name、$ssl_session_reused的日志格式,仅在listen 443 ssl的server块中配置access_log,并配合ssl_protocols、ssl_ciphers等策略确保实际协商安全。

直接在 Nginx 的 HTTPS server 块中启用 $ssl_protocol 和 $ssl_cipher 变量写入日志即可,不需要额外模块或编译——只要 Nginx 启用了 SSL 模块(默认已包含),且配置了 listen 443 ssl;,这两个变量就能准确记录每次连接实际协商出的 TLS 版本(如 TLSv1.3)和加密套件(如 ECDHE-ECDSA-AES128-GCM-SHA256)。
定义含 SSL 协议与套件的日志格式
在 `http{}` 块中添加自定义日志格式,例如:log_format ssl_detail '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$ssl_protocol/$ssl_cipher" "$ssl_server_name" $ssl_session_reused';
关键点:
- 使用斜杠分隔协议与套件,清晰可读
- 加入
$ssl_server_name可识别 SNI 域名,便于多站点审计 -
$ssl_session_reused标识会话是否复用(r表示复用,.表示新建)
只在 HTTPS server 块中启用该日志
确保 `access_log` 指令仅出现在 `listen 443 ssl;` 的 `server{}` 块内,例如:server {
listen 443 ssl;
server_name example.com;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
access_log /var/log/nginx/ssl_access.log ssl_detail;
}
注意:
- 不要将这条
access_log放在http{}或 HTTP 的server{}块中,否则$ssl_*变量为空或显示- - 每个启用 HTTPS 的虚拟主机都需单独配置,不能依赖继承
验证配置是否生效
执行三步检查: - 运行 `nginx -t` 确认语法无误 - 执行 `nginx -s reload` 重载配置 - 用 `curl -k https://example.com` 发起一次请求,然后查看日志:192.168.1.100 - - [25/Sep/2026:00:08:12 +0000] "GET / HTTP/1.1" 200 1234 "TLSv1.3/ECDHE-ECDSA-AES128-GCM-SHA256" "example.com" .
如果 $ssl_protocol 或 $ssl_cipher 显示为空或短横线 -,大概率是 server 块漏写了 ssl 关键字,或日志指令被错误地放在了 HTTP 配置段。
配套安全配置建议
日志只是观测手段,真正起效还需配合基础 SSL 策略: - 在同一 `server` 块中明确指定:`ssl_protocols TLSv1.2 TLSv1.3;` - 设置强加密套件:`ssl_ciphers "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384";` - 开启服务端优先:`ssl_prefer_server_ciphers on;` - 确保证书由可信 CA 签发,且私钥权限为 `600`不复杂但容易忽略。











