OpenSSL:指定应用程序数据的数据包大小

OpenSSL: Specify packet size of application data

当我这样做时,apps/openssl s_client -connect 10.102.113.3:443 -ssl3,客户端-服务器通信是使用 openSSL 创建的。

现在,我想将应用程序数据从客户端发送到服务器。例如,在执行 apps/openssl s_client -connect 10.30.24.45:443 -ssl3 之后,我得到这样的结果:

...certificate and session details...
---
GET /path/to/file

GET /path/to/file 都在一个 SSL 记录中。我想在多个记录中发送它。 我假设我必须编辑 apps/s_client.c,并找到 SSL_write 或类似发生的地方。

我该怎么做?

对于设计合理的应用程序,TCP 数据包大小和 SSL 帧大小应该无关紧要。但是有一些设计糟糕的应用程序期望在一次读取中获得像 HTTP 请求,这通常意味着它必须在同一个 SSL 框架内。如果您想 运行 针对应用程序进行测试以检查此类行为,您要么必须修补您的 s_client 应用程序,要么您可以使用其他东西,例如

#!/usr/bin/perl
use strict;
use IO::Socket::SSL;
my $sock = IO::Socket::SSL->new('www.example.com:443') or die "$!,$SSL_ERROR";
print $sock "GE";
print $sock "T / HT";
print $sock "TP/1.0\r\n\r\n";

这将在 3 个 SSL 帧内发送 HTTP 请求 header(它们可能仍会放在同一个 TCP 数据包中)。由于在许多 SSL 堆栈(如 OpenSSL)上,一个 SSL_read 只读取一个 SSL 帧,这将导致读取完整的 HTTP 请求需要 3 次读取。

好的,我发现我需要使用 SSL_write.

更改我正在写入的字节数

这是一段代码,从 s_client.c 的第 1662 行开始:

if (!ssl_pending && FD_ISSET(SSL_get_fd(con),&writefds))
{
      k=SSL_write(con,&(cbuf[cbuf_off]), (unsigned int)cbuf_len);
      .......
}

要使 application data 在多条记录中发送,而不仅仅是一条记录,请更改 SSL_write 中的最后一个参数。

例如,这样做:

if (!ssl_pending && FD_ISSET(SSL_get_fd(con),&writefds))
{
      k=SSL_write(con,&(cbuf[cbuf_off]), 1);
      .......
}

这将导致如下结果:

注意应用程序数据的多条记录,而不是一条。