Difference openssl s_client vs stunnel

1

Estoy accediendo a un servicio web protegido por SSL.

Por un lado, si accedo a este servicio web con openssl s_client , copiando la solicitud HTTP POST relevante de un archivo html-request , obtengo una respuesta HTTP/1.1 200 OK .

Por otro lado, si configuro la capa SSL con stunnel (escuchando en el puerto local 1443 y reenviando el tráfico cifrado al servidor) y luego uso

cat html-request | nc localhost 1443

el servidor responde con HTTP/1.1 400 Bad Request .

Supuse que ambas herramientas no procesan previamente el contenido del archivo html-request . Pero esta suposición parece ser errónea, de lo contrario obtendría la misma respuesta en ambos casos.

Dos preguntas:

1) ¿cómo difieren openssl s_tunnel y nc en el procesamiento de los datos de entrada de html-request ?

2) ¿hay una manera de obtener un volcado hexadecimal del tráfico no cifrado de openssl s_client , considerando que uso claves privadas de curva elíptica (por lo que wireshark no puede descifrar el tráfico)? La opción -debug parece volcar el tráfico cifrado.

    
pregunta DoRe 07.12.2016 - 17:09
fuente

1 respuesta

1

Ninguna de las herramientas modifica el tráfico dentro de la conexión cifrada. Entonces, el problema no está relacionado con lo que está sucediendo en la capa HTTP. Y así, incluso si hay una manera de obtener los datos sin cifrar que está solicitando, es probable que no le sirva de ayuda.

Sin embargo, hay otra explicación posible, que se relaciona con lo que sucede en la capa TLS. La extensión SNI para TLS permitirá que el cliente comunique el nombre de host sin cifrar al servidor antes de que el servidor envíe los datos al cliente. Esta extensión es necesaria para los proxies inversos basados en el nombre y para los servidores que alojan varios dominios con diferentes certificados de una sola dirección IP.

Por razones de seguridad, Apache (y posiblemente también otros servidores HTTP) verificará que cualquier cliente que envíe un nombre de host utilizando SNI repita el mismo nombre de host en el encabezado del host HTTP. Si el cliente no repite el mismo nombre de host, Apache responderá con un código de error 400.

s_client no usa SNI de forma predeterminada, pero tiene una opción para activarlo. Y puede indicar a s_client que envíe todo lo que desee en el campo SNI. De esa forma, podría reproducir el error 400 con s_client .

Encontré un informe sobre stunnel enviando un encabezado SNI incorrecto que causa el mismo problema que está viendo.

Al inspeccionar el tráfico cifrado mediante Wireshark o cualquier otra utilidad de captura de red, puede ver qué nombre de host se envía mediante SNI (si corresponde) y de esa manera verificar si el problema que está viendo se debe al uso incorrecto de SNI como en la pregunta enlazada.

    
respondido por el kasperd 07.12.2016 - 23:34
fuente

Lea otras preguntas en las etiquetas