web-dev-qa-db-ja.com

相互認証されたSSL接続をスヌープするにはどうすればよいですか?

私たちの会社は、古いライブラリを介して外部サービスに接続します(古いバージョンのPHPの場合はPHP拡張機能を使用))。これには、このサービスとは別にサーバーをセットアップする必要があるため、同社に連絡して、拡張機能の新しいバージョンの可能性があるかどうかを尋ねましたが、残念ながらこの段階ではありません。

拡張機能は、クライアントごとに異なる証明書パスワードを持つ既知の共有クライアント証明書(すべてのクライアント用)を使用します。

プロトコルがどのように機能するかを知りたいので、最新のテクノロジーを使用して独自のライブラリを開発できる可能性がありますが、相互認証のため、トラフィックをスヌーピングする方法がわかりません。

議論のために、接続しているサービスがexample.comであるとしましょう(サーバーもSSL認証されていることに注意してください)。共有クライアント証明書とクライアント固有のパスワードが与えられている場合、このトラフィックをスヌープすることは可能ですか?これをどのように行うことができますか?

この拡張機能には特にLinuxOSが必要なので、可能であれば、ソリューションや提案をその環境に合わせて調整できれば非常に役立ちます。

1
mitchdav

もっと実用的な情報があるかもしれないので、 ReverseEngineering.SE を見てみることをお勧めします。また、製品ライセンスを確認し、法的なアドバイスを受けることをお勧めします。リバースエンジニアリングは、ソフトウェアの互換性を確保することに関しては(法的な観点から)通常は公正な慣行と見なされますが、多くの場合、灰色の領域であり、望まない場合があります。あなた自身またはあなたの会社を困らせてください。

アプリケーションはSSL相互認証を使用しています。つまり、サーバーはクライアントに対して自身を認証し、クライアントはサーバーに対して自身を認証し、両者間の通信は暗号化されます。

必要なのはSSLインターセプトと呼ばれます。

これは基本的に、サーバーのIDをクライアントに偽造し、クライアントのIDをサーバーに偽造し、その間の明確な形式で通信にアクセスする何らかの形式のプロキシを使用して行われます。

Normal communication:

CLIENT >client_cert>---------------------------------<server_cert< SERVER


Communication intercepted by a proxy:

CLIENT >client_cert>------<fake_server_cert< PROXY >client_cert>------<server_cert< SERVER

クライアントに対する偽のサーバーのID

これは通常、自分で制御するCA証明書(つまり、自分で作成し、関連付けられた秘密鍵を持っている証明書)をクライアントにインストールすることによって行われます。

次に、このCA証明書を、関連付けられた秘密鍵とともにプロキシにインストールします。これで、プロキシがこのCAを使用して生成および署名する証明書はすべて、クライアントによって信頼されます。特に、プロキシは本物のサーバー名を持つ新しい証明書を生成できるようになり、そのIDを事実上偽装します。

プロキシによって送信された証明書が実際のサーバーの証明書ではないことをクライアントが検出するために実行できる手段があることに注意してください。ただし、運が良ければ(つまり、開発者がアプリケーションを強化するための特定の手順を実行しなかった場合)、そのような手段があります。実装されません。

サーバーに対する偽のクライアントID

サーバーを制御できないため、関連する秘密鍵を含む本物のクライアント証明書が必要です。幸いなことに、あなたの投稿によると、それらを持っているようです。したがって、これらのクライアント証明書の1つをプロキシにインストールして、リモートサーバーに対して本物のクライアントとして自分自身を識別できるようにする必要があります。

2
WhiteWinterWolf