【问题标题】:Blocking when invoking SSL_Read调用 SSL_Read 时阻塞
【发布时间】:2021-01-20 22:06:04
【问题描述】:

当前的 OpenSSL 版本是 1.1.1d。
我正在使用 SSL 到 TCP 套接字。
以下是相关来源。

...
...
    
struct  timeval tv;
fd_set  fdIn;

tv.tv_sec = 0;
tv.tv_usec = 10000;

FD_ZERO(&fdIn);

if ( SocketId > 0 ) {
    FD_SET( SocketId, &fdIn );
}

int retVal {0}, nflag {0};

while((retVal = select(FD_SETSIZE, &fdIn, nullptr, nullptr, &tv)) == -1
  && (errno == EINTR)) {
    .. TODO

}

if ( SocketId > 0 && FD_ISSET( SocketId, &fdIn ) ) {
    // This...
    int s = SSL_read(pSSL, pbuf, size);
}

...
...

源按预期运行。

但是,自1.1.1g编译使用后就出现了问题。
调用 SSL_Read 方法会导致阻塞几秒钟。

OpenSSL 库已编译。
编译时是否需要指定其他选项?
PS.在 CentOS 7 中测试。

【问题讨论】:

    标签: c++ ssl openssl centos


    【解决方案1】:

    调用 SSL_Read 方法会导致阻塞几秒钟。

    这并不罕见。通常SSL_readSSL_write 不能与select 一起使用,就像普通的readwrite 一样。以前的 OpenSSL 版本已经是这种情况,但现在使用 OpenSSL 1.1.1 处理 TLS 1.3 会话的情况更多,因为票证是在 TLS 握手完成后发送的。

    一般SSL_readSSL_write 需要与非阻塞套接字一起使用,并且需要检查SSL_WANT_READSSL_WANT_WRITE 的结果 - 并且需要根据这些“错误”采取行动”。这是因为 SSL 读取可能需要内部写入,而 SSL 写入可能需要内部读取。此外,除了select 之外,还需要使用SSL_pending,因为可能是来自先前SSL 帧的数据在本地SSL 对象中仍未读取,而select 只关心套接字而不关心内部缓冲区。

    【讨论】:

    猜你喜欢
    • 2018-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-10
    • 2013-11-16
    • 2014-06-24
    • 2015-09-19
    • 2019-02-14
    相关资源
    最近更新 更多