Openssl
Openssl 命令 s_client 總是說 400 Bad Request
我正在嘗試使用 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 ...