使用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字节是强制填充字段,具体说明如下:
兼容性适配逻辑:当发送空明文负载时,OpenSSL会自动添加2字节填充,目的是兼容部分老旧TLS实现——这类实现对仅含内容类型+AEAD标签的17字节短记录存在解析异常,添加填充可避免此类问题。
字节组成拆解:19字节负载的具体结构为:
- 1字节内容类型(
17,代表应用数据) - 0字节明文(你发送的空负载)
- 2字节强制填充
- 16字节AEAD标签
1+0+2+16=19,完全匹配记录头中的
0x13(19)。- 1字节内容类型(
若需禁用该行为,可通过修改OpenSSL编译选项或配置参数调整,但默认情况下,OpenSSL会对空记录自动添加这2字节填充。
内容的提问来源于stack exchange,提问作者Kiwi breeder
相关产品推荐
相关产品推荐

