Estoy trabajando en una plataforma de mensajería segura y tengo problemas para descubrir cómo protegerme contra los ataques MITM.
Mi configuración actual se puede resumir de la siguiente manera: el servidor mantiene una clave privada y hace pública la clave pública que luego se puede instalar en los clientes. Al enviar datos al servidor, debe cifrarse con la clave pública, que luego se descifra en el servidor y se vuelve a cifrar con la clave privada antes de reenviarla al destinatario.
Esquema ASCII de la situación normal:
Remitente - Encrypted, can be intercepted but not deciphered
- > Servidor - Encryped with the private key, if intercepted can be broken since the public key is public
- > Destinatario
Solo a partir de esa información, deberíamos ver que la parte Sender- > Server es segura y que un hombre en el medio no haría nada (Intentar algo corromperá el protocolo y la conexión se terminará). Sin embargo, la parte Servidor > Destinatario no es segura contra ataques MITM ... ¡en absoluto!
Para empeorar las cosas, cuando se envían los datos, también se envían al remitente para confirmar que se enviaron, comprometiendo a ambos clientes con los ataques MITM.
Entonces, aquí está mi pregunta, en la conexión inicial, ¿cómo puede el servidor probar que es realmente el servidor real?
Escenarios de muestra:
Evil Server no debe pretender ser el Real Server Cliente - > Servidor malvado - > Servidor real
Real Server debe poder demostrar que él es, de hecho, Real Server. Cliente - > Real Server
Notas: Esto se hace sobre TCP. Estoy buscando una solución que no requiera una gran infraestructura, pero puedo permitir el uso de un par de servidores externos para verificar (sin embargo, estos también necesitarán una forma de probar su autenticidad).