按等保要求把 ssl_protocols 改成只留 TLSv1.2 与 TLSv1.3,上线第二天百度抓取量掉了三成,日志里出现 handshake failure。试过只加回 TLSv1.1,仍然失败。

一开始怀疑是「CDN 回源用旧协议,源站拒绝后整条链路失败」,查了一圈,方向不对。

真正麻烦的地方在于,几个原因的现象几乎一样。部分旧爬虫节点只支持 TLS 1.0 与 1.1。还有一种是关闭旧协议时把兼容套件一起删了,1.2 也谈不拢。

少数情况下是边缘节点配置没同步,只有部分节点报错。

动手时先按协议版本测试握手

openssl s_client -connect www.example.com:443 -tls1_1 </dev/null | grep -i 'handshake failure'

随后统计日志里的握手失败

grep -c 'handshake failure' /var/log/nginx/error.log

保留 1.2 并补齐兼容套件

ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5;

复核 CDN 回源协议

curl -sI https://www.example.com/ | grep -i 'server\|via'

命令输出我都留了记录,免得改完记不清原来的值。

别只看报错消失,验证要多做一步。协议调整后握手失败归零,百度抓取量在三天内恢复,TLS 1.0 与 1.1 仍然保持关闭。

补一句。安全基线要守,但别在业务高峰期切换,先按 UA 统计旧协议请求占比,再决定是否保留过渡期。这类问题最好一次改到位,反复小改反而容易把原因搅混。

作者 9823189