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);
.......
}
这将导致如下结果:
注意应用程序数据的多条记录,而不是一条。
当我这样做时,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);
.......
}
这将导致如下结果:
注意应用程序数据的多条记录,而不是一条。