访问配置源时若证书中的身份与请求所用主机名对不上,问题首先发生在 TLS 身份校验,往往还没有进入 HTTP 响应阶段。只有在握手已经完成、对端返回了状态码时,才适合用 HTTP 语义判断“请求打到了哪一个源”。证书域名不匹配不能靠跳过校验来“打通配置”;在已经拿到 HTTP 响应的前提下,应把 Host、URI 中的 authority 与状态码放在一起看,确认是请求被指错方向,还是源站拒绝处理该组合。
适用条件:先分清有没有 HTTP 状态码
证书主机名不匹配时,常见结果是连接在握手失败处终止,此时不存在 2xx 或 4xx 可解读。判断依据是:客户端是否已经读到以状态码开头的 HTTP 响应。没有状态码,就还停留在传输层身份问题,下一步是核对请求中的主机名是否确实是证书声明要保护的那个名字,而不是改写配置内容本身。已经出现标准状态码时,再按信息性、成功、重定向、客户端错误、服务器错误五类解释。
400 Bad Request 覆盖畸形语法、无效消息分帧以及欺骗性请求路由。当配置源 URL 的主机名与实际连上的服务不一致时,部分源站会把这种错向路由视为客户端错误。判断依据是:请求目标的 scheme 与 authority 是否仍指向你以为的配置源。下一步应先把主机名改回与证书主体一致的名字,而不是在错误主机名上反复拉取。
重点识别 421 与“源站能否为该 authority 作答”
421 Misdirected Request 明确表示:请求被导向了一个无法为该请求产生响应的服务器,常见于服务器未配置去响应请求 URI 中 scheme 与 authority 的组合。这与“证书上的名字对不上你正在请求的主机”高度同向:TLS 层拒绝的是身份,HTTP 层 421 拒绝的是“这个权威名根本不归我答”。判断依据是响应码为 421,且请求 URI 里的主机与当前 TCP/TLS 对端所声明的身份不是同一套。下一步是改回证书能够覆盖的主机名再取配置,而不是把同一份路径贴到另一个名字上重试。
若握手意外成功但内容不对,203 Non-Authoritative Information 表示返回的元数据并非源站原样,而是来自本地或第三方副本,多见于镜像。配置源场景下,它不能代替“证书名字匹配的源站”。200 OK 只说明“这一次 HTTP 请求在对端看来成功了”,成功含义还取决于方法:GET 才会在消息体中给出资源。证书名字错误时,即使偶发 200,也不能据此认为身份校验可以关闭。
3xx 中,301 Moved Permanently 与 308 Permanent Redirect 表示资源永久换了 URI;302 Found 与 307 Temporary Redirect 表示暂时更换。307 与 308 要求跟随重定向时不得改方法。配置源若返回这些码,应检查 Location 中的主机名是否仍能被同一张证书覆盖。若 Location 指向另一个名字而证书并不包含该名,TLS 会在下一次握手再次失败。305 Use Proxy 已因安全顾虑被废弃,不能作为绕过证书名字检查的依据。
失败时的下一步
401 Unauthorized 语义是未认证,须先认证再取资源,它不能解释证书主机名错误。403 Forbidden 是身份已知但无权限。404 Not Found 表示找不到资源,源站也可能用 404 代替 403 以隐藏资源是否存在,故 404 不能用来反推证书已经匹配。403 与 404 都假定 HTTP 已经发生,若实际仍是证书名字失败,这些码不会出现。
407 Proxy Authentication Required 要求向代理认证,与源站证书名字不是同一层。502 Bad Gateway 表示网关从上游拿到无效响应;504 Gateway Timeout 表示网关超时。它们说明中间设备没有得到可用上游结果,不能用来证明“跳过证书名字检查即可”。503 Service Unavailable 属于暂时不可用,若带 Retry-After,应以其估计时间为下一次尝试的依据,且通常不应缓存这类暂时响应。511 Network Authentication Required 表示需要认证才能获得网络访问,同样不能替代主机名校验。
处理原则是:证书域名不匹配时,以恢复“请求主机名、证书主体、URI authority 三者一致”为条件;只有在该条件满足且出现 2xx(或可缓存语义下的 304)时,才认为配置源请求在 HTTP 意义上完成。不要用关闭主机名校验去换取一次 200,因为 400 所列举的欺骗性路由和 421 所描述的错向请求,正是这种不一致应当被拒绝的原因。
资料来源
https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status