Delphi / C++Builderアプリケーション向けのフルセットバックエンドソリューションであるRAD Serverはクライアントとの通信をHTTPやHTTPSで行いますが、EMSFireDACClient のようなコンポーネントを使えば通信内容を細かく意識することなしに実装が行えます。
しかし、実際に行われているデータのやり取りを理解しておくことは、WebAPI の実装では大切だと思います。
そこで mitmproxy というプロキシサーバを使って通信内容を調べる方法を簡単に説明します。
Table of Contents
mitmproxy で出来ることは?
- クライアント側からの通信が mitmproxy 経由で行われるように設定すると、リクエストやレスポンスの内容を閲覧できる
- HTTPSの通信についても mitmproxy の証明書をクライアント側にインストールすることで通信内容を調べることができる
mitm = man in the middle の略です。日本語では「中間者攻撃」と言われます。サーバとクライアントのやり取りが直接行われているように見えて、実は通信経路上の中間者によって中継されていて、通信内容がすべて丸見えになっている状態ですね。
というわけで、mitmproxy = 中間者攻撃を行う proxy です。物騒な名前ではありますが、HTTPのように平文の通信は mitmproxy の類を使わなくても条件さえ揃えば内容は見放題ですから必要以上に怖がることはありません。(例えば暗号無しの公衆WiFiを利用している場合は通信内容はすべて誰かに見られている可能性があります。あるいはWPA2などの暗号化ありのWiFiでも設置者が意図的にハニーポットを仕込んでいれば平文の通信はすべて抜かれてしまいます。)
mitmproxy を自分の作業環境にインストールして実行する
mitmproxy は python で動作しますが、Windows 版は exe も配布されています。環境構築に手間が掛かることはありません。
まずはmitmproxy のウェブページにアクセスしてアーカイブを入手します。
https://mitmproxy.org/
releases のリンク先からインストーラを入手できます。
ここにはinstaller と zip がありますけど、installer は単に Program Files 以下に配置してくれるだけです。
さて、インストールを行ったら mitmweb.exe を実行すると mitmproxy が起動します。mitmproxy はパラメータ無しで起動すると、認証が無いproxyとして動作します。(パスワードファイルを用意してパラメータ指定すれば認証アリの proxy としても使えます)
起動するとコマンドプロンプトの黒い画面の中に proxy の情報とWeb server(管理コンソール)の情報が表示されます。
これでインストールと実行は終わりです。カンタンですねー。なお、実行時に Python の DLL が無い、というエラーが出る場合は
Visual Studio 2015 の Visual C++ 再頒布可能パッケージ https://www.microsoft.com/ja-JP/download/details.aspx?id=48145 をインストールしてみてください。なお、mitmproxy のポータブル版は 32bit 向けにビルドされているようですので、Visual C++ 再頒布可能パッケージも32bit版をインストールしてください。
RAD Server のサンプルプロジェクトを一部修正して、通信が mitmproxy 経由で行われるようにする
RAD Server 向けのサンプルプロジェクトが以下のパスにありますので、これを一部修正してビルドします。
C:\Users\Public\Documents\Embarcadero\Studio\18.0\Samples\Object Pascal\Database\EMS\FireDACResource
C:\Users\Public\Documents\Embarcadero\Studio\18.0\Samples\CPP\Database\EMS\FireDACResource
SampleEMSFireDACResourcePackage のビルド
まず最初に SampleEMSFireDACResourcePackage をそのままビルドして実行します。RAD Server向けの開発を初めて行う場合は実行後にEMSサーバの開発環境向け初期設定が必要となります。この手順は docwiki の下記ページに沿って行ってください。
SampleEMSFireDACClient のビルド
つぎに SampleEMSFireDACClient を一旦はそのままビルドして実行します。このサンプルクライアントは RAD Server 経由でデータベースと通信するアプリです。GetTables を押してデータが取得できることを確認しておきます。
SampleEMSFireDACClient を mitmproxy を経由するように修正する
SampleEMSFireDACClient が正しく動作することが確認できたら、mitmproxy を経由するように修正して再度ビルドします。修正箇所は EMSProvier のプロパティ2か所です。
RAD Server との通信内容を mitmproxy で調べる
SampleEMSFireDACClient の準備が出来たら実行して GetTables したり、内容を修正して Post Updates してみてください。するとブラウザで表示中の mitmproxy の管理コンソールに実行した内容の内容が出力されているはずです。これで RAD Server との通信内容を覗き見ることができました。
[補足] SSL/TLSの通信を覗き見る
mitmproxy では SSL/TLS の内容を覗き見ることもできます。この仕組みはつぎのようになっています。
- mitmproxy では「アクセス先のSSL/TLSサーバとmitmproxyの間の通信」と「mitmproxyとクライアントの間の通信」がそれぞれ別々に暗号化される。
- 「mitmproxyとクライアントの間の通信」ではアクセス先毎のサーバ証明書を mitmproxy が動的にオレオレ証明書として生成する。
- オレオレ証明書は本来ならばクライアント側で証明書エラーとして弾く。しかしmitmproxy自身のCA証明書を証明書ストアにインストールすることにより、クライアント側で証明書エラーが発生することなくアクセスできるようになる。
なお、このような仕組みでSSL/TLSの通信を中継する仕組みを SSL Interception と言います。今時のウィルス対策ソフトウェアやセキュリティ製品には、この仕組みでSSL/TLSの通信を検査する機能を持つものがあります。
さて、mitmproxy のCA証明書をインストールするのは実にカンタンです。「インストールしたいブラウザで mitmproxy を経由する設定を行ったのち、http://mitm.it/ にアクセスする」だけです。
http://mitm.it/ にアクセスすると次のような画面になりますので、クライアントOSごとのアイコンをクリックすれば証明書がインストールできます。ただし FireFox を利用する場合は Windows でも Apple を選びます。(FireFox はOSの証明書ストアを使用せず独自に証明書を管理するが、このときに p12 形式の証明書を認識しないため)
HTTPSの通信を行うアプリの開発で何か問題が起きた場合の検証にお使いいただけると思います。
なおRAD Server 向けのアプリ開発は RAD Studio トライアル版でも開発頂けます。
Design. Code. Compile. Deploy.
Start Free Trial Upgrade Today
Free Delphi Community Edition Free C++Builder Community Edition