openssl - softpedia - ¿Hay alguna forma de eliminar el búfer de escritura SSL?
openssl softpedia (2)
Escribí un cliente SSL usando las API de OpenSSL para interactuar con un servidor SSL. En el sitio de OpenSSL, aprendí que el buffer de escritura debe enjuagarse después de escribir algunos datos. Estoy usando SSL_Write y SSL_Read en mi programa de cliente. Como el sitio OpenSSL sugirió que intenté eliminar los datos usando BIO_flush (BIO *), me estoy rompiendo aquí.
Estoy usando las bibliotecas SSL obtenidas de este sitio
Aquí no tengo claro si BIO_flush muestra el búfer de lectura o el búfer de escritura ... :-( Así que solo quería saber si hay otras formas de eliminar el búfer de escritura de SSL ...?
Aquí están los detalles sobre mi programa de cliente.
- Creando un objeto SSL (mSsl) usando SSL_new
- Crear un socket TCP y hacer conexión con el servidor
- Crear objetos BIO (mBio) usando BIO_new_socket (socket_id, BIO_NOCLOSE)
- Establecer el objeto BIO en el objeto SSL usando SSL_set_bio (mSsl, mBio, mBio);
- Configurar el socket al objeto SSL usando SSL_set_fd (mSsl, socket_id);
- Haciendo conexión SSL con el servidor usando SSL_Connect (mSsl);
Después de los pasos anteriores, estoy comenzando dos hilos separados para escribir y leer. El hilo de escritura usa SSL_write para escribir los datos en el servidor y Read thread usa SSL_Read para leer los datos del servidor.
En Escribir hilo después de escribir cada paquete usando SSL_Write estoy llamando BIO_flush (mBio).
En el programa completo, estoy usando directamente el objeto mBio solo en este lugar para realizar el lavado de bio buffer.
Cuando empiezo a enviar algunos paquetes, el programa se bloquea en BIO_flush ... Según el volcado, dice que está en la función BIO_ctrl. No estoy obteniendo nada más que eso.
¿Alguien usó la biblioteca que he proporcionado anteriormente y enfrenta el mismo problema ...? En caso afirmativo, avíseme si conoce la solución.
¿Hay alguna regla de sincronización de subprocesos para usar BIO_flush () ...? Me refiero a que llamar a BIO_flush SSL_Read no debería ocurrir al mismo tiempo así ...?
¿Dónde aprendiste que el buffer de escritura necesitaría enjuagarse después de una escritura?
También estaba buscando una función de descarga, pero no pude encontrar una.
Creo que funciona así: cada llamada a SSL_write produce al menos un registro SSL y lo emite al socket, donde el algoritmo nagle puede almacenarlo en el kernel por un momento y enviarlo rápidamente al exterior.
¡Así que no hay buffering en SSL_write y por lo tanto no hay descarga!
Prefiero tener una función de descarga y llenar todos los registros SSL hasta el borde, pero eso no está disponible por lo que veo. Ahora planeo hacer mi propio búfer y hacer llamadas tan grandes a SSL_write como sea posible.
Por cierto: acabo de escribir un pequeño programa de prueba: envía un búfer con una escritura y luego lo ejecuté nuevamente, llamando a SSL_write para cada personaje. Ambas veces ejecuté tcpdump y en Wireshark pude ver que la primera ejecución tenía pocos registros de datos de aplicaciones grandes y la segunda ejecución tenía muchos registros pequeños. Entonces creo que está confirmado.
BIO_flush se usa para vaciar datos de escritura.
Su combinación de BIO_flush y SSL_read / write es problemática porque la estructura BIO no conoce sus llamadas SSL_read / write.
Obtendrá mejores resultados al usar BIO_read / write.
Si necesita usar SSL_read / write, debe evitar el uso de BIO.
Creo que llegarás mucho más lejos con el ejemplo al final de esta documentación de OpenSSL.
Ejemplo simple de cliente OpenSSL
Si sigues teniendo problemas al probar ese ejemplo, es posible que tengas problemas con la compilación de biblioteca concreta que estás utilizando.