报错是这么冒出来的。安全加固把 ssl_protocols 改成只留 TLSv1.3,上线第二天百度抓取量掉到零,日志里没有握手记录。用 openssl 带 tls1_2 参数连过去直接报 handshake failure。
中间走过弯路,把「中间设备终止 TLS 后回源用 1.2」当成主因,改完现象没变。
排查方向其实有限,先把可能性排一排。部分抓取节点仍只支持 TLS 1.2。也可能是只开 1.3 时旧客户端没有可协商的套件。
另外,HSTS 让降级请求无法回退。
上来先分别用两个版本连接测试
openssl s_client -connect www.example.com:443 -tls1_2 </dev/null | grep 'Protocol'
接着把 1.2 加回协议列表
ssl_protocols TLSv1.2 TLSv1.3;
然后用百度 UA 验证抓取
curl -s -o /dev/null -w '%{http_code}\n' -A 'Baiduspider' https://www.example.com/
末了统计握手失败日志
grep -c 'handshake failure' error.log
排查用的命令都是临时敲的,没有写成脚本,事后才整理。
手上没有现成的复现脚本,就照着线上请求手工拼了一个。
别只看报错消失,验证要多做一步。TLS 1.2 和 1.3 都能握手成功,百度抓取量在三天内回到原水平。
关旧协议要看抓取器的支持情况,先查日志再关,别一次关到只剩最新版本。这类问题最好一次改到位,反复小改反而容易把原因搅混。
