シナリオ:教室で信頼できる接続とSSLに関するいくつかの実験を実行しており、man-in-the-middle攻撃でのSSLハンドシェイク要求を示したいと思います。
自己署名証明書を備えたApacheサーバーがあります。すべて正常に動作しますが、SSL試行のリストを取得する方法がないため、ロギングは不完全なようです。クライアントが「例外」を受け入れると、すべてのリクエストに対して通常のアクセスログメッセージが表示されます。ただし、どのsslリクエストが失敗したのかを知る必要があります。これが私のログディレクティブです:
LogLevel警告ErrorLogログ/ ssl_error_logCustomLogログ/ ssl_access_logの組み合わせ#組み合わせは平均的なカスタムログです
私の望みは、試行されたすべてのSSLハンドシェイクのリストです。次のようなものを生み出す可能性のあるものが欠けていますか? (明らかに正確な言葉は必要ありませんが、球場にあります)
0/0/0 00:00:00-192.168.1.10-hijk.lmnop.edu-SSLの不一致
SSL接続には CustomLogの追加オプション がありますが、段階的な接続ステータスを分類することはありません。 LogLevel debug
を試してみたくなるかもしれませんが、それでは余分ながらくたがたくさん出てきます。
正直なところ、このクラスのより良いアイデアは、openssl s_server
コマンドを使用してデモンストレーションすることです。これは、SSLステートマシンの段階的な進行状況を表示するように構成できるため、次の場所で正確に確認できます。クライアントが接続を切断したステップ。
何かのようなもの
openssl s_server -key [somekey.pem] -cert [somecert.pem] -accept 443 -state -www
誰かが接続すると、接続の手順が印刷されます。
SSL_accept:before/accept initialization
SSL_accept:SSLv3 read client hello A
SSL_accept:SSLv3 write server hello A
SSL_accept:SSLv3 write certificate A
SSL_accept:SSLv3 write key exchange A
SSL_accept:SSLv3 write server done A
SSL_accept:SSLv3 flush data
SSL_accept:SSLv3 read client key exchange A
SSL_accept:SSLv3 read finished A
SSL_accept:SSLv3 write change cipher spec A
SSL_accept:SSLv3 write finished A
SSL_accept:SSLv3 flush data
-wwwオプションを使用すると、誰かが実際にWebブラウザで接続したときに情報が出力されます。ユーザーが偽の証明書を受け入れずに移動した場合、接続が途中で切断されると思います。
openssl s_client
コマンドも同様の方法で使用できますが、無効な証明書を受け入れるかどうかについて、どれほど柔軟かはわかりません。
証明書のネゴシエーションは、ブラウザとman-in-the-middle攻撃を実行しているプロキシの間で行われます。サーバー側で確認できる唯一の違いは、クライアントのIPです。
ただし、サーバーでは、クライアントを認証するようにクライアント証明書を構成できます。サーバーは、信頼できるクライアントからの接続のみを受け入れます。接続が改ざんされた場合、クライアント証明書は異なり、サーバーは接続を閉じます。