OpenSSL 和/或 SSL/TLS 协议是否提供某种针对无限重新协商的内置保护?
特别是,是否有可能SSL_read()
因为远程端(可能是恶意的)不断请求重新协商而不发送有效负载数据而永远继续执行?
我对此感到担心,因为我想使用轮询机制从单个线程为多个 SSL 连接提供服务,并确保一种公平形式,其中一个连接上的 I/O 处理不会导致 I/O 饥饿其他连接。
当我以非阻塞模式在套接字上调用常规read()
时,我知道它不能永远执行下去,因为缓冲区最终会填满。
但是,由于SSL_read()
可以透明地处理重新协商,在我看来,如果远程端(可能是恶意的)在不发送有效负载数据的情况下继续请求重新协商,并且底层传输层足够快以使底层读取和写入永远不会失败EWOULDBLOCK
,那么SSL_read()
可以最终永远执行,从而使其他连接挨饿。
因此我的问题是:OpenSSL 或协议是否有避免这种情况的机制?顺便说一句,这个问题同样适用SSL_write()
。
编辑:例如,我是否可以确定在进行多次重新谈判之前SSL_read()
会返回一个SSL_ERROR_WANT_READ
/SSL_ERROR_WANT_WRITE
指示,即使底层的读/写操作永远不会失败EWOULDBLOCK
?
编辑:出于这个问题的目的,假设我使用的是常规套接字 BIO ( BIO_s_socket()
),并且底层套接字处于非阻塞模式。