【问题标题】:OpenSSL: cannot retrieve LIST via FTPSOpenSSL:无法通过 FTPS 检索 LIST
【发布时间】:2018-03-08 08:14:22
【问题描述】:

我正在用 C++ 开发一个简单的 FTPS 客户端。控制通道通信在 SSL 上工作得很好,但我在检索文件列表时遇到了问题。目前我正在执行以下顺序:

open control connection
AUTH TLS
do handshake on control connection
USER username
PASS password
PBSZ 0
PROT P
EPSV
open data connection
TYPE A
LIST
read data connection

如果我尝试直接创建 ssl 连接(在开放数据连接阶段),创建连接会失败。如果我创建连接但仅在发送 LIST 命令后才执行握手,则握手成功但客户端不会从服务器接收任何数据。这是我的数据连接打开逻辑(1 用于直接 ssl,2 用于按需握手):

SSL* ssl;
BIO* bioSsl;
int err;

SSL_CTX* ctx = SSL_CTX_new(SSLv23_client_method());
1) err = BIO_new_ssl_connect(ctx);
2) err = BIO_new_connect(host.c_str());
err = BIO_do_connect(bio);

2) bioSsl = BIO_new_ssl(ctx, 1);
2) bio = BIO_push(bioSsl, bio);
BIO_get_ssl(bio, &ssl);
SSL_set_mode(ssl, SSL_MODE_AUTO_RETRY);

读取数据连接是使用 BIO_read() 函数完成的。它总是返回 0(注意:我可以通过这种方式读取控制套接字并接收数据)。现有客户端能够从服务器检索文件列表,因此问题不在服务器端。谁能解释发生了什么,我在序列中做错了吗?如果在 LIST 命令之前启动,为什么数据连接上的握手会失败?任何其他建议也很感激!

【问题讨论】:

  • 嗯。你如何管理你的多个套接字? select?这有点像SSL_pending/select 问题。

标签: c++ ssl ftp openssl ftps


【解决方案1】:

我找到了答案。问题是,服务器需要在控制和数据连接之间重用 ssl 会话。添加(伪代码)后它工作了

SSL_SESSION s = SSL_get_session(controlSsl);
dataSsl = BIO_get_ssl(dataBio);
SSL_set_session(dataSsl, s);

【讨论】:

    猜你喜欢
    • 2012-12-24
    • 2019-09-02
    • 2013-02-13
    • 2023-03-21
    • 2019-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多