OpenSSL:无法通过FTPS检索LIST

问题描述 投票:1回答:1

我正在用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命令之前启动?任何其他建议也表示赞赏!

c++ ssl ftp openssl ftps
1个回答
0
投票

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

SSL_SESSION s = SSL_get_session(controlSsl);
dataSsl = BIO_get_ssl(dataBio);
SSL_set_session(dataSsl, s);
© www.soinside.com 2019 - 2024. All rights reserved.