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)が含まれます。この仕様の定義が変更されました。