クライアント認証を利用した複数バックエンドシステムにリクエスト振り分けるEndpoint With Proxyの構築手順
はじめに
クライアント認証を要求する複数のバックエンドシステムにリクエストを振り分けるEndpoint With Proxyの技術検証を実施したため、構築手順を備忘録の目的で説明する。

手順
手順は以下の通り。
- 1つの端末上で複数バックエンドシステムを稼働するためにHostsにFQDNを追加する。
- 自己証明書(クライアント証明書、サーバ証明書)を作成する。
- APIプロキシを改修する。
- APIプロキシに証明書を設定する。
- APIプロキシとバックエンドシステムを起動する。
- POSTMANからリクエストを送信してレスポンスを確認する。
手順詳細
1.1つの端末上で複数のためにHostsにFQDNを追加する。
クライアント承認要求をするバックエンドシステムを2つ用意したい為、HostsにFQDNを追加する。

2.自己証明書(クライアント証明書、サーバ証明書)を作成する。
① JKS形式で証明書を作成する。
$ keytool -genkeypair -keystore mule_client_server.jks -dname "CN=client.accenture.com, OU=Mulesoft Dev, O=Masaki Japan Ltd., L=Minato-ku, ST=Tokyo, C=JP" -keypass password -storepass password -keyalg RSA -sigalg SHA1withRSA -keysize 2048 -alias client -validity 36524
$ keytool -genkeypair -keystore mule_dev01_server.jks -dname "CN=dev01.accenture.com, OU=Mulesoft Dev, O=Masaki Japan Ltd., L=Minato-ku, ST=Tokyo, C=JP" -keypass password -storepass password -keyalg RSA -sigalg SHA1withRSA -keysize 2048 -alias dev01 -validity 36524
$ keytool -genkeypair -keystore mule_dev02_server.jks -dname "CN=dev02.accenture.com, OU=Mulesoft Dev, O=Masaki Japan Ltd., L=Minato-ku, ST=Tokyo, C=JP" -keypass password -storepass password -keyalg RSA -sigalg SHA1withRSA -keysize 2048 -alias dev02 -validity 36524
② JKS形式の証明書をPKCS12形式に変換する。
$ keytool -importkeystore -srcstorepass password -storepass password -srckeystore mule_client_server.jks -srcstoretype JKS -deststoretype PKCS12 -destkeystore mule_client_server.p12
$ keytool -importkeystore -srcstorepass password -storepass password -srckeystore mule_dev01_server.jks -srcstoretype JKS -deststoretype PKCS12 -destkeystore mule_dev01_server.p12
$ keytool -importkeystore -srcstorepass password -storepass password -srckeystore mule_dev02_server.jks -srcstoretype JKS -deststoretype PKCS12 -destkeystore mule_dev02_server.p12
③ 証明書の内容を確認する。
$ keytool -list -keystore mule_client_server.p12 -storepass password
$ keytool -list -keystore mule_dev01_server.p12 -storepass password
$ keytool -list -keystore mule_dev02_server.p12 -storepass password
④ APIプロキシー側の接続先のトラストストアを作成する。
$ openssl pkcs12 -in mule_dev01_server.p12 -passin pass:password -nokeys -out mule_dev01_server.pem
$ openssl pkcs12 -in mule_dev02_server.p12 -passin pass:password -nokeys -out mule_dev02_server.pem
$ openssl x509 -outform der -in mule_dev01_server.pem -out mule_dev01_server.der
$ openssl x509 -outform der -in mule_dev02_server.pem -out mule_dev02_server.der
$ keytool -import -alias dev01 -keystore cacerts -srcstorepass password -storepass password -file mule_dev01_server.der -deststoretype PKCS12 -destkeystore mule_dev_server.p12
$ keytool -import -alias dev02 -keystore cacerts -srcstorepass password -storepass password -file mule_dev02_server.der -deststoretype PKCS12 -destkeystore mule_dev_server.p12
⑤ トラストストアの内容を確認する。
$ keytool -list -keystore mule_dev_server.p12 -storepass password
スクリプトの実行結果

3.APIプロキシを改修する。
Github:サンプルプログラム
https://github.com/Masaki-Rock/APIProxyforClientAuthorization

proxy.path=/{backend}/*
implementation.protocol=HTTPS
backendlist=[{'web01':'dev01.accenture.com', 'port':'8091'}, {'web02':'dev02.accenture.com', 'port':'8092'}]
<set-variable value="#[${backendlist}]" doc:name="プロパティー情報設定処理" variableName="backendlist"/>
<set-variable value="#[vars.backendlist filter (item, index) -> (item[attributes.uriParams['backend'] default '' as String] != null)]" doc:name="サーバ情報取得処理" variableName="hostinfo"/>
<http:request-connection host="#[vars.hostinfo[0][attributes.uriParams['backend']]]" port="#[vars.hostinfo[0]['port']]"
protocol="${implementation.protocol}">
4.APIプロキシに証明書を設定する。

<tls:context >
<tls:trust-store path="mule_dev_server.p12" password="password" type="pkcs12"/>
<tls:key-store type="pkcs12" path="mule_client_server.p12" alias="client" keyPassword="password" password="password" />
</tls:context>
<tls:context >
<tls:trust-store path="mule_client_server.p12" password="password" type="pkcs12" />
<tls:key-store type="pkcs12" path="mule_dev01_server.p12" alias="dev01" keyPassword="password" password="password" />
</tls:context>
<tls:context >
<tls:trust-store path="mule_client_server.p12" password="password" type="pkcs12" />
<tls:key-store type="pkcs12" path="mule_dev02_server.p12" alias="dev02" keyPassword="password" password="password" />
</tls:context>
5.APIプロキシとバックエンドシステムを起動する。
APIプロキシとバックエンドシステム用のMuleアプリケーションを起動する。

証明書が正しく取得できるか確認する。
$ openssl s_client -connect dev01.accenture.com:8091
$ openssl s_client -connect dev02.accenture.com:8092

6.POSTMANからリクエストを送信してレスポンスを確認する。
POSTMANからリクエストを送信して結果を確認する。

最後に
いかがだったでしょうか?
上記の手順で検証を環境を構築すると、APIプロキシを利用してクライアント認証を要求する複数のバックエンドシステムにアクセスできることが確認できると思います。
このような要件が出た場合にはぜ活用してみてください。では、






