SSLで保護されたWebサービスにアクセスしています。
一方で、openssl s_client
を使用してこのWebサービスにアクセスし、関連するhttp POSTリクエストをファイルhtml-request
からコピーすると、HTTP/1.1 200 OK
応答が返されます。
一方、SSLレイヤーにstunnel
を設定して(ローカルポート1443をリッスンし、暗号化されたトラフィックをサーバーに転送する)、次に
cat html-request | nc localhost 1443
サーバーはHTTP/1.1 400 Bad Request
で応答します。
どちらのツールもhtml-request
- fileのコンテンツを前処理しないと想定しました。しかし、この仮定は間違っているようです-さもなければ、私は両方のケースで同じ応答を得るでしょう。
2つの質問:
1)openssl s_tunnel
とnc
は、html-request
からの入力データの処理でどのように異なりますか?
2)楕円曲線の秘密鍵を使用していることを考慮して、openssl s_client
から暗号化されていないトラフィックの16進ダンプを取得する方法はありますか(wiresharkはトラフィックを復号化できないため)? -debugオプションは、暗号化されたトラフィックをダンプするようです。
どちらのツールも、暗号化された接続内のトラフィックを変更しません。したがって、問題はHTTPレイヤーで何が起こっているかとは関係ありません。したがって、要求している暗号化されていないデータを取得する方法があったとしても、それが役に立たない可能性があります。
ただし、TLSレイヤーで何が発生するかに関する別の説明が考えられます。 TLSのSNI拡張により、サーバーはクライアントにデータを送信する前に、クライアントは暗号化されていないホスト名をサーバーに通信できます。この拡張は、名前ベースのリバースプロキシ、および単一のIPアドレスからの異なる証明書を使用して複数のドメインをホストするサーバーに必要です。
セキュリティ上の理由から、Apache(および場合によっては他のHTTPサーバー)は、SNIを使用してホスト名を送信するすべてのクライアントがHTTPホストヘッダーで同じホスト名を繰り返すことを確認します。クライアントが同じホスト名を繰り返さない場合、Apacheはエラーコード400で応答します。
s_client
はデフォルトでSNIを使用しませんが、オンにするオプションがあります。また、s_client
にSNIフィールドで必要なものを送信するように指示できます。そうすれば、s_client
で400エラーを再現できます。
私は 1つのレポート についてstunnel
について誤ったSNIヘッダーを送信すると、同じ問題が発生していることがわかりました。
Wiresharkまたはその他のネットワークキャプチャユーティリティを使用して暗号化されたトラフィックを検査することにより、SNI(存在する場合)を使用して送信されているホスト名を確認でき、その方法で、表示されている問題がリンクされたSNIの誤った使用によるものかどうかを確認できます質問。