DeleGateでSSL proxy

概要

.NetのWCFクライアントを作って、Apache Axis2httpsSOAP通信をする、という機会に恵まれました。

SOAPといってもメッセージの内容はまだ固まっていないので、Apache TCPMonでいちいちメッセージの内容を確認したいので、DeleGateを間に入れています。

ということで、WCFクライアントはhttpsDeleGateに送信し、DeleGateはhttpでTCPMonに送信し、TCPMonはAxis2に送信し、あとは返信はこの逆をたどることになります。

WCF <= https:8443 => DeleGate <= http:9080 => TCPMon <= http:8080 => Axis2

DeleGateは、現在の最新版である9.9.1を入れました。

DeleGateのインストール

Windows版のDeleGateはzip形式で配布されており、適当な場所に展開しました。
とりあえず、D:/Tools/DeleGateに展開しました。

設定ファイルでDGROOTに展開したディレクトリを指定すれば良いはずなのですが、なぜかエラーになってD:/Program Files/DeleGateがDGROOTになってしまうので、言われるままにD:/Program Files/DeleGateに置き直しました。

次のように設定ファイルを指定すれば、いちいち引数を指定しなくて済むので、これをバッチファイルにして使っています。

dg9_9_1.exe +=delegate-https.cfg

delegate-https.cfgは次のようにしています

# サービスとして起動させないために、-f(foreground execution)をつけて起動
-f
-P8443
SERVER=https
FCL=sslway

MOUNT="/* http://localhost:9080/*"
REACHABLE=localhost
RELIABLE="*"
ADMIN=user@example.com

-fをつけないとサービスとして起動しようとするのですが、管理者権限がないとエラーになってしまうため、foregroundで起動しています。

オレオレサーバ証明書

DeleGateには標準の証明書が含まれているのですが、残念なことに2008年で有効期限が切れています。
ということで、OpenSSLを使ってオレオレサーバ証明書を作ります。
ググれば見つかると思うので、ここでは省略。

作成したサーバ証明書はDGROOT/lib以下に置くといろいろな人が書いています。
ファイル名は決まっていて、次のファイルをDGROOT/libに置きました。

  • server-key.pem:秘密鍵
  • server-cert.pem:証明書

ただ、他の人と違っていたらしいのですが、パスフレーズをつけているのでそのままでは起動しません。
回避方法は、秘密鍵と同じ名前で拡張子が".pas"ファイルにパスフレーズを入れて、DGROOT/libに置きます。

ここまででDeleGate <=> TOPMon <=> Axis2まではいけました。

WCFクライアントからhttpsに接続する場合の問題

WCFクライアントからhttpsでつなごうとすると、オレオレサーバ証明書では残念ながらエラーになります。
この問題がわかって、CA証明書から作り直したり色々したのですが、WCF側で何とか解決しました。

System.Net.WebClient などでオレオレ証明書サイトにアクセスするで紹介されていた方法です。

WCFクライアントが接続する前に、ServicePointManagerのServerCertificateValidationCallbackに検証用コールバックを設定します。
そして、このコールバックメソッドで、すべてtrueを返せばつながるようになりました。

ここまで丸2日。