OpenSSL:无法通过FTPS检索LIST

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenSSL:无法通过FTPS检索LIST相关的知识,希望对你有一定的参考价值。

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

答案

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

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

以上是关于OpenSSL:无法通过FTPS检索LIST的主要内容,如果未能解决你的问题,请参考以下文章

SSL及使用openssl实现CA

Linux-SSL和SSH和OpenSSH,OpenSSL有什么区别

如何通过 SFTP 从服务器检索文件?

使用C#中的代理连接到FTPS

使用 jsch 到 ftps 到大型机计算机 - 无法连接 - 但 Filezilla 工作

OpenSSL:促使不安全的BIO保护它