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 安全测试矩阵
以下测试只应在自有或明确获授权的系统上执行,并使用隔离的测试证书与非生产端点。
- 运行
curl --version,同时记录 curl 版本和 TLS 后端。仅知道版本不够,本次变化针对的是 mbedTLS 构建。 - 先用名称匹配的证书,在证书链验证和主机名验证都开启时建立基线。
- 换成签发给另一个测试主机名的证书,保持两项验证开启,确认请求失败。
- 在隔离的回归用例中,仅关闭对端证书链验证,保持主机名验证开启。curl 8.22 的 mbedTLS 构建仍应拒绝错误名称。
- 对 HTTPS 代理名称与源站名称分别重复矩阵,并给每个结果标注 TLS 层。
- 分别测试新连接和可复用连接,避免把未重新握手误认为测试通过。
- 完成后立即恢复严格验证并删除临时例外。
使用 libcurl 时,还应记录源站选项与代理专用选项的最终有效值。诊断日志可保留目标别名、代理协议、错误码和后端类型,但不能记录代理密码、会话令牌或完整授权头。
正确处理失败,避免危险回退
主机名不匹配属于身份验证失败,不是代理池容量不足。正确动作是停止受影响链路,保存脱敏证据,并修正预期名称、证书部署或代理配置。
不要采用以下回退:
- 在大量住宅出口上重复同一个名称不匹配请求;
- 从 HTTPS 代理偷偷降级为未加密代理传输;
- 为了“请求成功”同时关闭两项证书检查;
- 未经策略批准绕过代理直连;
- 在汇总成功率时忽略身份验证错误。
如果升级后原本“成功”的请求开始失败,应把它视为旧路径可能接受了错误身份的证据,优先修复证书与主机名,而不是锁定旧行为。
升级检查清单
- 盘点所有 curl/libcurl 实例及其 TLS 后端。
- 查找被关闭的证书链或主机名验证选项。
- 区分代理 TLS 与源站 TLS 的独立配置。
- 在预发布环境加入故意错误主机名的测试。
- 确认身份错误不会触发出口轮换。
- 确认日志会脱敏凭据、Cookie 和完整查询参数。
- 覆盖连接复用、故障切换和恢复路径。
- 生产环境保持两项验证开启。
还可结合证书固定缺失检查、代理网关证书过期处置手册、代理故障切换恢复演练和代理绕过审计完成升级评估。
常见问题
curl 8.22 之后可以安全关闭对端验证吗?
不可以。主机名校验只覆盖身份判断的一部分,关闭证书链验证仍会失去重要信任控制。
这项变化影响所有 curl TLS 后端吗?
本次修复针对 mbedTLS。不同后端对异常组合的支持可能不同,因此必须记录并直接测试实际运行的后端。
主机名不匹配时应该轮换代理 IP 吗?
通常不应该。这类错误通常由 TLS 端点和预期名称决定,轮换出口不能修复身份配置,反而会制造噪声。
测试记录应保留什么?
保留 curl 版本、TLS 后端、有效验证设置、TLS 层、脱敏端点别名、错误码、时间和结论即可。不要保存密码、授权头或原始用户数据。
合规说明
仅对自有或已明确授权的基础设施执行证书与代理测试。生产流量应维持严格验证,只收集必要的诊断信息,不得通过代理轮换绕过访问控制或掩盖未授权行为。