PCI-DSS合规要求Nginx必须禁用TLSv1.0/TLSv1.1、启用TLSv1.2+及PFS加密套件(如ECDHE)、强制Secure/HttpOnly/SameSite Cookie、启用HSTS与X-Content-Type-Options。

直接通过 $ssl_protocol 和 $ssl_cipher 这两个 Nginx 变量,可以实时捕获每个 HTTPS 请求所使用的 TLS 协议版本与加密套件,是审计连接合规性的轻量级、高实效手段。
明确合规基线要求
先确认你所在环境的强制策略,例如:
- 禁用 TLS 1.0 / TLS 1.1(如 PCI DSS、等保2.0、Azure PostgreSQL 默认策略)
- 禁用弱密码套件:含
NULL、EXPORT、RC4、DES、MD5、SHA1的套件 - 推荐启用前向安全(PFS):优先使用
ECDHE或DHE密钥交换 - 要求最低强度:AES-128 或 ChaCha20 起步,密钥长度 ≥128 bit
在 Nginx 中记录并提取关键字段
在 log_format 中加入这两个变量,例如:
log_format tls_audit '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'$ssl_protocol $ssl_cipher;重启 Nginx 后,每条访问日志末尾就会追加类似:
TLSv1.2 ECDHE-ECDSA-AES256-GCM-SHA384
或不安全的连接:
TLSv1.0 RC4-SHA
快速识别不合规连接
用日志分析工具(如 grep、awk、ELK、Loki)筛选出问题连接:
- 查 TLS 1.0/1.1:
grep -E 'TLSv1\.0|TLSv1\.1' access.log - 查弱套件:
grep -i -E '(rc4|des|export|null|md5|sha1)' access.log - 查缺失 PFS:
grep -v -E '(ECDHE|DHE)' access.log | grep TLSv1.2 - 查无加密(明文):
grep '^.* - .* \[\|.*\] ".*" [0-9]\+ 0 ' access.log(配合$ssl_protocol为空判断)
联动响应与加固建议
发现不合规连接后,不只是归档,更要闭环处理:
- 定位客户端 IP 或 User-Agent,识别是旧设备(如嵌入式终端)、老旧浏览器还是爬虫
- 检查是否因客户端未支持 SNI 导致降级(常见于 WinXP IE6/7)
- 在 Nginx 中主动拦截:用
if ($ssl_protocol ~ "^TLSv1\.0|TLSv1\.1$") { return 426; } - 升级 cipher suite 配置:参考 Mozilla SSL Configuration Generator,启用
TLS_AES_256_GCM_SHA384等 TLS 1.3 套件,并禁用不安全选项


















