1

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

4

1 回答 1

1

OpenSSL 中没有内置保护。但是您可以使用SSL_CTX_set_info_callback或类似设置一个在每次协商时调用的函数。这样,如果在同一连接内发生过多的重新协商,您可以切断连接。有关更多信息,请参阅在 OpenSSL/Python 中防止客户端发起的重新协商 DoS

于 2016-10-03T04:34:34.077 回答