OpenSSL 服务器数据包被分割为每个数据包 270 个字节



问题
我正在尝试使用 OpenSSLs_server分析 DTLS 1.2 握手(通过 IPv6(,并通过使用 Wireshark 捕获它来s_client。握手按预期工作,但无论出于何种原因,服务器数据包都会被分割成极小的大小(270 字节(。

这是握手的流程,数据包大小在括号中:

Client                                        | Server
=========================================================================================
Client Hello (233)                            |
| Hello Verify Request (110)
Client Hello (253)                            |
| Server Hello, Certificate (Fragment) (270)
|
| Certificate (Fragment) (270)
| Certificate (Fragment) (270)
| Certificate (Fragment) (270)
| Certificate (Fragment) (270)
| Certificate (Fragment) (270)
| Certificate (Fragment) (270)
| Certificate (Fragment) (270)
| Certificate (Fragment) (270)
|
| Certificate (Reassembled),
| Server Key Exchange (Fragment) (270)
| 
| Server Key Exchange (Reassembled),
| Certificate Request (Fragment) (270)
|
| Certificate Request (Reassembled),
| Server Hello Done (235)
Certificate, Client Key Exchange,             |
Certificate Verify, Change Cipher Spec (1764) |
| Change Cipher Spec,
| Encrypted Handshake Message (129)
:
:

服务器似乎不会发送任何长度超过 270 字节的数据包。但是,可以清楚地看到,客户端没有这样的限制,并且在一个数据包中发送客户端证书。

如何复制行为
打开终端 (Ubuntu 18.04( 并使用此命令启动服务器:

openssl s_server -dtls1_2 -6 -no_ticket -cipher ECDHE-ECDSA-AES128-CCM8 -key <server_private_key>.key.pem -cert <server_certificate>.cert.pem -CAfile <ca_certificate>.cert.pem -Verify 5 -verify_return_error -accept [::1]:4444 -debug

打开另一个终端并启动客户端:

openssl s_client -dtls1_2 -6 -cipher ECDHE-ECDSA-AES128-CCM8 -cert <client_certificate>.cert.pem -key <client_private_key>.key.pem -CAfile <ca_certificate>.cert.pem -verify 5 -verify_return_error -connect [::1]:4444

该项目需要通过 IPv6 进行 DTLS 会话,无需任何票证。密码套件需要是ECDHE-ECDSA-AES128-CCM8,客户端需要由服务器验证。
为了排除源自网络的任何错误,我将环回地址分配给了服务器。环路接口的 MTU 为 65536,不应是罪魁祸首。

不成功的尝试我尝试
服务器和客户端上将标志设置为max_send_fragsplit_send_fragsread_buf到 9000,但这也没有改变任何东西。但是,使用 TLS 1.2 时,这不会对服务器证书进行分段。不幸的是,我们的项目需要DTLS。

这是由于s_server无法成功查询底层 MTU 导致的。原因是,默认情况下,s_server不会将基础套接字"连接到"客户端,因此任何查询 MTU 的尝试都会失败。

这个问题的答案是使用"-listen"选项来s_server。这会导致s_server在初始 ClientHello 发生后暂停握手,发现客户端的 IP 地址,并"连接"底层套接字。然后 MTU 查询成功,你看不到碎片。此选项可能应该是默认值。

最新更新