curl 8.22 修正 mbedTLS:关闭对端验证时仍执行主机名校验

curl 8.22 修正了 mbedTLS 后端的一条关键验证路径:当应用关闭对端证书链验证、但仍要求校验证书主机名时,名称不匹配不会再被一起清除。两个选项由此恢复各自独立的含义。

互联网连接依次经过代理和源站两个身份检查点,名称不匹配的路径在校验边界被阻止

curl 项目将这项变更描述为“mbedtls: enforce verifyhost when verifypeer is disabled”。回归场景同时设置“关闭对端验证”和“开启主机名验证”,再让服务端出示签发给另一个名称的证书。修复前,该 mbedTLS 路径可能返回成功;修复后,主机名不匹配会保留并产生验证错误。

对代理使用者而言,这不是一个边缘细节。一次请求可能同时存在客户端到 HTTPS 代理、以及隧道内到源站的两层 TLS。若测试把两层混成一个“证书是否正常”的结论,就很容易误判故障位置。

mbedTLS 后端具体改了什么

证书验证至少要分别回答两个问题:

  • 证书链是否符合当前信任策略;
  • 证书是否标识了客户端原本要访问的主机名。

受影响的回调在关闭对端验证时清除了整组验证标志,其中也包括“证书名称不匹配”标志。因此,即便应用仍开启主机名校验,该路径也可能看不到错误。curl 8.22 只移除被明确关闭的检查,让名称不匹配继续向上传递。

这项修复绝不意味着关闭证书链验证已经安全。生产环境通常应同时开启证书链和主机名验证。异常组合只适合受控兼容性实验,不应作为长期绕过方案。

为什么代理链路必须拆成两层验证

普通 HTTP 代理承载 HTTPS 隧道时,客户端会在隧道建立后验证目标站点。HTTPS 代理则可能要求客户端先验证代理网关,再在隧道内单独验证源站。

测试记录应明确区分:

层级预期名称信任材料主要排查对象
代理 TLS配置中的代理主机名面向代理的 CA 策略网关部署或客户端配置
源站 TLS请求的目标主机名面向源站的 CA 策略源站、拦截链路或客户端配置

代理握手成功不等于源站身份正确。遇到稳定的主机名不匹配,也不应立即轮换住宅代理出口;这会把确定性的配置错误伪装成随机网络问题,并放大重试成本。

curl 8.22 安全测试矩阵

以下测试只应在自有或明确获授权的系统上执行,并使用隔离的测试证书与非生产端点。

  1. 运行 curl --version,同时记录 curl 版本和 TLS 后端。仅知道版本不够,本次变化针对的是 mbedTLS 构建。
  2. 先用名称匹配的证书,在证书链验证和主机名验证都开启时建立基线。
  3. 换成签发给另一个测试主机名的证书,保持两项验证开启,确认请求失败。
  4. 在隔离的回归用例中,仅关闭对端证书链验证,保持主机名验证开启。curl 8.22 的 mbedTLS 构建仍应拒绝错误名称。
  5. 对 HTTPS 代理名称与源站名称分别重复矩阵,并给每个结果标注 TLS 层。
  6. 分别测试新连接和可复用连接,避免把未重新握手误认为测试通过。
  7. 完成后立即恢复严格验证并删除临时例外。

使用 libcurl 时,还应记录源站选项与代理专用选项的最终有效值。诊断日志可保留目标别名、代理协议、错误码和后端类型,但不能记录代理密码、会话令牌或完整授权头。

正确处理失败,避免危险回退

主机名不匹配属于身份验证失败,不是代理池容量不足。正确动作是停止受影响链路,保存脱敏证据,并修正预期名称、证书部署或代理配置。

不要采用以下回退:

  • 在大量住宅出口上重复同一个名称不匹配请求;
  • 从 HTTPS 代理偷偷降级为未加密代理传输;
  • 为了“请求成功”同时关闭两项证书检查;
  • 未经策略批准绕过代理直连;
  • 在汇总成功率时忽略身份验证错误。

如果升级后原本“成功”的请求开始失败,应把它视为旧路径可能接受了错误身份的证据,优先修复证书与主机名,而不是锁定旧行为。

升级检查清单

  • 盘点所有 curl/libcurl 实例及其 TLS 后端。
  • 查找被关闭的证书链或主机名验证选项。
  • 区分代理 TLS 与源站 TLS 的独立配置。
  • 在预发布环境加入故意错误主机名的测试。
  • 确认身份错误不会触发出口轮换。
  • 确认日志会脱敏凭据、Cookie 和完整查询参数。
  • 覆盖连接复用、故障切换和恢复路径。
  • 生产环境保持两项验证开启。

还可结合证书固定缺失检查代理网关证书过期处置手册代理故障切换恢复演练代理绕过审计完成升级评估。

常见问题

curl 8.22 之后可以安全关闭对端验证吗?

不可以。主机名校验只覆盖身份判断的一部分,关闭证书链验证仍会失去重要信任控制。

这项变化影响所有 curl TLS 后端吗?

本次修复针对 mbedTLS。不同后端对异常组合的支持可能不同,因此必须记录并直接测试实际运行的后端。

主机名不匹配时应该轮换代理 IP 吗?

通常不应该。这类错误通常由 TLS 端点和预期名称决定,轮换出口不能修复身份配置,反而会制造噪声。

测试记录应保留什么?

保留 curl 版本、TLS 后端、有效验证设置、TLS 层、脱敏端点别名、错误码、时间和结论即可。不要保存密码、授权头或原始用户数据。

合规说明

仅对自有或已明确授权的基础设施执行证书与代理测试。生产流量应维持严格验证,只收集必要的诊断信息,不得通过代理轮换绕过访问控制或掩盖未授权行为。