必须启用$ssl_protocol和$ssl_cipher变量,定义专用日志格式ssl_audit并仅绑定至443 server块,同时确保ssl_protocols仅保留tlsv1.2/tlsv1.3、ssl_ciphers明确指定aead套件且启用ssl_prefer_server_ciphers。

要让 Nginx 准确记录每次 HTTPS 连接实际使用的 TLS 协议版本和加密套件,核心是启用内置变量并限定日志作用范围——不是简单加几行配置就能生效,关键在变量调用、日志格式定义和 HTTPS 流量隔离。
必须启用 $ssl_protocol 和 $ssl_cipher 日志变量
这两个变量由 Nginx 在 TLS 握手完成后自动填充,真实反映协商结果:
-
$ssl_protocol显示如TLSv1.2或TLSv1.3 -
$ssl_cipher显示如ECDHE-RSA-AES256-GCM-SHA384或TLS_AES_256_GCM_SHA384
它们只在 HTTPS 请求中有效,HTTP 请求里为空,所以不能全局启用。
定义专用日志格式并绑定到 443 server 块
在 http 块中添加自定义格式(例如叫 ssl_audit):
log_format ssl_audit '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'$ssl_protocol $ssl_cipher $request_time';
然后仅在监听 443 的 server 块中启用该日志:
server {
listen 443 ssl;
server_name example.com;
# 其他 SSL 配置...
access_log /var/log/nginx/ssl-audit.log ssl_audit;
}
⚠️ 切勿写在 http 块或 80 端口的 server 块里,否则会记录空值或报错。
确保底层 SSL 配置本身合规
日志能记下来,前提是连接真用了强协议和套件。需同步检查:
-
ssl_protocols TLSv1.2 TLSv1.3;(禁用 TLSv1.0/1.1) -
ssl_ciphers按优先级明确列出 AEAD 套件(如TLS13-AES-256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384) -
ssl_prefer_server_ciphers on;(强制服务端选你指定的顺序)
配置完后,用 nginx -t 检查语法,再 nginx -s reload 生效。访问一次 HTTPS 页面,查看 /var/log/nginx/ssl-audit.log 是否出现带协议和套件名称的条目——有,就说明已可验证、可追溯。











