View this PageEdit this PageUploads to this PageVersions of this PageHomeRecent ChangesSearchHelp Guide

SSL de forma asíncrona usando LibreSSL o OpenSSL

(cogido de un email de Darío a Carlos, modificado para que se entienda mejor)

La investigación sobre de sockets no bloquantes con SSL se hizo en el dgrpssl:
 3.0.1.3:/home/dario/Programacion/dgrpssl/dgrpssl.c

No usa las funciones BIO*

La parte importante para poder usar SSL de manera no bloqueante es lo que mencionan aquí:
With non-blocking sockets, SSL_WANT_READ means "wait for the socket to
be readable, then call this function again."; conversely, SSL_WANT_WRITE
means "wait for the socket to be writeable, then call this function again.".
You can get either SSL_WANT_WRITE or SSL_WANT_READ from both an SSL_read()
or SSL_write() call.


Básicamente:
  • si usas select() para saber cuándo hay cosas que leer o se puede escribir sin bloquear,
  • y sólo haces los SSL_read() cuando hay cosas que leer,
  • y haces los SSL_write() cuando sabes que puedes escribir sin bloquear,
  • ADEMÁS tienes que tratar SSL_WANT_READ en los SSL_write(); eso significa volver a llamar a SSL_write cuando se puede leer del socket.

Dicho de otra manera: El caso que no suele estar contemplado en los ejemplos sencillos de internet es que un SSL_write() puede devolver 0 y al mirar el error con un SSL_get_error() decirte que SSL_WANT_READ. Eso significa que para poder hacer la escritura necesitas que el socket haya notificado que tenga cosas para leer (ya sea porque está rotando las claves, o reinicializando la conexión SSL o alguna otra cosa).

No sé si las funciones BIO* permiten hacer escrituras asíncronas.

Tendría que verificar que el código del programa que he mencionado arriba está bien y que SSL_write() funciona de esa manera y no se requiere un SSL_read(), pero con estos datos se puede implementar perfectamente un programa que tenga cientos de conexiones simultáneas con SSL y que SSL no va a bloquear al hacer lecturas o escrituras. En el programa de arriba creo que suponía que tanto un SSL_read() como un SSL_write() valían para "desbloquear" la escritura por SSL_WANT_READ de un SSL_write. Lo dicho, tendría que verificarlo otra vez -- Darío.