当我这样做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
或类似情况发生的地方。
我该怎么做呢?
答案 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);
.......
}
这将导致类似这样的事情:
请注意Application Data的多条记录,而不仅仅是那条记录。