OpenSSL:无法通过 FTPS 检索 LIST

OpenSSL: cannot retrieve LIST via FTPS

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

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

后它起作用了
SSL_SESSION s = SSL_get_session(controlSsl);
dataSsl = BIO_get_ssl(dataBio);
SSL_set_session(dataSsl, s);