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

OpenSSL:指定应用程序数据的数据包大小,ssl,encryption,openssl,Ssl,Encryption,Openssl,当我这样做时,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/fi

当我这样做时,
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\u client.c
,并找到发生
SSL\u写入
或类似情况的地方


如何进行类似的操作?

对于设计正确的应用程序,TCP数据包大小和SSL帧大小应该无关紧要。但也有一些设计糟糕的应用程序,它们希望在一次读取中得到类似HTTP请求的结果,这通常意味着它必须在同一个SSL帧中。如果您想对应用程序运行测试以检查这种行为,您必须修补
s_客户端
应用程序,或者使用其他方法,如

#!/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请求头(这些帧可能仍然放在同一个TCP数据包中)。由于在许多SSL堆栈(如OpenSSL)上,一次SSL读取只读取一个SSL帧,因此将导致读取完整HTTP请求所需的3次读取。

好的,我发现我需要使用
SSL写入
更改正在写入的字节数

这是一个代码片段,从
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);
      .......
}
要使
应用程序数据
以多条记录而不是一条记录的形式发送,请更改
SSL\u write
中的最后一个参数

例如,请执行以下操作:

if (!ssl_pending && FD_ISSET(SSL_get_fd(con),&writefds))
{
      k=SSL_write(con,&(cbuf[cbuf_off]), 1);
      .......
}
这将导致如下结果:

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


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

为什么?您无法控制TCP打包,也无法在接收端依赖它。