为什么先看握手,而不是先看状态码
很多人排查蜘蛛抓取问题时,第一反应是看状态码、看访问日志。但如果入口页是 HTTPS,蜘蛛必须先完成 TLS 握手,才能发送 HTTP 请求。握手失败时,服务器日志里可能只有一条连接重置,甚至什么都没有,状态码自然也无从谈起。
对蜘蛛池入口页来说,域名多、证书配置来源杂,HTTPS 问题比单站更容易出现。下面按常见顺序梳理。
证书链不完整:最容易漏掉的中间证书
服务器证书需要和中间证书一起下发,客户端才能拼出完整信任链。如果只配置了域名证书,没有配中间证书,浏览器有时会缓存或自动补全,但蜘蛛和其他客户端不一定有同样的容错能力。
检查方式:用 openssl s_client -connect 域名:443 -servername 域名 -showcerts 查看返回的证书数量。如果只返回一张,通常说明中间证书缺失。也可以使用在线 SSL 检测工具,看信任链是否完整。
SNI 配置:多域名共用 IP 时的常见坑
同一台服务器上放多个 HTTPS 入口域名时,需要依赖 SNI 区分证书。如果服务器或 CDN 没有正确支持 SNI,蜘蛛请求某个域名时,可能拿到默认站点的证书,导致域名不匹配。
排查时,可以用不带 SNI 的请求测试,观察返回的证书是哪一个。如果默认证书和入口域名不一致,就要检查虚拟主机或 CDN 的 SNI 配置。
TLS 版本与加密套件
TLS 版本过旧,比如只开 TLS 1.0 或 1.1,现代蜘蛛可能直接拒绝连接。版本过新,比如只开 TLS 1.3,大多数蜘蛛已经支持,但极少数老旧爬虫可能握手失败。稳妥的做法是同时支持 TLS 1.2 和 TLS 1.3,禁用已知不安全的加密套件。
不要为了兼容极少数旧客户端,把 TLS 1.0 重新打开。旧协议带来的问题通常比它解决的更多。
证书有效期与域名匹配
证书过期、域名不匹配、通配符覆盖范围不足,都会让蜘蛛在握手阶段收到警告。有些蜘蛛会直接放弃,有些可能会继续,但结果不稳定。
- 检查证书到期时间,设置提前续期提醒。
- 确认证书覆盖所有入口子域名,包括泛解析用到的域名。
- 如果使用多域名证书,核对 SAN 列表里是否包含实际入口。
混合内容与强制 HTTPS
入口页本身是 HTTPS,但页面内引用了 HTTP 资源,蜘蛛在渲染时可能遇到混合内容拦截。虽然这通常不影响 HTML 抓取,但会影响页面完整性和后续链接发现。
另外,HSTS 头可以强制 HTTPS,但如果配置错误,比如包含子域名但子域名没有证书,会把蜘蛛和自己都锁在错误配置上。启用前先确认所有入口域名都能正常 HTTPS 访问。
日常排查建议
- 固定用 curl -v 或 openssl 检查入口域名的握手过程。
- 从多个网络节点测试,不同出口线路可能看到不同的证书或连接结果。
- 在服务器日志中记录 TLS 握手失败,而不是只记录 HTTP 状态码。
- 批量新增入口域名时,把 HTTPS 检查加入上线清单。
HTTPS 握手是入口页可抓取性的第一道门槛。它不出问题时容易被忽略,一出问题又很难从状态码上直接看出来。把证书链、SNI、TLS 版本和域名匹配这几项做成例行检查,比事后猜测更有效。