蜘蛛池知识

蜘蛛池入口頁的 HTTPS 與 TLS 握手:證书異常时蜘蛛會怎么處理

蜘蛛池入口頁如果 HTTPS 握手失敗,蜘蛛连頁面内容都拿不到,後續的連結發現和抓取预算都無從谈起。本文從證书鏈、SNI、TLS 版本、域名匹配和混合内容几個角度,說明常见配置問题怎么排查,以及日常运维里可以固定检查哪些項目。

蜘蛛池知识

蜘蛛池入口頁的 HTTPS 與 TLS 握手:證书異常时蜘蛛會怎么處理

為什么先看握手,而不是先看狀態碼

很多人排查蜘蛛抓取問题时,第一反應是看狀態碼、看訪問日誌。但如果入口頁是 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 訪問。

日常排查建议

  1. 固定用 curl -v 或 openssl 检查入口域名的握手過程。
  2. 從多個網絡节点測試,不同出口线路可能看到不同的證书或连接结果。
  3. 在服務器日誌中记錄 TLS 握手失敗,而不是只记錄 HTTP 狀態碼。
  4. 批量新增入口域名时,把 HTTPS 检查加入上线清單。

HTTPS 握手是入口頁可抓取性的第一道门槛。它不出問题时容易被忽略,一出問题又很难從狀態碼上直接看出来。把證书鏈、SNI、TLS 版本和域名匹配這几項做成例行检查,比事後猜测更有效。