Respuesta diferente entre curl y openssl s_client

0

Me duele la cabeza con algunos resultados.

La ejecución del siguiente comando da como resultado una respuesta HTTP 200:

$ curl -v -L www.example.com >/dev/null

mientras ejecuta esto y utiliza los encabezados exactos que curlutilizan los resultados en una respuesta HTTP 403:

$ openssl s_client -connect www.example.com:443

No hay problema con el certificado, como curly opensslverificarlo. Realmente no puedo pensar en nada para comenzar a cavar este problema, ¡así que incluso una suposición descabellada es más que bienvenida!

La respuesta 403 proviene de los servidores Fortigaurd, que dice "Error del servicio de filtro web: todos los servidores Fortiguard no respondieron".

Puedo proporcionar más información, como curly opensslresultados, si es necesario.

vfsoraki
fuente
1
¿Estás seguro de que tienes los finales de línea correctos? La especificación HTTP requiere un retorno de carro seguido de una nueva línea después de cada línea. Solo usar una nueva línea no es correcto. También noté que no especificas -quieto -ign_eof. ¡Esto significa que s_clientanalizará su texto en busca de comandos como los Rque podrían aparecer en sus encabezados!
David Schwartz
@DavidSchwartz Gracias, no sabía sobre esos parámetros. Agregando -quiety -crlftampoco ayudó. Todavía obteniendo 403.
vfsoraki
@DavidSchwartz Estoy casi seguro. Usé emacs para cambiar todas las terminaciones y crlfluego las copié en mi sesión ssh dentro de la terminal. A menos que copiar / pegar no cambie las terminaciones de línea, todo debería estar bien.
vfsoraki
1
(1) Copiar / pegar en un terminal muy bien puede cambiar las terminaciones de línea; ponga su solicitud en un archivo (y use <file) para que pueda editar exactamente lo que desea. Asegúrese de incluir la línea vacía después del último encabezado (que es una parte vital del formato HTTP). (2) El servidor (o su interfaz) puede querer SNI, que s_clientno lo hace por defecto; Intenta agregar -servername $hostname.
dave_thompson_085
1
Su curlcomando está solicitando en el puerto 80 (HTTP), mientras que su opensslcomando está solicitando en el puerto 443 (con suerte configurado para HTTPS). Verifique la configuración de su servidor.
garethTheRed