2011-12-07 15 views
6

Tengo una aplicación multiproceso que hace un uso intensivo de OpenSSL en C. Está diseñado con la idea de que se espera que todas sus conexiones SSL se bloqueen. Específicamente, bloqueando BIOs. Todos ellos se asignan de un solo puerto de entrada como esta:Cambiar un OpenSSL BIO del modo de bloqueo al modo sin bloqueo

ssl = SSL_new(ctx); 
SSL_set_mode(ssl, SSL_MODE_AUTO_RETRY); 
sock = BIO_new_socket(socket, BIO_CLOSE); 
SSL_set_bio(ssl, sock, sock); 

como resulta, sin embargo, hay algunas pequeñas partes del código base donde el uso BIOs no-bloqueo sería la mejor opción. Las partes pequeñas que se beneficiarían de las BIO sin bloqueo no tienen forma de saber qué conexiones SSL les pertenecerán. Por lo tanto, siempre reciben BIO de bloqueo.

La pregunta es, ¿pueden los BIO de bloqueo ser no bloqueantes?

sé que BIO_set_nbio se puede utilizar para hacer una BIO no bloqueante pero la documentación dice:

se debe hacer la llamada a BIO_set_nbio() antes de establecer la conexión porque no bloqueo de E/S es establecido durante el proceso de conexión.

Otra posible opción que he pensado sería copiar el BIO y volver a crearlo, manteniendo de alguna manera todo el estado.

+0

No entiendo el problema que tiene. Es razonable que IO no bloqueante esté configurado cuando se establece la conexión y seguramente puede abstraer su código de una manera que maneje eso. –

+0

El problema es que es un _large_ cambio para que el IO no bloquee cuando se establece la conexión. – inthemedium

Respuesta

5

Hice conexiones SSL sin bloqueo en mi propio código "león", pero no utilicé la funcionalidad BIO en OpenSSL.

Más bien, fui por las llamadas SSL_set_fd(ctx, fd) y SSL_get_fd(ssl) para manejar mis propios fdsets y llamando select.

El mayor 'gotcha' que tardó un tiempo en rastrear fue establecer SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER y SSL_MODE_ENABLE_PARTIAL_WRITE para que funcione de la manera que yo quería.

Si desea leer la parte del código SSL, es aquí:

https://github.com/lundman/lion/blob/master/src/tls.c

Cuestiones relacionadas