Openssl SSL\u读取失败,出现SSL\u错误\u系统调用错误
我们已经使用openssl实现了tls。从服务器下载较大数据时,收到一些数据后,出现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帮助说明:
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);