前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片NEW
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 业务场景题真实业务问题与追问
  • 查漏补缺常见问题解析
  • AI 模拟面试NEW模拟真实面试 + 报告
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
    • AI 定制路线NEW按你的简历现排
    • AI 知识地图NEW串起全站知识点
  • 动态
    • AI 热点NEWAI 每日动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
AI 助手NEW
旧版
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片NEW
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 业务场景题真实业务问题与追问
  • 查漏补缺常见问题解析
  • AI 模拟面试NEW模拟真实面试 + 报告
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
    • AI 定制路线NEW按你的简历现排
    • AI 知识地图NEW串起全站知识点
  • 动态
    • AI 热点NEWAI 每日动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
AI 助手NEW
旧版
  • HTTP

    • 基础篇

      • HTTP的前世今生
      • HTTP是什么
      • HTTP世界全览
      • HTTP分层
      • 键入网址到回车发生什么
      • HTTP报文是什么样子的
      • 理解请求方法
      • URI
      • 响应状态码
      • HTTP有哪些特点
      • HTTP优缺点
      • HTTP的实体数据
      • HTTP传输大文件
      • HTTP的连接管理
      • HTTP的重定向
      • HTTP的Cookie机制
      • HTTP的缓存控制
      • HTTP的代理服务
      • HTTP的缓存代理
    • 高级篇

    • 扩展篇

  • 浏览器相关

  • 计算机基础

完整面试题地址:
作者:程序员poetry
扫码关注作者公众号:「前端进阶之旅」 每天分享技术干货
前端进阶之旅公众号二维码

TLS1.3特性解析|HTTP协议篇

# TLS1.3特性解析

30 秒速记

  • TLS 1.3 是在 TLS 1.2 基础上的协议演进,目标是应对旧版本在现代互联网环境中的不足。
  • 本文把改进方向归纳为兼容性、安全性和性能三个方面。
  • 该版本经历约四年和近 30 个草案的迭代,并在 2018 年成为新的标准。
  • 本段只给出设计目标,未展开具体握手流程、算法变化或性能数据,回答时不应据此推导实现细节。

TLS 1.3 是针对旧协议在兼容性、安全性和连接时延方面不足所做的一次协议演进。 它经过约四年、近 30 个草案迭代,并由 RFC 8446 在 2018 年标准化;三项目标也会互相制约,例如握手格式变化可能被旧中间设备阻断。实际可用 curl 限定 TLS 1.3 验证当前客户端、网络和服务端能否协商,但成功并不能据此判断具体密码套件、恢复方式或握手次数。

不过 TLS1.2 已经是 10 年前(2008 年)的“老”协议了,虽然历经考验,但毕竟“岁月不饶人”,在安全、性能等方面已经跟不上如今的互联网了。

于是经过四年、近 30 个草案的反复打磨,TLS1.3 终于在去年(2018 年)“粉墨登场”,再次确立了信息安全领域的新标准。

在抓包分析握手之前,我们先来快速浏览一下 TLS1.3 的三个主要改进目标:兼容、安全与性能。

原理拆解: TLS 1.3 由 RFC 8446 在 2018 年标准化,它不是单纯增加一个版本号,而是围绕兼容性、安全性和连接时延重新约束协议。兼容性要求新客户端和服务器能够穿过大量按旧版报文编写的网络设备;安全性要求淘汰已经暴露风险或容易误配的旧机制;性能目标则是减少建立安全会话前必须等待的网络往返。三项目标彼此制约,例如改变握手外观可能更干净,却可能被只认识旧格式的中间设备阻断。

最小验证: 输入一个支持 HTTPS 的地址,强制 curl 只使用 TLS 1.3,验证客户端与服务端能否协商该版本,并观察实际协商结果:

url='https://example.com/'
curl --tlsv1.3 --tls-max 1.3 --verbose \
  --output /dev/null "$url" 2>&1 |
  grep -E 'SSL connection using|TLSv1\.3|HTTP/[123]'
@前端进阶之旅: 代码已经复制到剪贴板

--tlsv1.3 设置最低版本,--tls-max 1.3 排除降级到旧版本的可能;预期诊断信息中出现 TLSv1.3,随后出现 HTTP 响应协商或状态信息。命令成功只证明当前客户端、网络路径和目标站点可以使用该版本,不能单独证明其握手次数或算法集合。

边界与排查: 若本机 curl 所链接的 TLS 库不支持 TLS 1.3,命令会在发起有效握手前失败;若服务端仅开放旧版本,则会出现协议版本告警;代理、防火墙或企业中间人也可能改变结果。排查时先运行 curl -V 确认 TLS 后端,再对照不限定版本的请求,并结合抓包区分客户端能力、服务端配置和链路兼容问题。仅凭本段的三个设计目标,不能推导某次连接使用的具体密码套件或恢复方式。

面试官追问

追问 1产品经理看到安全评审写着“TLS 1.3 是新标准”,就要求把所有 TLS 1.2 请求直接标成安全事故,这个判定合理吗?
参考回答

不合理,材料只说明 TLS 1.2 在安全和性能方面逐渐跟不上需求,不能据此认定每条 TLS 1.2 连接都已失陷。应结合客户端覆盖、服务端配置和实际风险制定迁移策略,版本较旧只能作为风险信号,不能代替漏洞证据。

追问 2上线前你要验证支付页是否真的支持 TLS 1.3,同事只在浏览器地址栏看到锁标志就准备验收,你会补什么检查?
参考回答

锁标志只能说明当前页面建立了受信任的 HTTPS 连接,不能证明协商版本是 TLS 1.3。应使用 curl --tlsv1.3 --tls-max 1.3 --verbose 强制版本并查看诊断信息;成功也只覆盖当前客户端、链路和站点,不能代表全部用户环境。

追问 3公司要求新站点既提升安全性,又不能影响十年前的客户端和出口代理,你会承诺升级到 TLS 1.3 后两项目标必然同时满足吗?
参考回答

不能作无条件承诺,兼容、安全与性能正是彼此制约的三个目标。TLS 1.3 会通过协议设计降低旧中间设备的阻断风险,但客户端能力、代理行为和服务端配置仍需实测;必要的旧版本兼容还会扩大安全配置边界。

追问 4同一域名在开发机强制 TLS 1.3 成功,在企业办公网却握手失败,排障时你会先查服务端证书还是先区分链路问题?
参考回答

应先分层确认客户端、服务端和网络路径,而不是直接归因于证书。先运行 curl -V 检查 TLS 后端,再对照不限定版本的请求,并结合抓包观察协议告警;企业代理、防火墙或中间人都可能改变协商结果。

追问 5架构评审要求你仅凭“兼容、安全、性能”三个目标,确定线上连接采用的密码套件和会话恢复方式,你会如何收敛结论?
参考回答

仅凭三个设计目标无法推出某次连接的具体密码套件或恢复方式。应读取实际握手协商结果、服务端配置与抓包证据,再判断算法和连接状态;把设计目标当成运行事实,会掩盖降级、代理改写或配置偏差。

# 最大化兼容性

30 秒速记

  • TLS 1.3 为兼容大量只识别旧格式的中间设备,沿用了既有记录层结构,记录头中的版本值仍可表现为 TLS 1.2 的 0x0303。
  • 真实协议版本不再只看记录头,而由 Client Hello 和 Server Hello 中的 supported_versions 扩展协商并确认。
  • 客户端可以同时声明支持 TLS 1.3 和 TLS 1.2;服务器不支持新版时,握手仍有机会退回双方共同支持的旧版本。
  • supported_groups、key_share、signature_algorithms、server_name 等能力也通过扩展传递,使协议可以在保持基础格式稳定的同时继续演进。
  • 这种兼容设计解决的是已部署中间设备的协议僵化问题;抓包时若只读取头部版本字段,可能把一次 TLS 1.3 握手误判成 TLS 1.2。

TLS 1.3 通过保留旧记录层格式,并用扩展协商真实版本,尽量兼容已经部署的老设备。 记录头仍可能写成代表 TLS 1.2 的 0x0303,因为不少代理和网关无法识别新的头部版本。真正采用哪个版本,要看 Client Hello 和 Server Hello 里的 supported_versions,其他能力也通过扩展传递。抓包时不能只盯着记录头,否则很容易把 TLS 1.3 误判成 TLS 1.2。

由于 1.1、1.2 等协议已经出现了很多年,很多应用软件、中间代理(官方称为“MiddleBox”)只认老的记录协议格式,更新改造很困难,甚至是不可行(设备僵化)。

在早期的试验中发现,一旦变更了记录头字段里的版本号,也就是由 0x303(TLS1.2)改为 0x304(TLS1.3)的话,大量的代理服务器、网关都无法正确处理,最终导致 TLS 握手失败。

为了保证这些被广泛部署的“老设备”能够继续使用,避免新协议带来的“冲击”,TLS1.3 不得不做出妥协,保持现有的记录格式不变,通过“伪装”来实现兼容,使得 TLS1.3 看上去“像是”TLS1.2。

那么,该怎么区分 1.2 和 1.3 呢?

这要用到一个新的扩展协议(Extension Protocol),它有点“补充条款”的意思,通过在记录末尾添加一系列的“扩展字段”来增加新的功能,老版本的 TLS 不认识它可以直接忽略,这就实现了“后向兼容”。

在记录头的 Version 字段被兼容性“固定”的情况下,只要是 TLS1.3 协议,握手的“Hello”消息后面就必须有“supported_versions”扩展,它标记了 TLS 的版本号,使用它就能区分新旧协议。

其实上一讲 Chrome 在握手时发的就是 TLS1.3 协议,你可以看一下“Client Hello”消息后面的扩展,只是因为服务器不支持 1.3,所以就“后向兼容”降级成了 1.2

Handshake Protocol: Client Hello
    Version: TLS 1.2 (0x0303)
    Extension: supported_versions (len=11)
        Supported Version: TLS 1.3 (0x0304)
        Supported Version: TLS 1.2 (0x0303)

@前端进阶之旅: 代码已经复制到剪贴板

TLS1.3 利用扩展实现了许多重要的功能,比如“supported_groups”“key_share”“signature_algorithms”“server_name”等,这些等后面用到的时候再说。

面试官追问

追问 1监控平台把记录头 Version=0x0303 的十万条连接全部统计成 TLS 1.2,而浏览器面板显示其中包含 TLS 1.3,统计逻辑错在哪里?
参考回答

错误在于把记录层的兼容版本值当成最终协商版本。TLS 1.3 为穿过旧中间设备仍可能呈现 0x0303,应结合 Hello 中的 supported_versions 判断;只改展示文案而不改采集逻辑,历史报表仍会持续误分。

追问 2网关团队担心设备只认识旧记录格式,要求客户端把记录头直接改成 0x0304 来“明确启用 TLS 1.3”,你会接受吗?
参考回答

不会,这会破坏 TLS 1.3 为设备僵化环境保留的兼容外观,并可能让旧代理或网关直接拒绝握手。版本能力应通过 supported_versions 扩展表达,而不是强改记录头;即便保持旧格式,中间设备若错误处理扩展仍可能失败。

追问 3一个旧客户端会忽略不认识的扩展,新服务器又必须区分 TLS 1.2 与 TLS 1.3,双方的版本判断应落在哪个字段上?
参考回答

新协议的版本能力与选择应由 supported_versions 扩展承载,旧实现可忽略不认识的扩展并继续按旧协议处理。TLS 1.3 的 Hello 必须携带相应扩展,但最终是否使用 TLS 1.3 仍取决于服务端确认,不能只看客户端声明。

追问 4升级后只有经过某品牌企业代理的用户握手失败,直连请求正常;抓包时你会重点对比哪些位置?
参考回答

应对比直连与代理链路中的记录格式、Client Hello 扩展以及服务端返回的 supported_versions。若扩展被删除、改写或错误拦截,可将故障定位到中间设备兼容性;记录头仍是 0x0303 本身不是异常证据。

追问 5日志系统为了降低解析成本,只准备保留记录头版本和密码套件,不保存 supported_versions,这个取舍会带来什么后果?
参考回答

该方案无法可靠区分采用兼容外观的 TLS 1.3 与真正的 TLS 1.2,版本统计和降级告警都会失真。至少应保留双方的 supported_versions 及最终选择;代价是解析和存储字段增加,但能避免把兼容字段误作协商事实。

# 强化安全

← TLS1.2连接过程解析HTTPS的优化 →

fe
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片NEW
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 业务场景题真实业务问题与追问
  • 查漏补缺常见问题解析
  • AI 模拟面试NEW模拟真实面试 + 报告
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
    • AI 定制路线NEW按你的简历现排
    • AI 知识地图NEW串起全站知识点
  • 动态
    • AI 热点NEWAI 每日动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
AI 助手NEW
旧版
  • HTTP

    • 基础篇

      • HTTP的前世今生
      • HTTP是什么
      • HTTP世界全览
      • HTTP分层
      • 键入网址到回车发生什么
      • HTTP报文是什么样子的
      • 理解请求方法
      • URI
      • 响应状态码
      • HTTP有哪些特点
      • HTTP优缺点
      • HTTP的实体数据
      • HTTP传输大文件
      • HTTP的连接管理
      • HTTP的重定向
      • HTTP的Cookie机制
      • HTTP的缓存控制
      • HTTP的代理服务
      • HTTP的缓存代理
    • 高级篇

    • 扩展篇

  • 浏览器相关

  • 计算机基础