HTTPS(TLS 1.3)完整流程

一句话概括

HTTPS = HTTP + TLS。TLS 1.3 通过 ECDHE 协商共享会话密钥,通过数字证书和数字签名认证服务器身份,通过对称加密和 AEAD 认证标签保证数据机密性和完整性。


一、建立 TCP 连接

复制代码
Client ------------------------ Server 
         TCP 三次握手

TCP 建立成功后,开始 TLS 握手。


二、TLS 握手(TLS 1.3)

整个流程:

复制代码
Client                                            Server
  │                                                   │
  │-------------- ClientHello ----------------------->│
  │                                                   │
  │<------------- ServerHello ------------------------│
  │<--------- EncryptedExtensions --------------------│
  │<------------- Certificate ------------------------│
  │<---------- CertificateVerify ---------------------│
  │<--------------- Finished -------------------------│
  │                                                   │
  │---------------- Finished ------------------------>│
  │                                                   │
============== HTTPS连接建立成功 ======================

三、ClientHello

客户端发送:

复制代码
ClientHello
├── TLS Version
├── Client Random
├── Cipher Suites
├── KeyShare(ECDHE公钥)
├── SNI
└── Extensions

作用:

① 告诉服务器:

  • 支持哪些 TLS 版本
  • 支持哪些加密算法

② 把自己的 ECDHE 公钥发送过去。

注意:

这里不是发送共享密钥。


四、ServerHello

服务器返回:

复制代码
ServerHello
├── TLS Version
├── Server Random
├── Cipher Suite
└── KeyShare(ECDHE公钥)

至此:

双方拥有:

复制代码
Client
私钥A
公钥A

Server
私钥B
公钥B

双方计算:

复制代码
客户端:
私钥A + 公钥B

服务器:
私钥B + 公钥A

得到:

复制代码
共享会话密钥(Session Key)

注意:

共享密钥从未在网络上传输,而是双方各自计算出来。

此时开始:

复制代码
Handshake Key

用于加密后续握手消息。


五、Certificate(服务器证书)

服务器发送:

复制代码
Certificate
├── 域名
├── 公钥
├── 有效期
├── CA
└── CA签名

注意:

Certificate 已经使用 Handshake Key 加密传输。

客户端收到以后:

验证:

复制代码
CA是否合法
域名是否一致
证书是否过期
证书链是否可信

如果失败:

复制代码
TLS Alert

关闭连接

成功以后:

客户端得到:

复制代码
服务器公钥(PK)

六、CertificateVerify(身份认证)

这是很多面试官重点问的。

作用:

证明服务器真的拥有证书对应的私钥。

服务器首先计算:

复制代码
Handshake Transcript

就是:

复制代码
ClientHello
ServerHello
EncryptedExtensions
Certificate

所有握手消息。

注意:

不是字符串。

而是:

复制代码
每个Handshake Message完整二进制编码

然后:

复制代码
SHA256()

↓

Handshake Hash

例如:

复制代码
ABCD1234

服务器:

使用私钥:

复制代码
Sign(
ServerPrivateKey,
HandshakeHash
)

↓

Signature

发送:

复制代码
CertificateVerify
└── Signature

客户端:

已经拥有:

复制代码
Certificate里的公钥

因此:

复制代码
Verify(
PublicKey,
HandshakeHash,
Signature
)

如果:

复制代码
true

说明:

只有服务器拥有私钥。

服务器身份认证完成。


七、Finished(握手完整性校验)

CertificateVerify:

证明的是:

复制代码
服务器身份

Finished:

证明的是:

复制代码
双方拥有相同共享密钥

整个握手没有被修改

服务器:

利用:

复制代码
共享会话密钥

计算:

复制代码
verify_data =
HMAC(
HandshakeKey,
HandshakeHash
)

发送:

复制代码
Finished

客户端:

也计算:

复制代码
HMAC(
HandshakeKey,
HandshakeHash
)

一致:

复制代码
OK

否则:

复制代码
Alert

关闭连接

客户端随后也发送自己的 Finished,服务器完成相同验证。


八、开始发送 HTTP 数据

TLS 握手完成。

HTTP 请求:

复制代码
GET /index

不会直接发送。

而是:

复制代码
HTTP数据
      │
      ▼
AES-GCM
(SessionKey)
      │
      ▼
Ciphertext
Authentication Tag

发送:

复制代码
Ciphertext

Tag

九、HTTP 如何防止篡改?

很多人容易误认为:

用数字签名。

实际上:

不是。

TLS 1.3:

HTTP 数据:

使用:

复制代码
AES-GCM

或者

ChaCha20-Poly1305

属于:

复制代码
AEAD
Authenticated Encryption
with Associated Data

它一次完成:

复制代码
加密

+

认证

输入:

复制代码
SessionKey

Nonce

HTTP数据

输出:

复制代码
Ciphertext

+

Authentication Tag

服务器发送:

复制代码
Ciphertext

Tag

客户端:

重新计算:

复制代码
Tag

比较:

复制代码
收到Tag

==

重新计算Tag

一致:

复制代码
说明:

数据没有被修改。

否则:

复制代码
直接丢弃。

注意:

这里:

不是数字签名。

而是:

复制代码
Authentication Tag

十、HTTPS 中所有密钥的作用(重点)

密钥 谁拥有 用途
CA私钥 CA 签发证书
CA公钥 浏览器内置 验证证书
服务器私钥 服务器 CertificateVerify 数字签名
服务器公钥 Certificate 验证服务器签名
ECDHE临时私钥 双方各自 协商共享密钥
ECDHE临时公钥 双方交换 协商共享密钥
共享会话密钥(Session Key) 双方 加密握手消息、Finished 校验、加密 HTTP 数据

十一、面试最容易问的几个问题

① 为什么不用 RSA 加密 HTTP?

RSA 属于非对称算法,计算成本高,只适合身份认证和签名。HTTPS 使用 ECDHE 协商共享会话密钥,后续 HTTP 全部使用 AES-GCM、ChaCha20-Poly1305 等对称加密算法,因此性能更高。


② 为什么要 CertificateVerify?

因为证书是公开的,任何人都可以下载。

CertificateVerify 使用服务器私钥对握手消息摘要签名,客户端使用证书中的公钥验证,证明当前服务器真正拥有证书对应的私钥,而不是仅复制了一张证书。


③ 为什么握手消息也要 Hash?

因为要保护整个握手过程。

Handshake Hash 计算的是:

复制代码
ClientHello ||
ServerHello ||
EncryptedExtensions ||
Certificate
...

所有握手消息的完整二进制内容。

任何一个字段被修改,Hash 都会变化,CertificateVerify 和 Finished 验证都会失败。


④ HTTPS 如何保证三大安全目标?

安全目标 实现方式
身份认证 Certificate + CertificateVerify
数据机密性 ECDHE 协商共享会话密钥 + AES-GCM/ChaCha20-Poly1305 对称加密
数据完整性/防篡改 握手阶段:CertificateVerify + Finished;数据传输阶段:AEAD Authentication Tag

面试最终总结(60 秒)

HTTPS 本质是 HTTP + TLS。客户端首先发起 ClientHello,双方通过 ECDHE 交换临时公钥,各自计算出相同的共享会话密钥。随后服务器发送数字证书,客户端验证证书的 CA 签名、域名和有效期。接着服务器使用证书对应的私钥对握手消息摘要进行数字签名(CertificateVerify),客户端使用证书中的公钥验证,确认服务器确实拥有私钥。双方再通过 Finished 使用共享会话密钥验证整个握手过程未被篡改且共享密钥一致。握手完成后,HTTP 数据全部使用共享会话密钥通过 AES-GCM 或 ChaCha20-Poly1305 等 AEAD 算法进行加密,并自动生成认证标签(Authentication Tag),接收方验证认证标签后再解密,因此 HTTPS 同时实现了身份认证、数据机密性和数据完整性。

相关推荐
啊阿狸不会拉杆1 小时前
《计算机网络-自顶向下方法》5.4 ISP之间的路由选择:BGP 读书笔记
网络·计算机网络·接口隔离原则
袋鼠云数栈3 小时前
实时湖仓如何真正做到“数据够新”?
大数据·数据库·人工智能·数据治理
啊阿狸不会拉杆3 小时前
《计算机网络-自顶向下方法》4.6 小结、课后习题与Wireshark实验 读书笔记
计算机网络·wireshark·智能路由器
ACP广源盛139246256733 小时前
M6/M5 Pro Mac mini 端侧 AI 落地@ACP#YLB3116 中端多盘存储扩展在 AI 服务中的机会与应用场景
大数据·网络·数据库·人工智能·嵌入式硬件·macos
明月_清风3 小时前
MCP vs ACP vs LSP:AI 时代三大协议的「三足鼎立」
人工智能·网络协议·agent
ACP广源盛139246256734 小时前
M6/M5 Pro Mac mini 端侧 AI 新形态@ACP#GSV5800 Serdes 长距离视频传输在 AI 服务中的机会与落地场景
大数据·网络·数据库·人工智能·嵌入式硬件·macos·音视频
我爱cope4 小时前
【计算机网络 | 传输层3:TCP 协议概述:面向连接、可靠传输到底意味着什么?】
网络·网络协议·学习·tcp/ip·计算机网络·传输层
倔强的石头_5 小时前
事务边界与批量写入:避免长事务、锁等待和日志压力
数据库
努力努力再努力wz6 小时前
【Redis入门系列】从 KEYS 到 SCAN:渐进式遍历、Cursor 与位反转原理
数据库·redis·缓存
坐吃山猪6 小时前
【多线程】Lock与Condition
大数据·数据库