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()),并且基础套接字处于非阻塞模式。

最佳答案

OpenSSL中没有内置保护。但是您可以使用SSL_CTX_set_info_callback或类似的方法来设置一个在每次协商中都会调用的函数。这样,如果同一连接内发生过多的重新协商,则可以切断连接。有关更多信息,请参见Protect against client-initiated renegotiation DoS in OpenSSL/Python

10-06 12:50