HTTPS 与 TLS 握手

你在项目里更常遇到的是这些问题:

  • 浏览器突然提示"证书不受信任/域名不匹配/已过期"
  • 线上接口偶发失败,但服务端日志没什么异常(有时其实卡在握手/协商)
  • 你明明用了 HTTPS,为什么还能被劫持跳广告?
  • 面试问 TLS 握手,你能说流程,但解释不清"每一步在解决什么"

HTTPS/TLS 的关键不是把流程背下来,而是要能回答:

  • 它要防什么(窃听/篡改/冒充)
  • 它靠什么做到(证书身份 + 密钥协商 + 完整性校验)
  • 出了问题怎么证据化定位(用 openssl/curl/浏览器安全面板)

目录(按排查顺序)

    1. HTTPS 到底比 HTTP 多了什么
    1. TLS 握手要解决的 3 件事(你是谁/用什么密钥/数据没被改)
    1. 握手关键动作(不死背字段,但要讲清逻辑)
    1. 证书链验证:浏览器到底在信什么
    1. 证书、CA、链式验证
    1. 实战:如何验证证书/协议版本/加密套件,如何定位握手失败
    1. 最后总结

1. 一句话回答:HTTPS 是什么

  • HTTPS = HTTP + TLS
  • TLS 负责:
    • 身份认证(证书)
    • 加密传输
    • 数据完整性校验

所以 HTTPS 的目标不是"更快",而是:

  • 防窃听
  • 防篡改
  • 防冒充

2. 为什么不能只用对称加密

对称加密(AES 等)很快,但有个关键难题:

  • 密钥怎么安全分发?

如果你把对称密钥明文发给对方:

  • 中间人就能拿到
  • 之后照样能解密

所以 TLS 需要结合:

  • 非对称加密(用于安全协商密钥)
  • 对称加密(用于后续高性能数据传输)

3. TLS 握手解决的 3 个核心问题

你可以用"面试三连"回答:

  • 你是谁:服务端身份认证(证书 + CA)
  • 用什么密钥:协商出对称加密密钥(会话密钥)
  • 数据没被改:完整性校验(MAC/AEAD)

4. TLS 握手流程(以常见版本为例)

不同 TLS 版本细节不同,但面试一般不要求你逐报文背所有字段。

你只要把"核心动作"讲清楚:

4.1 ClientHello

客户端发起:

  • 支持的 TLS 版本
  • 支持的加密套件(cipher suites)
  • 随机数(client random)

4.2 ServerHello + 证书

服务端返回:

  • 选择的 TLS 版本与加密套件
  • 随机数(server random)
  • 服务端证书(含公钥)

4.3 客户端验证证书

客户端会验证:

  • 证书是否过期
  • 域名是否匹配
  • 是否由可信 CA 签发
  • 证书链是否完整

4.4 协商会话密钥

常见方式(面试表达即可):

  • 早期:RSA 交换
  • 现在更推荐:ECDHE(前向安全)

目标:

  • 双方最终计算出同一个对称会话密钥

4.5 Finished:切换到加密通信

握手完成后:

  • 后续 HTTP 数据用对称加密传输

5. 证书、CA、链式验证

为什么要证书?

  • 因为你不能只相信"我说我是某某网站"

证书的作用:

  • 把"域名/主体信息"与"公钥"绑定
  • 并由 CA 用私钥签名

浏览器为什么能验证?

  • 浏览器/系统内置了一批可信 CA 根证书
  • 通过证书链,一层层验证签名

面试加分点:

  • 证书只是证明公钥是谁的,不负责加密数据本身。

6. 实战:如何验证证书/协议版本/加密套件,如何定位握手失败

6.1 用浏览器快速确认:证书是谁签的、是否匹配域名

  • Chrome -> 点击地址栏小锁 -> 证书(Certificate)
  • 重点看:
    • 证书是否过期
    • 证书的 SAN(Subject Alternative Name)里有没有当前域名
    • 证书链是否完整、根证书是否受信任

6.2 用 openssl 把握手细节"证据化"

bash 复制代码
openssl s_client -connect example.com:443 -servername example.com

你通常关注:

  • 证书链(有没有中间证书)
  • 协议版本(TLS1.2 / TLS1.3)
  • cipher suite(加密套件)

6.3 用 curl 看一次请求里 TLS + HTTP 的组合表现

bash 复制代码
curl -v https://example.com/

你能看到:

  • 是否发生了证书校验错误
  • ALPN 协商结果(可能协商出 h2)
  • HTTP 状态码与响应头

6.4 常见"握手失败/证书报错"快速定位方向

  • 证书过期/域名不匹配:证书本身问题(更新证书/检查 CDN 回源域名)
  • 证书链不完整:服务端没下发中间证书(很多 Java/网关配置会踩坑)
  • 协议/套件不兼容:老客户端不支持 TLS1.3/某些套件,或服务端禁用了旧版本
  • 中间人/代理:公司代理/抓包工具会做"中间人证书",客户端不信任就会报错

7. 最后总结

7.1 什么是中间人攻击,TLS 怎么防?

  • 中间人想冒充服务端,把自己的公钥发给你。
  • 但它没有权威 CA 的签名证书(或证书链无法验证)。

所以浏览器会:

  • 验证证书链
  • 验证域名

验证失败就提示风险。

7.2 什么是前向安全(Forward Secrecy)

  • 使用 ECDHE 等临时密钥交换方式。
  • 即使服务端长期私钥泄露,历史会话密钥也不会被还原。

7.3 你可以这样总结(写在脑子里的版本)

HTTPS = HTTP + TLS。TLS 握手阶段核心解决三件事:确认服务端身份(证书链验证)、协商出会话密钥(通常 ECDHE)、保证握手过程与后续数据的完整性。握手结束后,HTTP 数据用对称加密传输保证性能;证书/CA 体系用来防止中间人冒充,ECDHE 提供前向安全。

相关推荐
沐浴露z2 小时前
详解 HTTPS之 TLS 证书信任链
网络协议·https·信任链
奥地利落榜美术生灬2 小时前
知识点总结(二)POSIX API 、 tcp/ip网络协议栈、dpdk
网络·网络协议·tcp/ip
卤炖阑尾炎2 小时前
Nginx 安全防护与 HTTPS 部署实战全解析
nginx·安全·https
Yan-英杰3 小时前
远程控制软件哪个安全?2026 ToDesk/向日葵/RayLink加密、隐私与防护全面对比评测
网络·人工智能·网络协议·tcp/ip·http
左左右右左右摇晃3 小时前
HTTP与HTTPS整理
笔记·http·https
爱丽_3 小时前
把 HTTP 讲清楚
网络·网络协议·http
遥遥晚风点点3 小时前
JAVA http请求报错:unable to find valid certification path to requested target
java·网络·网络协议·http
2501_916008894 小时前
移动应用上架到应用商店的完整指南:原理与详细步骤
android·ios·小程序·https·uni-app·iphone·webview
木井巳5 小时前
【网络原理】HTTP协议
java·网络·网络协议·http·fiddler