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);
我正在用 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);