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

标签 openssl handshake dtls zephyr-rtos

问题
我正在尝试通过使用 Wireshark 捕获 OpenSSL s_servers_client 来分析 DTLS 1.2 握手(通过 IPv6)。握手按预期工作,但无论出于何种原因,服务器数据包都会被分割成极小的尺寸(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 session ,无需任何票据。密码套件需要为ECDHE-ECDSA-AES128-CCM8,并且客户端需要由服务器验证。
为了排除源自网络的任何错误,我将环回地址分配给服务器。环回接口(interface)的 MTU 为 65536,不应该是罪魁祸首。

不成功的尝试
我尝试在服务器和客户端上将标志 max_send_fragsplit_send_fragsread_buf 设置为 9000,但这也没有改变任何内容。但是,使用 TLS 1.2 可以在不分割服务器证书的情况下工作。不幸的是,我们的项目需要 DTLS。

最佳答案

这是由于 s_server 查询底层 MTU 失败造成的。原因是,默认情况下,s_server 不会将底层套接字“连接”到客户端,因此任何查询 MTU 的尝试都会失败。

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

关于OpenSSL 服务器数据包被分成每个数据包 270 字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62413602/

相关文章:

openssl - 创建证书时遇到"Error adding attribute"

ssl - Golang http客户端握手失败

ssl - 丢包时 DTLS 握手速度较慢

ssl - 如果我在两个端点进行 sip 通信时使用 TLS,TLS 是否同时加密 SIP 和 RTP?

java - 如何读取.pem文件来获取私钥和​​公钥

c - 使用 OpenSSL 进行 DSA 签名

Openssl PKCS#5/PKCS#7 填充

clientHello 后 SSL handshake_failure

windows - python : bad handshake error on get request when executed on windows but not linux

java - 如何在服务器端和客户端在java中使用TLS_PSK