Openssl SSL\u读取失败,出现SSL\u错误\u系统调用错误

Openssl SSL\u读取失败,出现SSL\u错误\u系统调用错误,openssl,ssl,Openssl,Ssl,我们已经使用openssl实现了tls。从服务器下载较大数据时,收到一些数据后,出现SSL\u ERROR\u SYSCALL错误。对于较小的文件,我没有得到这个错误,能够下载没有任何错误。ERR_get_error()对于较大的文件显示为零 我们使用Linux和C++框架。如何找到失败的原因?失败的原因可能是什么?请提供您的建议。SSL\u ERROR\u SYSCALL表示底层I/O出现了一些问题(在这种情况下应该是TCP)。因此,您可以尝试使用errno进行检查 OpenSSL帮助说明:

我们已经使用openssl实现了tls。从服务器下载较大数据时,收到一些数据后,出现
SSL\u ERROR\u SYSCALL
错误。对于较小的文件,我没有得到这个错误,能够下载没有任何错误。ERR_get_error()对于较大的文件显示为零


我们使用Linux和C++框架。如何找到失败的原因?失败的原因可能是什么?请提供您的建议。

SSL\u ERROR\u SYSCALL表示底层I/O出现了一些问题(在这种情况下应该是TCP)。因此,您可以尝试使用errno进行检查

OpenSSL帮助说明:

SSL\u错误\u系统调用

发生了一些I/O错误。OpenSSL错误队列可能会出错 包含有关错误的详细信息。如果错误队列为空 (即ERR_get_error()返回0),ret可用于查找更多信息 关于错误:如果ret==0,则观察到EOF违反 协议如果ret==-1,则底层BIO报告I/O错误(对于 Unix系统上的套接字I/O,有关详细信息,请参阅errno)


如果您查看
SSL\u get\u error()
的源代码,就会发现,每当它不确定到底发生了什么时,它都会返回
SSL\u error\u SYSCALL
。它基本上是“未知”案例的默认返回代码

例如,在我的情况下(使用BIO执行非阻塞IO):

n
为0时,
err
将是
SSL\u ERROR\u SYSCALL
。但是
st
仍将为0,表示没有实际错误
SSL\u read
刚刚返回0,因为0字节被写入
buf

但是,请在调用后查找
errno
/
WSAGetLastError()
值以了解更多详细信息。

检查是否调用缓冲区大小为0的SSL\u read()。我使用SSL_pending()时犯了以下错误:


该问题是由网络连接被切断和服务器重新设置引起的

下载数据之前,请确保连接正常

在使用“流浪者”时,也可以看到类似的问题


我发现问题在于我的公司防火墙阻止了这些请求。回家,它应该会工作

我们在Go应用程序中遇到此错误。我们使用第三方库从Go连接到底层openssl库。在读取数据时,第三方库将要读取的缓冲区/数据的长度转换为C.int,即32位。对于大于等于2GB的大数据,这将导致溢出,并将负值传递给C.SSL_读取函数。
在这种情况下,它引发了SSL\u ERROR\u SYSCALL ERROR。

谢谢,ERR\u get\u ERROR()返回0,那么在这种情况下,协议的定义是什么?可能有什么问题?可能根本没有任何协议冲突。大多数情况下,另一侧会关闭插座。好的。如果服务器在传输数据后立即关闭套接字,客户端可以做什么?我正在使用openssl进行tls实现。在收到SSL\u ERROR\u SYSCALL错误后,我正在使用Linux环境。我打印了errorno,它显示为errorno。@pavan我遇到了非常类似的症状-你找到原因了吗?你可以试试openssl用户列表。他们有时会遇到这样的问题,并解释如何获得更多信息、一些可能的原因和一些可能的修复方法。就目前情况而言,可能没有足够的信息可供他人帮助。
int buf;
const int n = SSL_read(ssl, &buf, 0);
const int err = SSL_get_error(ssl, n);
const int st = ERR_get_error();
int waitForReadFd = nBuf < bufSize;

if (waitForReadFd)
    FD_SET(fd, &rfds);

// ...
// select

int doReadFd = FD_ISSET(fd, &rfds) || SSL_pending(ssl);

if (doReadFd)
    n = SSL_read(ssl, buf, bufSize - nBuf);
int doReadFd = FD_ISSET(fd, &rfds) || nBuf < bufSize && SSL_pending(ssl);