【问题标题】:OpenSSL: Specify packet size of application dataOpenSSL:指定应用程序数据的数据包大小
【发布时间】:2015-02-25 07:02:02
【问题描述】:

当我做这样的事情时,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 encryption openssl


【解决方案1】:

对于设计合理的应用程序,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 次读取。

【讨论】:

    【解决方案2】:

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

    这是一个代码 sn-p,从 s_client.c1662 行开始:

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

    这将导致如下结果:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-30
      • 1970-01-01
      • 1970-01-01
      • 2020-04-07
      • 1970-01-01
      • 2013-01-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多