You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用OpenSSL s_client发送0字节为何产生19字节负载?

关于OpenSSL s_client空负载发送的字节数疑问

我正在测试OpenSSL s_client,尝试发送有无填充的各类负载并分析栈跟踪输出。其中一个情况令我困惑:当发送无填充的空字节时,得到如下输出:

New, TLSv1.3, Cipher is TLS_AES_128_GCM_SHA256
Server public key is 2048 bit
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
Early data was not sent
Verify return code: 21 (unable to verify the first certificate)
---
write to 0x107ede0 [0x109a7f3] (24 bytes => 24 (0x18))
0000 - 17 03 03 00 13 a2 03 0c-67 c0 aa 77 08 7d 37 cb   ........g..w.}7.
0010 - 39 82 68 19 ba a2 39 bd-  

我使用的是16字节AEAD标签密码,由于内容类型字段为1字节,预期总负载大小应为16+1=17字节。但从栈跟踪可见,OpenSSL写入的记录头为17 03 03 00 13(即0x13=19字节)。为何实际发送19字节而非预期的17字节?这额外的两个字节是什么?


问题解答

这是OpenSSL针对TLS 1.3空记录的默认行为,额外的2字节是强制填充字段,具体说明如下:

  1. 兼容性适配逻辑:当发送空明文负载时,OpenSSL会自动添加2字节填充,目的是兼容部分老旧TLS实现——这类实现对仅含内容类型+AEAD标签的17字节短记录存在解析异常,添加填充可避免此类问题。

  2. 字节组成拆解:19字节负载的具体结构为:

    • 1字节内容类型(17,代表应用数据)
    • 0字节明文(你发送的空负载)
    • 2字节强制填充
    • 16字节AEAD标签

    1+0+2+16=19,完全匹配记录头中的0x13(19)。

若需禁用该行为,可通过修改OpenSSL编译选项或配置参数调整,但默认情况下,OpenSSL会对空记录自动添加这2字节填充。


内容的提问来源于stack exchange,提问作者Kiwi breeder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 19:50:13