在Openssl调用返回WANT_WRITE后,TLS Openssl连接中使用的TCP套接字变为可读

时间:2013-12-28 14:50:14

标签: ssl openssl

我正在尝试使用Openssl在C ++中通过TCP套接字创建通用TLS。套接字将用于运行选择循环并使用非阻塞I / O的程序中。

我担心在上一次SSL_get_error调用返回SSL_ERROR_WANT_WRITE之后底层TCP套接字变为可读的情况。我可以想到两种可能发生这种情况的情况:

  • 本地应用程序和远程应用程序同时决定发送大量数据。两个应用程序同时调用SSL_write,并且两个应用程序上的后续SSL_get_error调用都返回SSL_ERROR_WANT_WRITE。从两个应用程序发送的TCP数据包在线路上交叉。在上一次SSL_get_error调用返回SSL_ERROR_WANT_WRITE之后,本地应用程序的TCP套接字现在可以读取。
  • 如上所述,除了远程Openssl库决定在编写任何应用程序数据之前在SSL_write调用中执行SSL重新协商。这只是将本地应用程序的TCP套接字上收到的数据的含义从加密的应用程序数据更改为会话重新协商数据。

本地应用程序应该如何处理这些数据?它应该:

  • 打电话给SSL_write,因为它目前处于中间位置?
  • 如果套接字空闲,
  • 调用SSL_read会发生什么?

1 个答案:

答案 0 :(得分:0)

SSL_ERROR_WANT_READ和SSL_ERROR_WANT_WRITE可能由(重新)协商或完整套接字缓冲区引起,不仅可以在SSL_read和SSL_write中发生,还可以在非阻塞套接字上发生SSL_connect和SSL_accept。您所要做的就是等待所需的套接字状态(例如可读或可写),然后重复相同的操作。例如。如果从SSL_write获得SSL_ERROR_WANT_READ,则等待套接字可读(使用select,poll或类似),然后再次调用SSL_write。与SSL_read相同。

将SSL_CTX_set_mode与SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER | SSL_MODE_ENABLE_PARTIAL_WRITE一起使用也可能有用。