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

时间:2015-02-25 07:02:03

标签: 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/file全部归入一条SSL记录。我想以多个记录发送它。 我假设我必须修改apps/s_client.c,并找到SSL_write或类似情况发生的地方。

我该怎么做呢?

2 个答案:

答案 0 :(得分:2)

对于设计合理的应用程序,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请求标头(可能仍然将它们放在同一个TCP数据包中)。由于在许多SSL堆栈(如OpenSSL)上,一个SSL_read只读取一个SSL帧,这将导致读取完整HTTP请求所需的3次读取。

答案 1 :(得分:0)

好的,我发现我需要使用SSL_write更改我正在编写的字节数。

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

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);
      .......
}

这将导致类似这样的事情:

Notice the multiple records for Application Data instead of just the one

请注意Application Data的多条记录,而不仅仅是那条记录。