He pasado bastante tiempo investigando cómo abordar este problema, pero aún no he podido encontrar una solución que funcione.
Problema:
Estoy usando la biblioteca OpenSSL y Linux. Tengo un proceso de servidor P1 que acepta la conexión SSL del cliente SSL. P1 hace tcp_accept() y luego SSL_accept() e intercambia algunos datos de protocolo con el cliente con SSL_read/SSL_write(). Todo está bien hasta este punto. Ahora, por diseño, P1 necesita bifurcar un proceso secundario C1 para servir al cliente desde este punto en adelante. C1 usa la llamada execve para volver a crear una imagen de sí mismo y generar un binario diferente. C1 aún necesita comunicarse con el cliente SSL a través de la misma conexión SSL que se usó en P1. El problema es que, dado que C1 es un proceso completamente diferente, ¿cómo puede reutilizar la conexión SSL existente para ese cliente? Puedo pasar el descriptor de socket TCP subyacente de P1 a C1, ya que se mantiene en el núcleo, pero no puedo pasar el contexto SSL ya que se mantiene en la biblioteca Openssl.
Vi esta banda de rodadura en stackoverflow pero desafortunadamente no se menciona ninguna solución. OpenSSL: acepte la conexión TLS y luego transfiera a otro proceso
Solución posible:
No estoy seguro de si alguien ya ha resuelto este tipo de problema, pero traté de seguir.
-
Pensé que podía crear un nuevo contexto SSL y renegociar SSL en el nuevo proceso secundario. Así que en C1 creé un nuevo contexto SSL sobre el mismo fd de socket tcp subyacente e intenté hacer una renegociación SSL. Esto es lo que hice (Omitiendo la parte de inicialización de SSL_ctx)
ssl = SSL_new(ctx) // ctx se inicializa igual que en el servidor P1
SSL_set_fd(ssl, fd); // fd es el socket tcp subyacente fd pasado de P1 a C1
SSL_set_accept_state(ssl);
SSL_set_verify(ssl, SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT, 0);
SSL_renegociar(ssl);
SSL_hacer_apretón de manos (ssl);
ssl->estado=SSL_ST_ACCEPT;
SSL_hacer_apretón de manos (ssl);
Pero la renegociación no tiene éxito y me devuelve un error interno de Openssl de la primera llamada SSL_do_handshake(). Ni siquiera estoy seguro de si esto realmente se puede hacer. La otra solución que se me ocurre es la siguiente.
- De alguna manera transfiera todo el contexto SSL para ese cliente de P1 a C1. ¿Qué tan eficientemente se puede hacer esto? Puedo pensar en la memoria compartida para esto, pero no estoy realmente seguro de qué estado interno mantiene OpenSSL que debe copiarse en la memoria compartida. Esta parece ser la solución más lógica, pero no tengo mucha información sobre el código OpenSSL para hacer esto.
¿Alguien se ha enfrentado a un problema similar y lo ha resuelto? Realmente apreciaré cualquier ayuda con respecto a esto.
Muchas gracias
¿Tiene alguna solución para este problema?, en caso afirmativo, dígame la solución.
– lucifer
27 de mayo de 2016 a las 9:55