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

В Solaris 10 вы, вероятно, используете xterm или gnome-terminal. Для xterm есть патч xterm # 196 и X11R6 xterm с небольшими исправлениями.

vim получает информацию о терминале из базы данных терминала. В определении xterm отсутствует определение для домашних / конечных ключей. Вот как это выглядит в формате terminfo:

#       Reconstructed via infocmp from file: /usr/share/lib/terminfo/x/xterm
xterm|vs100|xterm terminal emulator,
        am, km, mir, msgr, xenl,
        cols#80, it#8, lines#65,
        acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
        bel=^G, blink=\E[5m, bold=\E[1m, clear=\E[H\E[2J,
        cr=\r, csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=\b,
        cud=\E[%p1%dB, cud1=\n, cuf=\E[%p1%dC, cuf1=\E[C,
        cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A,
        dch=\E[%p1%dP, dch1=\E[P, dl=\E[%p1%dM, dl1=\E[M,
        ed=\E[J, el=\E[K, el1=\E[1K$<3>, enacs=\E(B\E)0,
        home=\E[H, ht=\t, hts=\EH, ich=\E[%p1%d@, ich1=\E[@,
        il=\E[%p1%dL, il1=\E[L, ind=\n, ka1=\EOq, ka3=\EOs,
        kb2=\EOr, kbs=\b, kc1=\EOp, kc3=\EOn, kcub1=\EOD,
        kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA, kent=\EOM,
        kf0=\E[21~, kf1=\E[11~, kf10=\EOx, kf2=\E[12~,
        kf3=\E[13~, kf4=\E[14~, kf5=\E[15~, kf6=\E[17~,
        kf7=\E[18~, kf8=\E[19~, kf9=\E[20~, rc=\E8, rev=\E[7m,
        ri=\EM, rmacs=^O, rmkx=\E[?1l\E>, rmso=\E[m,
        rmul=\E[m,
        rs1=\E>\E[1;3;4;5;6l\E[?7h\E[m\E[r\E[2J\E[H, rs2=@,
        sc=\E7,
        sgr=\E[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;m%?%p9%t^>
        sgr0=\E[m, smacs=^N, smkx=\E[?1h\E=, smso=\E[7m,
        smul=\E[4m, tbc=\E[3g,

Если бы в описании терминала были ключи home / end, они были бы перечислены как khome и kend соответственно.

Кроме того, строка инициализации rs1 включает режим приложения для клавиш курсора (который может включать 6-клавишную клавиатуру редактирования с Home и Конец клавиш). Это заставляет их отправлять префикс escape O .

vim ничего не знает об этой информации, поскольку он просто использует то, что может получить из базы данных терминала. Когда он видит последовательность символов , а не в базе данных терминала, он пытается интерпретировать этот символ за раз. escape-символ завершает режим вставки, но O «открывается» (начинает вставку), и вы получаете последний символ ключа, например, H или F . Повторное нажатие клавиши дает один F за нажатие (оставляя вас в режиме вставки после нажатия клавиши).

Правильным решением было бы исправить описание терминала, избегая необходимости отображать в вашем .vimrc , например,

infocmp >foo
vi foo
....adding this line (with a leading tab character):
        khome=\EOH, kend=\EOF,
sudo tic foo

Дополнительная литература:

9
16.06.2017, 23:30
3 ответа

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

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

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

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

После этого я мог вводить многострочные команды и больше не получать "неверный запрос" в качестве ответа после первой командной строки.

24
27.01.2020, 20:04

Хорошо, у меня было то же самое, и мне потребовалось некоторое время, чтобы разобраться.

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

Edit: Я вижу, что Вэй Хэ опубликовал способ сделать это - использовать флаг -crlf, но оставить этот ответ здесь в качестве альтернативного метода.

В то же время, как предложил jww, вы должны использовать 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 ...
8
27.01.2020, 20:04

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

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

.

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

19.6.1.1 Changes to Simplify Multi-homed Web Servers and Conserve IP Addresses

The requirements that clients and servers support the Host request- header, report an error if the Host request-header (section 14.23) is missing from an HTTP/1.1 request, and accept absolute URIs (section 5.1.2) are among the most important changes defined by this specification.

2
27.01.2020, 20:04

Теги

Похожие вопросы