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的主要内容,如果未能解决你的问题,请参考以下文章
Linux-SSL和SSH和OpenSSH,OpenSSL有什么区别