首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SSL_shutdown()返回-1,且errno为0

问SSL_shutdown()返回-1,且errno为0
EN

Stack Overflow用户
提问于 2015-07-24 14:24:51
回答 1查看 1.8K关注 0票数 2

在我的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以找出原因。

shutdown.html

到目前为止上帝。这个问题发生在第二次调用SSL_shutdown()时。这将返回-1,这意味着发生了错误(参见上文)。现在,如果我检查SSL_get_error(),就会得到错误SSL_ERROR_SYSCALL,这反过来意味着已经发生了一个系统错误。但现在关键是。如果我检查errno,它将返回0 ->未知错误。到目前为止,我所读到的关于这个问题的内容是,这可能意味着服务器只是“挂断”,但老实说,这并不能让我满意。

以下是我关闭的实现:

代码语言:javascript
复制
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

那么,这里只是服务器关闭连接,还是有一个更关键的问题?我是不是错过了一些很明显的东西?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-24 14:35:14

SSL完全关闭由两部分组成:

  • 向对等方发送“关闭通知”警报
  • 接收来自对等方的“关闭通知”警报

第一个SSL_shutdown返回0,这意味着它确实向对等方发送了“关闭通知”,但尚未收到任何返回。第二个SSL_shutdown调用失败,因为对等方没有正确关闭SSL并发送“关闭通知”返回,而只是关闭了底层的TCP连接。

这种行为实际上是非常常见的,您通常可以忽略错误。不管怎么样,底层TCP连接是否应该关闭并不重要。但是,当您想要在同一个TCP连接上继续使用纯文本时,通常需要适当的SSL关机,就像FTPS连接中的CCC命令所需要的那样(但即使在那里,各种实现也无法正确处理这种情况)。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31613071

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档