本题只解答怎样保存证书错误类型而不关闭校验。可用的官方依据是 HTTP 状态码分类,它们表示请求是否完成,而不是提供关闭 TLS 校验的开关。因此“保存错误类型”是指:在保持校验开启的前提下,把失败记录成可复核的类别,尤其要区分尚未出现 HTTP 状态码的证书或握手失败,与已经出现 4xx 或 5xx 的应用层失败。资料没有关闭校验的配置项,下列步骤不得编造跳过验证的字段,也不得把未列出的状态码发明成证书错误编号。
适用条件:保存类型而不是关掉校验
适用条件是:现场需要留下证据,供稍后判断是证书问题还是 HTTP 问题,并且明确不关闭校验。若关闭校验,后续即使得到 200,也不能证明证书类型已被正确识别,因为成功只表示请求成功;GET 时资源在消息体中,它不回溯握手细节。若保持校验,成功类与重定向类只能在证书被接受后出现,因而 200、301、304、307 等可以作为“校验未关且握手通过”的记录,而不是作为关闭校验的理由。
客户端错误与服务器错误应原样保存。401 表示需要认证才能得到响应;407 类似但认证对象是代理;403 是身份已知但无权限;451 是法律原因不可用;500 是通用服务器错误;511 是需要认证才能获得网络访问。把这些写成证书错误会污染类型记录。资料说明未列出的响应可能是自定义非标准码,保存时应标记为非标准 HTTP 状态,仍然不算关闭校验,也不算证书时间类型。
用五类状态做记录模板
对每次失败保存四个字段:是否完成 HTTP、状态码数字、所属类别、原始方法。类别严格使用五类:信息 100–199、成功 200–299、重定向 300–399、客户端错误 400–499、服务器错误 500–599。若没有数字,保存类型为“无 HTTP 状态,疑似 TLS 或证书校验失败(校验仍开启)”,不要改写成已成功。若有数字,按清单含义注释:408 是空闲连接上服务器希望关闭未使用连接;429 是时间内请求过多;431 是请求头过大;413 是请求体过大;414 是 URI 过长;415 是媒体类型不支持;421 是误定向;426 需要升级协议。这些注释帮助以后的人不会把它们当证书类型。
网关类单独保存:502 表示作为网关得到无效响应;504 表示作为网关不能及时得到响应;503 表示未就绪,若有 Retry-After 应一并记下。重定向要保存是否改变方法:307、308 要求不得改变原方法;303 要求用 GET 另取。保存这些是为了证明校验仍在,因为跟随重定向前握手已成功。101 表示协议切换,是对 Upgrade 请求头的响应;426 则是拒绝当前协议并给出所需协议。二者都是 HTTP 层记录,保存它们可以避免下一步去关证书校验。100 表示中间响应,客户端应继续请求。103 主要用于 Link 与预加载。信息类出现时同样说明校验未阻止 HTTP 开始传输。
判断依据与失败时下一步
判断保存是否有效,看记录能否让第三人区分三类事实:无状态码的握手失败、4xx 条件失败、5xx 对端失败。若所有失败都被写成同一句证书错误,则保存失败。若记录里出现 200 却同时写已关闭校验,则与资料冲突,因为材料从不把关闭校验定义为成功含义。下一步:当类型是无 HTTP 状态时,保持校验,去核本机时钟与证书窗口是否错位,以及是否其实会在稍后出现 421 或 426;当类型是 401 或 407 时去处理认证;当类型是 502 或 504 时去查网关上游而不是关校验;当类型是 500 时只记通用服务器错误,不升格为证书类型。若重复请求得到 304,保存为缓存未修改,说明校验仍开启且条件请求完成。资料未提供把证书错误类型写入 Clash 配置文件的语法;失败时不要为了连通去关闭校验,只追加一条含类别与数字的记录,并继续用同一套五类标准复核。
资料:https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status