HTTPS 协议数据格式详解
HTTPS(Hypertext Transfer Protocol Secure)是 HTTP 协议基于 TLS/SSL 协议的加密版本,其数据传输流程分为 TLS 握手阶段 和 加密数据传输阶段 ,整体数据格式可拆解为「TCP 层 → TLS 层 → HTTP 层」的嵌套结构。对于工业自动化、设备控制等场景(如 PLC/MES 系统数据传输),理解 HTTPS 数据格式有助于解决加密通信中的数据解析、调试及安全性问题。
一、HTTPS 整体传输架构
HTTPS 并非独立协议,而是在 HTTP 与 TCP 之间增加了 TLS/SSL 层 (负责加密、身份认证、完整性校验),数据流转顺序为:
plaintext
应用层(HTTP 数据)→ TLS 层(加密/封装)→ TCP 层(可靠传输)→ 网络层/物理层
对应的数据包结构(从外到内):
|------------|----------------------|----------------------|
| 层级 | 数据单元 | 核心作用 |
| TCP 层 | TCP 报文段(TCP Segment) | 端口寻址、可靠传输(序列号 / 确认号) |
| TLS 层 | TLS 记录(TLS Record) | 加密、身份认证、数据完整性校验 |
| 应用层 | HTTP 报文(请求 / 响应) | 业务数据传输(如设备指令、MES 数据) |
关键说明 :HTTPS 数据的核心是「TLS 记录」,所有 HTTP 数据都会被 TLS 层加密后封装为 TLS 记录,再交给 TCP 层传输。
二、核心组件:TLS 记录格式(TLS Record)
TLS 层是 HTTPS 加密的核心,所有传输的数据(包括握手信息、应用数据)都会被封装为 TLS 记录。TLS 1.2/1.3 记录格式基本一致(TLS 1.3 简化了部分字段),格式如下(按字节顺序):
|--------------------|----------------|---------------------------------------------------------------------------------------------------------------------------------------------------|
| 字段名称 | 长度(字节) | 说明 |
| Content Type(内容类型) | 1 | 标识 TLS 记录承载的数据类型,常见值:- 0x16:握手协议(Handshake)- 0x17:应用数据(Application Data,即加密后的 HTTP 数据)- 0x15:警报协议(Alert,如加密失败)- 0x14:更改密码规范协议(Change Cipher Spec) |
| TLS Version(版本) | 2 | TLS 协议版本,如:- 0x0303:TLS 1.2- 0x0304:TLS 1.3- (注意:TLS 1.3 仍使用 0x0303 作为兼容标识,实际版本通过握手消息协商) |
| Length(长度) | 2 | 后续「TLS 负载数据」的字节数(最大值为 16384,即 2^14) |
| TLS Payload(负载数据) | 可变(≤16384) | 加密后的实际数据(如 HTTP 报文、握手消息),格式由 Content Type 决定 |
示例:TLS 应用数据记录(加密后的 HTTP 数据)
假设传输的 HTTP 响应数据经 TLS 加密后为 0x...(加密后的字节流),则 TLS 记录格式为:
|--------------|-----------------|------------------------|
| 字段 | 数值示例 | 说明 |
| Content Type | 0x17 | 标识为应用数据(HTTP 加密后) |
| TLS Version | 0x0303 | TLS 1.2 版本 |
| Length | 0x0080(128) | 加密后的 HTTP 数据长度为 128 字节 |
| TLS Payload | 0x2F...(128 字节) | 加密后的 HTTP 响应数据(需私钥解密) |
三、TLS 握手阶段的数据格式(关键流程)
HTTPS 建立连接时,首先执行 TLS 握手(协商加密算法、交换密钥、身份认证),握手过程中传输的是「未加密的握手消息」(封装在 Content Type=0x16 的 TLS 记录中)。以下是 TLS 1.2 握手的核心消息格式(工业场景中仍广泛使用 TLS 1.2):
1. 握手消息的通用格式
所有握手消息都遵循以下结构(封装在 TLS 记录的 Payload 中):
|-----------------------|----------------|------------------------------------------------------------------------------------------------------------------------------------------------------|
| 字段名称 | 长度(字节) | 说明 |
| Handshake Type(消息类型) | 1 | 标识握手消息的类型,如:- 0x01:客户端问候(ClientHello)- 0x02:服务器问候(ServerHello)- 0x0B:证书(Certificate,服务器身份认证)- 0x10:密钥交换(ServerKeyExchange)- 0x0E:完成消息(Finished,握手结束) |
| Length(消息长度) | 3 | 后续「消息内容」的字节数(3 字节可支持最大长度 2^24-1) |
| Message Content(消息内容) | 可变 | 对应类型的具体数据(如客户端支持的加密算法列表、服务器证书链) |
2. 核心握手消息示例(ClientHello)
客户端发起连接时发送的第一个握手消息,格式如下(简化版):
plaintext
Handshake Type(0x01) + Length(消息总长度,如 0x000030) +
Version(TLS 版本,如 0x0303) +
Random(32 字节:4 字节时间戳 + 28 字节随机数) +
Session ID(会话 ID,可选,用于会话复用) +
Cipher Suites(支持的加密算法列表,如 TLS_RSA_WITH_AES_256_CBC_SHA256) +
Compression Methods(压缩算法,通常为 0x00 表示不压缩) +
Extensions(扩展字段,如 SNI 服务器名称指示、ALPN 协议协商)
工业场景意义 :握手阶段的证书验证(服务器发送 Certificate 消息)是设备与 MES / 云平台通信的安全基础,需确保客户端正确校验服务器证书的有效性(避免中间人攻击)。
四、加密数据传输阶段:HTTP 数据的封装流程
当 TLS 握手完成后,双方协商出会话密钥,后续所有 HTTP 数据都会被加密并封装为「Content Type=0x17」的 TLS 记录,流程如下:
1. HTTP 数据原始格式
HTTP 请求 / 响应的原始格式(与普通 HTTP 一致):
- HTTP 请求 :GET /api/device/status HTTP/1.1\r\nHost: mes-server.com\r\nAuthorization: Bearer xxx\r\n\r\n
- HTTP 响应 :HTTP/1.1 200 OK\r\nContent-Type: application/json\r\nContent-Length: 50\r\n\r\n{"status":"running","temperature":25.5}
2. TLS 加密与封装步骤
- 分段 :HTTP 数据若超过 16384 字节,会被拆分为多个片段(每个片段≤16384 字节);
- 压缩 :(可选)按握手协商的压缩算法压缩(工业场景通常禁用压缩,避免 CRIME 攻击);
- 加密 :使用会话密钥和协商的加密算法(如 AES-GCM、ChaCha20-Poly1305)加密数据,同时生成消息认证码(MAC)用于完整性校验;
- 封装为 TLS 记录 :将加密后的数据加上「Content Type=0x17」「TLS Version」「Length」字段,形成 TLS 应用数据记录;
- TCP 传输 :TLS 记录被封装为 TCP 报文段(添加源端口、目的端口、序列号等),通过网络传输。
3. 解密流程(接收端)
- 接收 TCP 报文段,提取 TLS 记录;
- 验证 TLS 记录的版本和长度合法性;
- 若为应用数据(0x17),使用会话密钥解密 TLS Payload;
- 验证 MAC 确保数据未被篡改;
- 提取解密后的 HTTP 原始数据,交给应用层解析。
五、TLS 1.3 与 TLS 1.2 数据格式差异(重点)
工业场景中部分新设备已支持 TLS 1.3,其数据格式有以下关键优化:
- 握手消息简化 :合并了多个握手消息(如 ServerHello 与密钥交换消息合并),减少往返次数;
- 加密范围扩大 :TLS 1.3 握手阶段的大部分消息(除 ClientHello/ServerHello)都被加密(TLS 1.2 握手消息仅 Finished 加密);
- 扩展字段增强 :强制支持 SNI、ALPN 等扩展,简化协议协商;
- 记录格式兼容 :TLS 1.3 的记录格式与 TLS 1.2 一致,仅通过扩展字段标识实际版本。
注意 :工业设备通信时,需确认 PLC/MES 系统支持的 TLS 版本,避免因版本不兼容导致数据解析失败。
六、工业场景常见问题与注意事项
- 数据长度限制 :TLS 记录的负载最大为 16384 字节,HTTP 大数据(如设备日志、批量生产数据)会被自动分段,接收端需按顺序拼接解密;
- 加密算法选择 :工业场景优先使用 AES-GCM(认证加密算法),避免使用过时的 DES、3DES 或 RC4 算法,同时禁用 SSLv3、TLS 1.0/1.1(存在安全漏洞);
- 证书与身份认证 :服务器证书需由可信 CA 签发(或设备间使用自签名证书并预先导入信任列表),避免因证书校验失败导致连接中断;
- 调试工具 :若需分析 HTTPS 数据,可使用 Wireshark(需导入会话密钥解密)、Fiddler(配置代理证书),但需注意工业网络的安全性(避免在生产环境随意抓包)。
总结
HTTPS 数据格式的核心是「TLS 记录」,其通过分层封装实现了 HTTP 数据的加密传输:
- 握手阶段:未加密的握手消息(0x16 类型)协商密钥和算法;
- 传输阶段:加密后的 HTTP 数据(0x17 类型)通过 TLS 记录传输,确保机密性、完整性和身份认证。
对于工业自动化领域的 C# WPF 开发者,理解 HTTPS 数据格式有助于实现设备与 MES / 云平台的安全通信、调试加密数据传输问题,以及合规性(如符合工业信息安全标准)。