HTTPSレスポンスを自由に差し替えるプロキシサーバ

HTTPSのレスポンスを差し替えるプロキシサーバを作成したので紹介します。
GitHubにGPL-3.0ライセンスで公開しているので、カスタマイズは自由に行ってください。
何かあれば気楽にPRください。

GitHub: https://github.com/fealone/dcoh

出来ること

サーバやクライアントアプリケーションのデバッグ

開発中のアプリケーションとAPIサーバが有り、クライアント側の挙動を確認するためにサーバの特定のレスポンスが欲しい場合があったとします。
通常であれば、サーバ開発チームに特定のレスポンスを返すようお願いするか、Stubを作成する必要が有ります。

開発中のサーバがResponse (A)しか返せない

この時、特定のリクエストに対し好きなレスポンスを返す事ができるプロキシサーバが存在すれば、クライアント開発チームだけで完結して開発を進める事ができます。

dcohを介してResponse (A) を Response (B) に差し替える

クライアントアプリケーションのリバースエンジニアリング

クライアントアプリケーションのコードを見ることができず、APIサーバも操作する事が出来ない状態があったとします。
この場合も、同じようにサーバからのレスポンスを差し替える事でアプリケーションの挙動を変える事ができます。

dcohを介してクラウドサービスからのレスポンスを Response (A) から (B) に差し替える

dcohの何が良いか

HTTPSの通信に対応している事

通常、HTTPSの通信は証明書の問題があるため、簡単にStub用のサーバを立てる事ができません。
また、クライアントの環境が変更できない場合やクラウドサービスのAPIを使用している場合、証明書の問題でStubでも対応が難しい場合が有ります。
dcohでは、リクエストのあったドメインの証明書を自己認証局で自動的に作成します。
クライアントに認証局を信頼させておく事で、ドメインを気にせずにレスポンスを差し替える事が出来ます。

リクエストを受けてからのレスポンスを返すまでのプロセス

使い方

環境構築

まず、Pythonが動作する環境を用意する必要が有ります。
動作確認しているOSはUbuntu 16.04です。
内部でopensslコマンドを使用しているため、必要に応じて設定を変更する必要が有ります。

Python環境の構築

Pythonの環境構築は pyenv を使用します。
動作確認しているPythonのバージョンは 3.6.8 なので、今回はこのバージョンで説明します。

pyenvのインストール

pyenv をGitHubからダウンロードし、インストールします。

git clone https://github.com/pyenv/pyenv
vim ~/.bashrc # 以下の内容を追記する
export PYENV_ROOT=~/.pyenv
export PATH=~/.pyenv/bin:$PATH
eval "$(pyenv init -)"

追記したコードを反映させます。

source ~/.bashrc
Pythonのインストール

pyenv を使用してPythonをインストールします。
インストール中にエラーが出た場合は、こちらを確認してください。

pyenv install 3.6.8
dcohのダウンロード

dcohをGitHubからダウンロードします。

git clone https://github.com/fealone/dcoh
dcoh用のPython環境を作成し、必要なパッケージをインストールする
cd dcoh
pyenv shell 3.6.8
python -m venv venv
source venv/bin/activate
pip install -r requirements.txt
自己認証局を作成する
cd CA
./init.sh # 証明局に必要な情報を入力する
cd ..
実行する
python main.py

自己認証局のインストール

認証局を信頼させるために、Root CAをインストールする必要が有ります。
dcoh/CA/demoCA/cacert.der をブラウザやOSにインストールすると証明書エラーが発生しなくなります。

通信を差し替える

環境構築し、実行した後はHTTPSのプロキシ設定を localhost:8443 に向ける事でプロキシ経由の通信となります。
通信を差し替える場合は、 dcoh/contents/{domain}/{url} に差し替えたいレスポンス用のファイルを配置する事で、配置したファイルがそのままレスポンスの内容となります。

後書き

今回は作成したプロキシサーバの簡単な紹介でした。
機会があれば、実際に使用してどのような事ができるのか紹介できればと思います。