¿Debe TLS también aceptar mensajes no cifrados?

2

Un compañero de trabajo insiste en que TLS no puede configurarse para insistir en mensajes cifrados con claves / cifrados conocidos, es decir, que las solicitudes de texto sin formato siempre serán aceptadas. Esto dejaría a TLS sin poder rechazar solicitudes de usuarios no autorizados, dejando eso en la siguiente capa de la pila. (Y le preocupa que alguien, algún día, se olvide de cifrar un mensaje, exponer su token de sesión / identidad de usuario / lo que sea y se deje abierto a un ataque de hombre en medio).

Ciertamente, estoy dispuesto a creer que la máquina que probó estaba configurada para aceptar "ninguna" como protocolo de cifrado ... pero me cuesta un poco creer que TLS no ha proporcionado una manera estándar de insistir que las personas tomen precauciones razonables y solo un poco menos de problemas para creer que insistir en una conexión segura no es lo predeterminado.

Uno de nosotros está confundido. Cual?

    
pregunta Felix Domestica 14.09.2017 - 00:36
fuente

2 respuestas

3

La respuesta literal es no: TLS no acepta mensajes sin cifrar. Sin embargo, las preocupaciones de su colega no son infundadas. No sé si está confundido pero accidentalmente tropezó con una verdadera preocupación, o si entiende los problemas pero los explica de manera muy confusa.

Una conexión TLS siempre está encriptada (por lo que un hombre en el medio no puede leer los datos que se transmiten) y está protegida por integridad (por lo que un hombre en el medio no puede modificar los datos que se transmiten¹). Aunque la especificación TLS define un conjunto de cifrado "nulo", la mayoría de las aplicaciones no lo utilizarán, y no todas las bibliotecas TLS lo permiten. A menos que haga todo lo posible para habilitarlo tanto en el lado del cliente como en el del servidor, el conjunto de cifrado nulo no ocurrirá. Cada otro conjunto de cifrado tiene cifrado y protección de integridad.

La seguridad de TLS también se basa en que las dos partes se aseguren de que están hablando directamente entre sí. No habría seguridad si todo lo que sucediera es que el cliente legítimo tiene una conexión segura con el intermediario, y el intermediario tiene una conexión segura con el servidor legítimo. La forma en que funciona en la web (y en la mayoría de los demás usos de TLS) es que el cliente autentica el servidor al verificar que el certificado del servidor es válido. No voy a entrar en lo que significa "válido" aquí; en pocas palabras, el certificado debe ser criptográficamente consistente con la conexión (el cliente siempre lo verificará) y debe estar firmado por una autoridad de certificación en la que el cliente confía (este bit es un poco más frágil, pero funcionará si se proporciona utiliza un software razonablemente actualizado y configura el servidor correctamente).

Como de costumbre, todo esto está sujeto a mantenerse al día con las actualizaciones de seguridad en el software y a configurarlo correctamente. Algunas versiones anteriores del protocolo se han roto, es decir, no ofrecen las garantías para las que fueron diseñados. Pero mientras no ejecute software antiguo o habilite funciones obsoletas en la configuración del servidor, todo estará bien.

Entonces, ¿a qué se refiere tu colega?

  

alguien, algún día, se olvidará de cifrar un mensaje, expondrá su token de sesión / identidad de usuario / lo que sea, y se dejará abierto a un ataque de hombre en el medio

Esto puede suceder incluso si su servidor admite TLS. Un cliente podría enviar una solicitud HTTP en lugar de HTTPS. Luego, un atacante podría hacerse pasar por su servidor y ver los datos que el cliente envió a través de HTTP. No hay nada que el servidor pueda hacer para evitarlo por completo, pero hay cosas que puede hacer para que sea un problema discutible.

Lo primero que hay que hacer es dar solo las URL de las personas que comienzan con https:// . Eso no ayuda si la gente escribe la URL directamente.

Un lado de la moneda es configurar su servidor para que no responda a HTTP, excepto para redirigir al sitio HTTPS. En otras palabras, todo lo que sirve en el puerto 80 son redirecciones a https://same remainder of the URL . Además, comunique al cliente que debe usar HTTPS directamente la próxima vez, habilitando HSTS en la configuración de su servidor. HSTS hace que el servidor envíe al cliente una instrucción para usar siempre HTTPS para un sitio en particular en el futuro. De esta manera, solo la primera conexión de un cliente en particular podría estar en texto sin cifrar.

El otro lado de la moneda es proteger los datos confidenciales para que no se envíen a través de HTTP. No puede proteger las credenciales de los usuarios si insisten en enviarlos en texto claro, al igual que no puede evitar que un usuario abra su ventana y grite su contraseña a todos en la calle. Pero puede proteger las cookies que utiliza su aplicación: asegúrese de que todas sus cookies tienen la marca secure . De esa manera, si el usuario consigue que su navegador realice una conexión HTTP, el navegador no enviará las cookies.

¹ Excepción: un mitm puede forzar el cierre de la conexión a medio camino. En principio, esto es visible porque ocurre a nivel de TCP y ambas partes pueden decir que el nivel TLS no se terminó correctamente (por una alerta fatal), pero las aplicaciones como los navegadores generalmente no proporcionan ningún comentario al respecto, y es indistinguible de fallos de red que ocurren.

    
respondido por el Gilles 14.09.2017 - 11:02
fuente
1

El servidor está configurado para aceptar solo ciertos cifrados y los cifrados NULOS están configurados solo en prueba o configuración rota. E incluso si estuvieran configurados, el cliente también debe ofrecer estos cifrados, lo que también se hace solo en prueba o configuración rota. E incluso entonces, el servidor debe considerar estos cifrados como el mejor servidor de cifrado de clientes y servidores que necesita un servidor aún más roto.

Si el servidor no está configurado para admitir cifrados NULL, el cliente no puede obligarlo a usarlo. Similar si el cliente no ofrece estos cifrados, el servidor no puede elegirlo. Y fuera de los cifrados NULL no hay manera de transferir datos simples entre el cliente y el servidor.

    
respondido por el Steffen Ullrich 14.09.2017 - 06:44
fuente

Lea otras preguntas en las etiquetas