【问题标题】:Is it safe to do SSL_shutdown again if socket returns SSL_ERROR_WANT_READ or SSL_ERROR_WANT_WRITE如果套接字返回 SSL_ERROR_WANT_READ 或 SSL_ERROR_WANT_WRITE 再次执行 SSL_shutdown 是否安全
【发布时间】:2021-01-29 13:54:39
【问题描述】:

我正在尝试在非阻塞套接字上执行 SSL_shutdown。在下面的代码中,我在尝试 SSL_shutdown 后尝试轮询。

do {
    err = SSL_shutdown();
    if (err == 0) {
       // unidirectional shutdown success, will try SSL_shutdown once more and exit
    } else if (err == 1) {
       //shutdown complete. Exit
    } else {
       ec = SSL_get_error(ctx, err);
       if (ec == SSL_ERROR_WANT_READ) {
           rc = poll(fd, POLLIN|POLLPRI, timeout);
           if (rc > 0) {
               continue;
           } else {
               break;
           }
       } else if (ec == SSL_ERROR_WANT_WRITE) {
           rc = poll(fd, POLLOUT, timeout);
           if (rc > 0) {
               continue;
           } else {
               break;
           }
       } else {
           break;
       }
    }
} while(1);

在成功poll 之后,套接字是否可能是可写或可读的,并且触发关闭将再次 WANT_WRITE 或 WANT_READ。上面的代码会不会陷入死循环?

【问题讨论】:

    标签: c ssl openssl


    【解决方案1】:

    来自the official documentation

    如果底层 BIO 是非阻塞的,当底层 BIO 不能满足 SSL_shutdown() 继续握手的需要时, SSL_shutdown() 也会返回。在这种情况下,使用 SSL_shutdown() 的返回值调用 SSL_get_error() 将产生 SSL_ERROR_WANT_READ 或 SSL_ERROR_WANT_WRITE。 调用进程必须在采取适当的操作后重复调用以满足 SSL_shutdown() 的需要

    换句话说,它不仅安全而且是预期的。

    但请注意“...在采取适当的行动以满足 SSL_shutdown()...”的需求后...”。如果您的 SSL 对象由文件描述符隐式支持,那么它将自动执行必要的读取和写入。如果它仅由内存 BIO 支持,则这些读取和写入必须在您的代码中完成。从您的代码中不清楚它是否由内存 BIO 支持。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-14
      • 1970-01-01
      • 1970-01-01
      • 2011-04-03
      • 2019-03-23
      • 1970-01-01
      • 1970-01-01
      • 2011-12-10
      相关资源
      最近更新 更多