Openssl

Openssl 命令 s_client 總是說 400 Bad Request

  • December 1, 2018

我正在嘗試使用 openssl s_client 選項測試在 Web 瀏覽器中正常工作的伺服器,使用 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 替換為我的主機…

根據https://bz.apache.org/bugzilla/show_bug.cgi?id=60695我的命令是:

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

其中 -crlf 表示,根據 openssl 命令的幫助,

-crlf - 將終端中的 LF 轉換為 CRLF

然後我可以在第一個命令行之後輸入多行命令並且不再有“錯誤請求”作為響應。

好的,我自己也有同樣的事情,花了一段時間才弄清楚。

互動式使用 s_client 時,我找不到在請求中發送多行的方法。只要您輸入第一行,它就會立即發送請求。如果有人知道如何解決這個問題,請告訴我!

編輯:我看到 Wei He 已經發布了這樣做的方法 - 使用-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 ...

引用自:https://unix.stackexchange.com/questions/370932