Nginx可通过配置$ssl_protocol和$ssl_cipher变量实现PCI-DSS合规所需的可验证、可追溯HTTPS加密审计,需定义含这两个变量的日志格式、仅在443端口server块中启用,并同步禁用TLSv1.0/1.1及弱加密套件。

PCI-DSS 合规审计不只要求你“用了强加密”,更要求你能**可验证、可追溯**——其中关键一环,就是准确记录每次 HTTPS 连接实际协商使用的 TLS 版本和加密套件。Nginx 本身不默认记录这些信息,必须主动配置日志变量并启用对应字段。
启用 $ssl_protocol 和 $ssl_cipher 日志变量
Nginx 提供两个内置变量,直接反映握手结果:
-
$ssl_protocol:显示实际协商的 TLS 版本,如
TLSv1.2或TLSv1.3 -
$ssl_cipher:显示最终选定的加密套件名称,如
ECDHE-RSA-AES256-GCM-SHA384
在 http 或 server 块中定义自定义日志格式,例如:
然后在 access_log 指令中引用该格式:
确保只记录 HTTPS 流量(避免混入 HTTP)
若站点同时监听 80 和 443 端口,需确保该日志仅用于 HTTPS server 块,否则 HTTP 请求的 $ssl_protocol 和 $ssl_cipher 会为空或报错。正确写法是:
配合合规配置一起生效
仅记录不够,审计方会核对日志内容是否真正符合 PCI-DSS 要求。因此必须同步确保:
-
ssl_protocols 设为
TLSv1.2 TLSv1.3(严禁含TLSv1.0或TLSv1.1) -
ssl_ciphers 中不含
RC4、3DES、-SHA(即 SHA1)、EXPORT、NULL、ANONYMOUS等禁用关键词 - ssl_prefer_server_ciphers on,防止客户端强制降级
配置完成后,务必执行 nginx -t 校验语法,并用 nginx -s reload 生效。
验证日志是否真实有效
不要依赖日志文件存在就认为成功。应做两步验证:
- 用
openssl s_client -connect example.com:443 -tls1_2手动触发一次 TLSv1.2 握手,检查输出中的Cipher行是否与日志中某条记录一致 - 访问站点后查看
/var/log/nginx/ssl-audit.log,确认每行末尾都有类似TLSv1.2 ECDHE-RSA-AES256-GCM-SHA384的完整组合,且无空值、无TLSv1.1或含-SHA的套件


















