问题出现得很突然,日志倒是留得挺全。等保扫描报告里写着目标支持 TLSv1.0,运维已经把 nginx.conf 里的 ssl_protocols 改成 TLSv1.2 TLSv1.3 并 reload,扫描结果一点没变。

刚开始盯着「扫描打的是 443 之外的端口,那台机器上还有 Apache 在跑」,折腾了半个多小时,排掉了。

排查方向其实有限,先把可能性排一排。ssl_protocols 写在 http 块但 server 块里有同名指令,后者的旧值覆盖了全局。还有一种是另一份 conf.d 里的站点配置还带着旧参数,reload 后一起生效。

少数情况下是前置的 SLB 或 CDN 终止了 TLS,源站改不改对外都一样。

动手时先用 openssl 直接测支持哪些协议

openssl s_client -connect www.example.com:443 -tls1 </dev/null 2>&1 | grep -i 'Protocol\|alert'

然后找出所有写死旧协议的地方

grep -rn 'ssl_protocols' /etc/nginx/

随后统一改成只留 1.2 与 1.3 再重载

nginx -T 2>/dev/null | grep -c 'TLSv1 ' && nginx -s reload

等前面都确认过,再确认 443 上握手只协商新协议

nmap --script ssl-enum-ciphers -p 443 www.example.com | head -20

别只看报错消失,验证要多做一步。openssl 用 -tls1 握手直接返回 handshake failure,nmap 列表里只剩 TLS1.2 与 TLS1.3,扫描报告该项消失。

这里还有个坑。nginx -T 才是实际生效的完整配置,只看主文件容易漏 include;证书链上的中间设备也要一起改,否则扫描器看到的是它。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。

作者 9823189