En un protocolo de enlace SSL, el cliente y el servidor intercambian mensajes de protocolo de enlace que están codificados en registros . Si su variante de protocolo consiste en mensajes de intercambio de manos adicionales, entonces tiene un problema: al final de la negociación, se intercambian dos mensajes de Finished
, y su contenido se calcula como una función hash sobre todos los mensajes anteriores del protocolo de enlace , por lo tanto, incluyen sus mensajes adicionales Corolario: si tiene que insertar mensajes de enlace adicionales, DEBE modificar la herramienta de cliente SSL, porque esa herramienta calcula el hash y calculará un valor incorrecto si no está al tanto de sus mensajes adicionales.
Si su variante de protocolo consiste en registros adicionales de un tipo distinto de "registro para mensajes de intercambio" (escriba 22 en el estándar ), y de tal manera que los registros adicionales no afecten los cálculos del apretón de manos, entonces su estrategia de filtro podría funcionar. Tendrías que:
Interceptar conexiones ; hay varias formas de hacerlo, pero la más simple es cambiar la configuración y / o el DNS para que la máquina de origen se conecte no al servidor de destino, sino a un servidor propio, que a su vez se conecta al servidor adecuado y transmite los datos. en ambas direcciones.
Analice los datos para detectar los registros de intercambio, para saber dónde y cuándo deben agregarse sus mensajes adicionales en el flujo (y, de manera similar, los mensajes adicionales del servidor deben ser analizadas y eliminadas, para que la herramienta del cliente SSL no se atragante con ellas).
Así que estás en algo de programación. El protocolo de registro de SSL no es complejo, siempre que juegues con los registros de sin cifrar (aquellos antes de la finalización del protocolo de enlace); consulte la sección 6 del estándar . Además, consulte esta respuesta para obtener una introducción detallada sobre el protocolo (que creo que es más fácil de leer que el estándar ). Para la retransmisión, la estrategia de implementación más simple probablemente sería lanzar dos subprocesos, cada uno de los cuales se ejecutará en un bucle sin fin de lectura de una máquina a otra.