OpenSSL和/或SSL / TLS协议是否提供某种内置保护以防止无限重新协商?
特别是,read()
是否可以永久执行,因为远程端(可能是恶意的)在不发送有效负载数据的情况下继续请求重新协商?
我很担心这个因为我想使用轮询机制从单个线程服务多个SSL连接,并且还确保一种形式的公平性,其中一个连接上的I / O处理不会导致我的饥饿/ O在其他连接上。
当我在非阻塞模式下调用套接字上的常规SSL_read()
时,我知道它不能永远执行,因为缓冲区最终会填满。
但是,由于EWOULDBLOCK
可以透明地处理重新协商,因此在我看来,如果远程端(可能是恶意的)继续请求重新协商而不发送有效负载数据,并且底层传输层足够快以进行基础读取写入永远不会失败SSL_read()
,然后SSL_write()
可能会永远执行,从而使其他连接匮乏。
因此我的问题是:OpenSSL或协议是否有避免这种情况的机制?顺便提一下,这个问题同样适用于SSL_read()
。
编辑:例如,在进行多次重新协商之前,我是否可以确保SSL_ERROR_WANT_READ
将返回SSL_ERROR_WANT_WRITE
/ EWOULDBLOCK
指示,即使基础读/写操作永远不会失败与BIO_s_socket()
?
编辑:出于这个问题的目的,假设我使用常规套接字BIO(ip: "192.168.10.10"
memory: 2048
cpus: 1
provider: virtualbox
authorize: ~/.ssh/id_rsa.pub
keys:
- ~/.ssh/id_rsa
folders:
- map: C:\Users\Lekz\development\projects\laravel
to: /home/vagrant/Code
sites:
- map: laravel.dev
to: /home/vagrant/Code/acctg_pending2/public
- map: homestead.app
to: /home/vagrant/Code/test/public
databases:
- addessa_acctg_pending
- testdb
# blackfire:
# - id: foo
# token: bar
# client-id: foo
# client-token: bar
# ports:
# - send: 50000
# to: 5000
# - send: 7777
# to: 777
# protocol: udp
)并且底层套接字处于非阻塞模式。
答案 0 :(得分:1)
OpenSSL中没有内置保护。但是您可以使用SSL_CTX_set_info_callback
或类似设置一个在每次协商时调用的函数。这样,如果在同一连接中发生过多的重新协商,则可以切断连接。有关详细信息,请参阅Protect against client-initiated renegotiation DoS in OpenSSL/Python。