蜘蛛池知识

蜘蛛池入口页的 HTTPS 证书与 TLS 握手:蜘蛛可能在握手阶段就走了

蜘蛛池入口页的抓取问题,往往不内容或内链,而在更靠前的 TLS 握手。证书链不完整、域名不匹配、续期静默失败、SNI 配置疏漏,都会让蜘蛛在建立连接时就放弃。本文梳理几类高频故障、混合内容与跳转问题,并给出一套从公网侧出发的排查顺序。

蜘蛛池知识

蜘蛛池入口页的 HTTPS 证书与 TLS 握手:蜘蛛可能在握手阶段就走了

很多人排查蜘蛛池入口页的抓取问题,习惯从内容和内链入手,却忽略了更靠前的一步:TLS 握手。蜘蛛必须先建立连接、完成证书校验,才有机会看到你的 HTML。握手阶段出问题,后面做得再好也没有用。

为什么证书问题在蜘蛛池里被放大

普通站点通常只有一个域名、一张证书,出问题容易发现。蜘蛛池动辄几十上百个入口页,域名分散、可能分布在多台服务器上,证书往往是批量签发、批量部署的。批量就意味着容易漏:漏一个域名、漏一条中间证书、漏一次续期,都不会有人立刻发现,但蜘蛛会。

更关键的是,不同抓取客户端的容错策略不一样。有的对证书链不完整比较宽容,有的直接放弃;有的支持 SNI,有的在旧版本上不支持。你并不容易知道对面那台机器用的是哪一套。

几类高频的证书故障

证书链不完整

服务器只发了站点证书,没带中间证书。浏览器可能靠缓存或 AIA 补链自动修好,看起来一切正常;但蜘蛛请求往往没有缓存,也不一定支持 AIA 抓取,于是握手直接失败。这种情况最容易被误判成“服务器不稳定”或“蜘蛛不来”,实际原因在配置里。

排查办法是用 openssl s_client -connect 域名:443 -servername 域名 查看返回的证书链是否完整。

域名不匹配与通配符边界

通配符证书只覆盖一级子域名,*.example.com 并不覆盖 a.b.example.com。如果入口页用了多级子域,或者证书里写的是裸域、入口页却挂在 www 子域上,就会出现名称不匹配。名称不匹配在多数客户端上是硬失败,而不是可以忽略的警告。

续期失败与静默停止

自动签发的证书有效期普遍不长,依赖定时任务续期。定时任务因为权限、端口占用、校验方式变更等原因停掉之后,通常没有任何告警,直到证书到期当天全站握手失败。建议至少做两件事:把到期时间纳入监控并在剩余 15 天时提醒;续期成功后自动重载服务,避免新证书写好了但进程还在用旧的。

SNI、TLS 版本与被忽略的兼容性

同一台服务器上放多个入口页域名时,靠 SNI 区分证书。绝大多数现代抓取客户端支持 SNI,但如果接入层配置了 SNI 缺失时的默认站点,可能会把请求导向错误的证书或错误的内容。可以在检测工具里关掉 SNI 试一次,看看返回什么。

另一个方向是 TLS 版本与加密套件。为了安全收紧到只允许较新协议本身没问题,但如果你同时用了较老的抓取工具或自建检测脚本,可能会看到握手失败。这部分建议以真实日志为准,而不是凭猜测放开旧协议。

混合内容与协议层面的反复跳转

即使 HTTPS 握手正常,页面里引用 http:// 的图片、脚本、样式,也可能让部分客户端在加载子资源时出错,甚至影响它对页面完整性的判断。更常见的是协议跳转没理顺:http 到 https 跳一次,带 www 又跳一次,结尾斜杠再跳一次,一个入口页要跳三跳才落地。跳转本身不致命,但它消耗抓取预算,也增加了链路上任一环出错的机会。

建议把入口页的最终 URL 固定成唯一的规范形式,其他变体用一次性跳转收敛过去。

一个可执行的排查顺序

  1. 用外部工具从公网检测证书链、有效期与域名匹配,不要只在服务器本机用 curl 测。
  2. 检查是否所有入口页域名都在证书覆盖范围内,特别是多级子域。
  3. 确认续期任务最近一次成功时间,以及服务是否已加载新证书。
  4. 关掉 SNI 测一次,看默认站点返回的是哪个域名、什么内容。
  5. 检查页面内是否残留 http:// 资源链接。
  6. 最后再看跳转链,把多余的一跳去掉。

几点使用建议

  • 入口页域名尽量控制在一张证书能覆盖的范围内,减少管理面。
  • 把证书到期时间做成监控项,不要依赖记忆。
  • 批量部署后抽样验证,而不是全部部署完就认为没问题。
  • 改动 TLS 配置后,用日志观察一段时间的抓取量变化,再决定是否继续收紧。
握手是蜘蛛看到你内容的前提。它不通过,后面关于内容、内链、抓取预算的所有优化都无从谈起,而它出问题时往往没有任何明显症状。