精通
英语
和
开源
,
擅长
开发
与
培训
,
胸怀四海
第一信赖
在我的C ++应用程序中,我使用OpenSSL非阻塞BIO连接到服务器。我正在为mac OS X和iOS开发。
第一次调用SSL_shutdown()返回0.这意味着我必须再次调用SSL_shutdown():
可能会出现以下返回值: 0关闭尚未完成。如果要执行双向关闭,则第二次调用SSL_shutdown()。SSL_get_error的输出可能会产生误导,因为即使没有发生错误,也可能会标记错误的SSL_ERROR_SYSCALL。 <0关闭未成功,因为在协议级别发生致命错误或发生连接失败。如果需要采取措施继续非阻塞BIO的操作,也会发生这种情况。使用返回值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;
}
}
运行应用程序日志时:
ERROR :: ssl shutdown错误,ssl错误:5,系统错误:未定义错误:0
那么这里只是服务器关闭连接还是存在更严重的问题?我只是缺少一些非常明显的东西吗?
完整的SSL关闭包括两部分:
- 向对等方发送“关闭通知”警报
- 从对等方接收“关闭通知”警报
第一个SSL_shutdown返回0,这意味着它确实向对等方发送了“关闭通知”但尚未收到任何回复。第二次调用SSL_shutdown失败,因为对等方没有进行正确的SSL关闭并发送回“关闭通知”,而是关闭了底层的TCP连接。
这种行为实际上非常常见,您通常可以忽略该错误。反正底层TCP连接无论如何都应该关闭,这就不影响。但是,当您希望在同一TCP连接上以明文形式继续时,通常需要正确的SSL关闭,就像FTPS连接中的CCC命令所需要的那样(但即使有各种实现也无法正确处理这种情况)。
我的连接在关机后完成。我不会再使用它了。所以它基本上是服务器只是“挂断”。我已经忽略了那个具体的错误。我只想了解它。谢谢内心