系统时钟偏差会同时干扰证书有效期判断和带条件的 HTTP 请求。时间已经改回正确值之后,重新验证原请求的核心不是更换目标,而是用同一方法、同一 URI、同一套仍有意义的头再发一次,并根据是否出现标准状态码判断这次请求有没有真正完成。下列做法只适用于已经完成传输层握手、对端返回了 HTTP 响应的情况。若修正时间后仍停在握手阶段、没有任何状态码,应先核对本机时间是否落入证书有效窗口,而不能把问题直接当成 HTTP 语义错误。
适用条件与重发方式
重新验证前,先确认原请求仍然完整:方法未改、请求目标未改、必要的认证与内容协商头未无故丢弃。HTTP 响应按五类划分:信息性(100–199)、成功(200–299)、重定向(300–399)、客户端错误(400–499)、服务器错误(500–599)。判断依据是:修正时间后的这一次响应是否落在上述区间,以及该码在规范中的含义是否与“原请求”相符。未列入常见列表的码属于非标准或服务器自定义响应,不能按成功或失败去类推。
若对端先返回 100 Continue,表示客户端应当继续发送尚未完成的请求,或在请求已经结束时忽略这一中间响应。时间刚跳变时,长连接上容易残留“请求没发完”的状态。此时应按 100 的语义把原请求体发完,而不是改写成另一条新请求。101 Switching Protocols 只在客户端主动 Upgrade 时出现,与单纯重试验证无关,不应当成时间问题的修复信号。
用状态码判断原请求是否已经成立
收到 200 OK 表示请求已成功完成。成功的具体含义随方法变化:GET 表示资源已取回并出现在消息体中;HEAD 只带表示头、没有消息体。若原请求带条件且得到 304 Not Modified,说明资源未被修改,客户端可以继续使用同一份缓存响应。这本身就是一次有效的重新验证,不能因为没有消息体就当成失败。204 No Content 则表示没有正文可返回,但响应头仍可用于更新本地缓存中的头信息。
412 Precondition Failed 表示请求头里的前置条件服务器不满足。时间修正后,If-Unmodified-Since、If-Match 一类条件可能仍描述“时钟错误期间”的旧状态。判断依据是:条件头是否还指向修正前的日期或实体标签。下一步应去掉已失效的条件,或按服务器当前表示重建条件后再发同一目标。428 Precondition Required 表示源站要求请求必须带条件,无条件重放会被拒绝,应补上合理的条件头而不是改方法。
425 Too Early 表示服务器不愿冒险处理可能被重放的请求。时钟刚校正时,短间隔、同连接、同语义的立即重放最容易触发该码。判断依据是响应明确拒绝“过早”处理。下一步应避免把同一请求当作可任意重放的副本,而不是用更换方法来绕过。408 Request Timeout 可出现在空闲连接上,即使客户端尚未发出新请求。时间修正后若立刻看到 408,应视为对端收起闲置连接,下一步是新建连接再发原请求,而不是解释为资源消失。
失败时的下一步
400 Bad Request 指向畸形语法、无效消息分帧或欺骗性路由等客户端侧问题,应先核对请求行、Host 与 URI 是否仍一致。401 Unauthorized 在语义上是未认证,须先完成认证再取资源。403 Forbidden 表示身份已知但仍无权限,与时间修正无直接对应关系。404 Not Found 表示找不到资源;在 API 场景下也可能是端点有效但资源本身不存在。429 Too Many Requests 属于速率限制,应等待间隔后再重试原请求,而不是在同一时刻密集重发。417 Expectation Failed 表示 Expect 头中的期望无法满足,应检查是否仍携带已无必要的 Expect。
5xx 中,500 Internal Server Error 是通用服务器错误,不能单独证明时钟已修好或未修好。502 Bad Gateway 表示作为网关时拿到了无效上游响应。503 Service Unavailable 多为维护或过载,属于暂时状况;若带 Retry-After,应以其中的估计恢复时间作为下次重试依据,且这类暂时响应通常不应被缓存。504 Gateway Timeout 表示网关在时限内拿不到响应。505 HTTP Version Not Supported 则说明请求所用 HTTP 版本不被支持,与时间修正无关,应回到协议版本本身。
重新验证可以结束的条件是:同一原请求在时间修正后得到 2xx,或得到可解释的 304,或得到 3xx 并按 Location 以及“是否允许改方法”的规则跟随。若连续出现 408、425,或根本没有状态码,应把排查转回时钟、证书时间窗与连接复用,而不是继续改写原请求的方法或路径。
资料来源
https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status