Intereting Posts
debian asus g551jm gnome 3 с использованием интегрированного gpu вместо nvidia сердцебиение останавливается после восстановления первичного узла Редактор Vi работает во время редактирования Получение 256 цветов для работы с byobu Как я могу получить команды sudo для использования настроек в /root/.bashrc Уязвимость призраков – перекомпилируйте программы C / C ++? Debian CrossGrading to amd64 – отключить перезагрузку Как Bash может определить, работает ли он из-за rsync поверх ssh? Файл ISO только для чтения? Выполняется ли xinitrc при входе в систему? Безопасно ли удалить файл сценария из этого скрипта? Проблемы, связанные с тем, что Debian получает IP-адрес от заданного адреса сервера, используя DHCP от сервера имен в сети Как открыть решение Visual Studio 2013 в MonoDevelop iptables пересылает трафик в vpn-туннель, если он открыт Как сбросить графические драйверы и восстановить значения по умолчанию?

Команда Openssl s_client всегда говорит 400 Bad Request

Я пытаюсь проверить сервер, который работает нормально в веб-браузере, с параметром 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 моим хостом …

Из того, что я вижу, 400 Bad Request, вероятно, будет связан с использованием HTTP / 1.1 в вашей линии GET.

Вы добавили заголовок «Хост:» после запроса GET? RFC заявляет, что для HTTP / 1.1 требуется заголовок узла:

https://www.ietf.org/rfc/rfc2616.txt

19.6.1.1 Изменения в упрощении многоуровневых веб-серверов и сохранении IP-адресов

Требования, которые клиенты и серверы поддерживают заголовок запроса хоста, сообщают об ошибке, если отсутствует заголовок запроса хоста (раздел 14.23) из запроса HTTP / 1.1 и принимают абсолютные URI (раздел 5.1.2), являются одними из самых важных изменения, определенные этой спецификацией.

У OK тоже было то же самое, и мне потребовалось время, чтобы разобраться.

Я не могу найти способ отправки нескольких строк в запросе при интерактивном использовании s_client. Он всегда отправляет запрос немедленно, как только вы ввели первую строку. Если кто-то знает, как обойти это, пожалуйста, дайте мне знать!

Тем временем, как было предложено, вы должны использовать echo для этого:

 echo -e "GET / HTTP/1.1\r\nHost: example.com\r\n\r\n" | openssl s_client ... 

Следующая проблема заключается в том, что по умолчанию openssl закрывает соединение, когда входной файл закрывается. Это происходит сразу же при использовании echo подобного этому. Таким образом, вы не получите время, чтобы увидеть ответ, а вместо этого просто увидите вывод DONE! 🙁

Вы можете добавить sleep к команде echo, чтобы обойти это (обратите внимание, что скобки важны):

 (echo -e "GET / HTTP/1.1\r\nHost: example.com\r\n\r\n"; sleep 10) | openssl s_client ... 

Или, лучше, вы можете использовать опцию -ign_eof чтобы оставить соединение открытым:

 echo -e "GET / HTTP/1.1\r\nHost: example.com\r\n\r\n" | openssl s_client -ign_eof ... 

Или еще лучше, если вас интересуют только ответы HTTP, используйте параметр -quite который скрывает большую часть шума TLS, а также устанавливает для вас параметр -ign_eof:

 echo -e "GET / HTTP/1.1\r\nHost: example.com\r\n\r\n" | openssl s_client -quiet ... 

Согласно https://bz.apache.org/bugzilla/show_bug.cgi?id=60695 моя команда была:

 openssl s_client -crlf -connect www.pgxperts.com:443 

где -crlf означает, в соответствии с помощью команды openssl,

-crlf – конвертировать LF из терминала в CRLF

Тогда я мог бы вводить многострочные команды и без «плохого запроса» в качестве ответа после первой командной строки.