在我的C++应用程序中,我使用OpenSSL连接到使用非阻塞BIO的服务器。我正在为mac和iOS开发。
对SSL_shutdown()的第一个调用返回0。这意味着我必须再次打电话给SSL_shutdown():
可能会出现以下返回值: 0关机尚未结束。如果要执行双向关机,则第二次调用SSL_shutdown()。SSL_get_error的输出可能具有误导性,因为即使没有发生错误,也可能会标记错误的SSL_ERROR_SYSCALL。 <0关机不成功,因为在协议级别发生致命错误或发生连接故障。如果操作需要继续对非阻塞的BIOs操作,也可能发生这种情况。使用ret返回值调用SSL_get_error以找出原因。
到目前为止上帝。这个问题发生在第二次调用SSL_shutdown()时。这将返回-1,这意味着发生了错误(参见上文)。现在,如果我检查SSL_get_error(),就会得到错误SSL_ERROR_SYSCALL,这反过来意味着已经发生了一个系统错误。但现在关键是。如果我检查errno,它将返回0 ->未知错误。到目前为止,我所读到的关于这个问题的内容是,这可能意味着服务器只是“挂断”,但老实说,这并不能让我满意。
以下是我关闭的实现:
int result = 0;
int shutdownResult;
while ((shutdownResult = SSL_shutdown(sslHandle)) != 1) { //close connection 1 means everything is shut down ok
if (shutdownResult == 0) { //we are supposed to call shutdown again
continue;
} else if (SSL_get_error(sslHandle, shutdownResult) == SSL_ERROR_WANT_READ) {
[...] //omitted want read code, in this case the application never reaches this point
} else if (SSL_get_error(sslHandle, shutdownResult) == SSL_ERROR_WANT_WRITE) {
[...] //omitted want write code, in this case the application never reaches this point
} else {
logError("Error in ssl shutdown, ssl error: " + std::to_string(SSL_get_error(sslHandle, shutdownResult)) + ", system error: " + std::string(strerror(errno))); //something went wrong
break;
}
} 运行应用程序日志时:
错误::ssl关机错误,ssl错误: 5,系统错误:未定义错误:0
那么,这里只是服务器关闭连接,还是有一个更关键的问题?我是不是错过了一些很明显的东西?
发布于 2015-07-24 14:35:14
SSL完全关闭由两部分组成:
第一个SSL_shutdown返回0,这意味着它确实向对等方发送了“关闭通知”,但尚未收到任何返回。第二个SSL_shutdown调用失败,因为对等方没有正确关闭SSL并发送“关闭通知”返回,而只是关闭了底层的TCP连接。
这种行为实际上是非常常见的,您通常可以忽略错误。不管怎么样,底层TCP连接是否应该关闭并不重要。但是,当您想要在同一个TCP连接上继续使用纯文本时,通常需要适当的SSL关机,就像FTPS连接中的CCC命令所需要的那样(但即使在那里,各种实现也无法正确处理这种情况)。
https://stackoverflow.com/questions/31613071
复制相似问题