Openssl コマンド s_client は、常に 400 の誤った要求を表示します。

Openssl コマンド s_client は、常に 400 の誤った要求を表示します。

openssl s_clientオプションを使用してWebブラウザで正常に動作しているサーバーをテストしようとしていますが、opensslを使用して直接接続すると、400の誤った要求が返されます。

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を自分のホストに置き換えます...

答え1

~によるとhttps://bz.apache.org/bugzilla/show_bug.cgi?id=60695私のコマンドは次のとおりです。

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

ここで、-crlf は openssl コマンドの助けを借りて、次のことを意味します。

-crlf - LF を端末から CRLF に変換します。

その後、複数行のコマンドを入力することができ、最初のコマンドライン以降には「誤った要求」という応答がなくなります。

答え2

まあ、私も同じことを経験し、それを見つけるのに時間がかかりました。

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出力のみを見ることができます! :-(

echoコマンドにaを追加すると、この問題を解決できますsleep(角かっこが重要です)。

(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応答にのみ興味がある場合は、-quietほとんどのTLSノイズを隠し、-ign_eofオプションを設定するオプションを使用する方がよいでしょう。

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

答え3

OpenSSLを使用してGETリクエストを行うことができます。

openssl s_client -quiet -connect cdn.sstatic.net:443 <<eof
GET /stackexchange/js/universal-login.js HTTP/1.1
Connection: close
Host: cdn.sstatic.net

eof

「HTTP / 2」を使用することもできますが、一部のサーバー(github.comなど)ではこれをサポートしていません。

答え4

私が理解したのは、400 Bad RequestはGETラインのHTTP / 1.1の使用と関連している可能性が高いということです。

GETリクエストの後に「Host:」ヘッダを追加しましたか? RFCには、HTTP / 1.1の場合はHostヘッダーが必要であると指定されています。

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

19.6.1.1 マルチホームWebサーバーの簡略化とIPアドレスの変更の保存

最も重要な要件には、Host要求ヘッダーに対するクライアントとサーバーのサポート、Host要求ヘッダーがHTTP / 1.1要求から欠落している場合のエラー報告(セクション14.23)、および絶対URIの許可(セクション5.1.2)が含まれます。この仕様の定義が変更されました。

関連情報