在非阻塞套接字上,使用openssl 0.9.8m及更高版本实现重新协商

时间:2012-10-01 16:28:40

标签: ssl openssl

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会返回相同的错误。

感谢任何输入

1 个答案:

答案 0 :(得分:0)

我猜您正在使用C.您必须检查错误代码并在最后保持会话状态。如果案例是成功或者需要读取或者需要写入,则必须调用相应的函数。最初将状态设置为needsAccept。 accept函数将根据会话自动决定是否需要读或写。

 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";
}