Я пытаюсь протестировать сервер, который нормально работает в веб-браузере, с опцией openssl s_client, подключение его напрямую с помощью openssl возвращает 400 Bad Request:
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:)
Важно: я уже пытался поместить заголовок Host: дело в том, что когда я запускаю GET, сразу же возникает ошибка, и у меня нет шансов включить больше заголовков. Замените example.com моим хостом ...
echo
:echo -e "GET / HTTP/1.1\r\nHost: example.com.br\r\n\r\n" | openssl s_client ...
. Это\r\n
важно, потому что так говорит стандарт HTTP. Две пары CRLF в конце запроса также важны, потому что это то, что говорит стандарт. Также посмотрите, как вы отправляете «echo» в «openssl»?GET /index.html ...
или вам может понадобиться установить cookie. Вероятно, вам следует попробовать с помощьюcurl
илиwget
и опубликовать полный запрос и ответ, включая ошибку. В противном случае вы должны предоставить реальное имя сервера и URL, чтобы мы могли запустить тесты.Ответы:
Согласно https://bz.apache.org/bugzilla/show_bug.cgi?id=60695 моя команда была:
где -crlf означает, в соответствии с помощью команды openssl,
-crlf - конвертировать LF из терминала в CRLF
Тогда я мог бы вводить многострочные команды и не получать «плохой запрос» в качестве ответа после первой командной строки.
источник
Хорошо, у меня было то же самое, и потребовалось время, чтобы разобраться.
Я не могу найти способ отправить несколько строк в запросе при использовании s_client в интерактивном режиме. Он всегда отправляет запрос сразу же, как только вы ввели первую строку. Если кто-то знает, как обойти это, пожалуйста, дайте мне знать!
Редактировать : я вижу, Вэй Он опубликовал способ сделать это - использовать
-crlf
флаг, но оставить этот ответ здесь в качестве альтернативного метода.В то же время, как предложил jww, вы должны использовать
echo
для этого:Следующая проблема заключается в том, что по умолчанию openssl закрывает соединение при закрытии входного файла. Что делает сразу при использовании,
echo
как это. Таким образом, у вас нет времени, чтобы увидеть ответ, а вместо этого просто посмотреть на готово! :-(Вы можете добавить
sleep
команду echo, чтобы обойти это (обратите внимание, что скобки важны):Или, что еще лучше, вы можете использовать
-ign_eof
опцию, чтобы оставить соединение открытым:Или, что еще лучше, если вас интересуют только ответы HTTP, используйте
-quite
параметр, который скрывает большую часть шума TLS, а также устанавливает для вас этот параметр -ign_eof:источник
Вы можете отправить запрос GET с помощью OpenSSL:
Обратите внимание, что вы также можете использовать «HTTP / 2», но будьте осторожны, потому что некоторые серверы (например, github.com) не поддерживают его.
источник
Из того, что я вижу, 400 Bad Request, скорее всего, связано с использованием HTTP / 1.1 в вашей строке GET.
Вы добавили заголовок "Host:" после запроса GET? RFC утверждает, что для HTTP / 1.1 требуется заголовок Host:
https://www.ietf.org/rfc/rfc2616.txt
источник