web-dev-qa-db-ja.com

openssl s_clientとstunnelの違い

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_tunnelncは、html-requestからの入力データの処理でどのように異なりますか?

2)楕円曲線の秘密鍵を使用していることを考慮して、openssl s_clientから暗号化されていないトラフィックの16進ダンプを取得する方法はありますか(wiresharkはトラフィックを復号化できないため)? -debugオプションは、暗号化されたトラフィックをダンプするようです。

1
DoRe

どちらのツールも、暗号化された接続内のトラフィックを変更しません。したがって、問題は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の誤った使用によるものかどうかを確認できます質問。

1
kasperd