SSL_read与SSL_ERROR_SYSCALL错误而失败(SSL_read failing w

2019-07-04 10:49发布

我们已经使用TLS OpenSSL的实现。 虽然从服务器下载较大的数据越来越SSL_ERROR_SYSCALL错误接收的一些数据之后。 对于较小的文件,我没有得到这个错误,能下载没有任何错误。 ERR_get_error()是表示零的文件。

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

Answer 1:

SSL_ERROR_SYSCALL表明,一些问题发生与底层的I / O(应该是TCP在这种情况下)。 所以,你可以尝试用错误号检查。

OpenSSL的帮助,说:

SSL_ERROR_SYSCALL

发生了一些I / O错误。 OpenSSL的错误队列可以包含关于错误的详细信息。 如果错误队列是空的(即ERR_get_error()返回0),RET可以用来找到更多关于该错误:如果保留== 0,一个EOF观察到违反协议。 如果沤== -1,潜在的BIO报告I / O错误(套接字I / Unix系统O,请参阅错误号的详细信息)。



Answer 2:

检查您是否具有为0的缓冲区大小调用SSL_read()我已经使用SSL_pending()以下错误:

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);

如果nBuf == bufSize SSL_read()将与0缓存大小是什么导致,并将errno == 0 SSL_ERROR_SYSCALL被调用。

更改doReadFd检查将避免这个问题:

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


Answer 3:

如果你考虑的源代码SSL_get_error()你会看到,它返回SSL_ERROR_SYSCALL时,它不知道到底发生了什么。 它基本上是默认返回代码为“未知”的情况。

例如,在我的情况(做非阻塞IO用BIO):

int buf;
const int n = SSL_read(ssl, &buf, 0);
const int err = SSL_get_error(ssl, n);
const int st = ERR_get_error();

n为0, errSSL_ERROR_SYSCALL只是因为。 然而st仍是0,表明没有真正的错误。 SSL_read因为0字节写入到刚刚返回0 buf

然而,寻找errno / WSAGetLastError()呼吁更多的细节后的值。



Answer 4:

问题是由被切断网络连接和服务器重新设置造成的。

只要确保连接下载数据之前确定。

类似的问题可以在这里使用的流浪汉时可以看到。

https://github.com/hashicorp/vagrant/issues/9612



Answer 5:

我发现这个问题是我公司的防火墙阻止请求。 回家,它应该工作



文章来源: SSL_read failing with SSL_ERROR_SYSCALL error
标签: openssl ssl