2

openssl 在 0.9.8m 及更高版本中添加了安全重新协商。我该如何处理这种情况?在服务器中,使用非阻塞套接字,说 SSL_accept 完成。现在服务器将检查套接字是否变得可读。如果是这样,那么有两种可能性,要么套接字变得可读,因为客户端发送了一些请求,要么客户端重新协商了连接。SSL_MODE_AUTO_RETRY 不适用,因为我了解非阻塞套接字。如果客户端发送请求,则需要调用 SSL_Read。如果客户端重新协商,则必须调用 SSL_accept。如果我在客户端重新协商时调用 SSL_read,它会返回 SSL_ERROR_SSL。那么我如何确定我应该做 SSL_accept 还是 SSL_read。再次调用 SSL_read 会返回相同的错误。

感谢您的任何输入

4

1 回答 1

0

我猜您正在使用 C。您将不得不检查错误代码并在最后保持会话状态。如果案例是success 或needsRead 或needsWrite,您将不得不调用相应的函数。最初将状态设置为需要接受。接受功能将根据会话自动决定是否需要读取或写入。

 int retCode = SSL_get_error(ssl, retNum);
  switch (retCode) {
     case SSL_ERROR_NONE:
    return "success";
         case SSL_ERROR_WANT_READ:
    LOG_DEBUG("SSL_ERROR_WANT_READ");
    return "needsRead";

     case SSL_ERROR_WANT_WRITE:
    return "needsWrite";

    case SSL_ERROR_ZERO_RETURN:
    case SSL_ERROR_SSL:
    case SSL_ERROR_SYSCALL:
         return "socket should be closed";
}
于 2013-03-16T04:48:37.540 回答