Estoy tratando de probar un servidor que funciona normalmente en el navegador web, con la opción openssl s_client, conectándolo directamente mediante openssl devuelve la 400 Solicitud incorrecta:
openssl s_client -servername example.com -connect example.com:443 -tls1
(some information about the certificate)
GET / HTTP/1.1
(and the error occurs **immediately** - no time to include more headers like Host:)
Importante: ya traté de poner el encabezado Host: la cuestión es que cuando ejecuto GET, el error ocurre de inmediato y no me da la posibilidad de incluir más encabezados. Reemplazar example.com con mi host ...
echo
:echo -e "GET / HTTP/1.1\r\nHost: example.com.br\r\n\r\n" | openssl s_client ...
. Esto\r\n
es significativo porque eso es lo que dice hacer el estándar HTTP. Dos pares de CRLF al final de la solicitud también es importante porque eso es lo que el estándar dice que haga. Consulte también ¿Cómo canaliza "echo" en "openssl"?GET /index.html ...
que deba configurar una cookie. Probablemente debería tratar concurl
owget
, y después de la completa solicitud y respuesta, incluyendo el error. De lo contrario, debe proporcionar un nombre de servidor real y una URL para que podamos ejecutar las pruebas.Respuestas:
De acuerdo con https://bz.apache.org/bugzilla/show_bug.cgi?id=60695 mi comando fue:
donde -crlf significa, según la ayuda del comando openssl,
-crlf - convierte LF de terminal a CRLF
Entonces podría ingresar comandos multilínea y ninguna "solicitud incorrecta" como respuesta después de la primera línea de comando.
fuente
OK tuve lo mismo y me tomó un tiempo resolverlo.
No puedo encontrar una manera de enviar varias líneas en la solicitud cuando uso s_client de forma interactiva. Siempre envía la solicitud de inmediato tan pronto como ingrese la primera línea. Si alguien sabe cómo solucionar esto, ¡házmelo saber!
Editar : Veo que Wei ha publicado la forma de hacer esto: use la
-crlf
bandera pero deje esta respuesta aquí como un método alternativo.Mientras tanto, como sugirió jww, debe usar
echo
para esto:El siguiente problema es que, por defecto, openssl cierra la conexión cuando se cierra el archivo de entrada. Lo que se hace inmediatamente cuando se usa
echo
así. ¡Así que no tienes tiempo para ver la respuesta y solo ves la salida HECHO! :-(Puede agregar un
sleep
comando de eco para evitar esto (tenga en cuenta que los corchetes son importantes):O, mejor que eso, puede usar la
-ign_eof
opción para dejar la conexión abierta:O mejor aún, si solo le preocupan las respuestas HTTP, use la
-quite
opción que oculta la mayor parte del ruido TLS y también establece esa opción -ign_eof para usted:fuente
Por lo que puedo ver, es probable que la 400 Solicitud incorrecta esté relacionada con el uso de HTTP / 1.1 en su línea GET.
¿Agregó un encabezado "Host:" después de la solicitud GET? El RFC establece que para HTTP / 1.1, se requiere un encabezado de host:
https://www.ietf.org/rfc/rfc2616.txt
fuente
Puede emitir una solicitud GET con OpenSSL:
Tenga en cuenta que también puede usar "HTTP / 2", pero tenga cuidado porque algunos servidores (por ejemplo, github.com) no lo admiten.
fuente