【发布时间】:2020-10-06 08:42:58
【问题描述】:
问题
我正在尝试通过使用 Wireshark 捕获它来分析使用 OpenSSL s_server 和 s_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 会话,无需任何票证。密码套件需要ECDHE-ECDSA-AES128-CCM8,客户端需要服务器验证。
为了排除源自网络的任何错误,我将环回地址分配给服务器。 loopback接口的MTU是65536,应该不是罪魁祸首。
不成功的尝试
我尝试在服务器和客户端上将标志max_send_frag、split_send_frags 和read_buf 设置为9000,但这也没有改变任何东西。但是,使用 TLS 1.2 可以在不分割服务器证书的情况下工作。很遗憾,我们的项目需要 DTLS。
【问题讨论】:
-
你用的是什么openssl版本?
-
版本:OpenSSL 1.1.1 2018 年 9 月 11 日
标签: openssl handshake dtls zephyr-rtos