MuleSoftのAPI Proxyとバックエンドシステム間で自己証明書を利用して相互認証を構築しよう！

# はじめに
　システム間の認証に自己証明書を利用した相互認証で認証を行っている場合は多いいと思います。
　今回は、Anpoint PlatformのAPIプロキシとバックエンドシステム間で自己証明書を利用した相互認証が可能か実現性を調査しましたので説明します。

# 概要
　相互認証の概要は以下の通です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76270/5c031dd5-bb9e-7fea-6c9e-5ea1ea829d43.png)

# 証明書ベースの相互認証の仕組み
 証明書ベースの相互認証の仕組みは以下の通りです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76270/6e1d54a8-2475-7a4d-70cc-f572848b2b57.png)

# 考慮ポイント
考慮ポイントは以下の通りです。

- 相互認証ではTLS v1.2 プロトコルの指定は必須です。
- APIプロキシ側のSSLキーストアとSSLトラストストアの作成はPCから作成できます。
- EC2のインスタンスタイプは、t2.small以上が必要です。（メモリ1.4GB必要のため）
- 相互認証を求めるバックエンドシステムの代わりにEC2上にMule4 standaloneを構築して利用しました。
- クライアントのSSLトラストストアに直接サーバ証明書を格納することで信頼の連鎖を確立しました。
- SSLキーストアとSSLトラストストで利用できるファイル形式は、PEM、JKS、PKCS12、JCEKSが利用可能です。

# 相互認証検証環境構築手順
証明書ベースの双方向認証環境構築手順
		
| No. | タスク          | タスク                                 |
|:-----|:-----------------|:----------------------------------------|
| 1   | EC2             | EC2にMule 4   standaloneの構築         |
| 2   | 開発端末        | SSLキーストアとSSLトラストストアの作成 |
| 3   | 開発端末        | Muleアプリケーションの相互認証設定     |
| 4   | 開発端末        | Muleアプリケーションのエクスポート     |
| 5   | EC2             | EC2にMuleアプリケーションの配置        |
| 6   | Secrets Manager | TLSコンテキストの設定                  |
| 7   | API Manager     | Endpoint With   Proxyの設定            |

# EC2にMule 4 standalone環境の構築手順
EC2にMule 4 standalone環境を構築する手順は以下の通りです。

```
// インスタンスタイプ : t2.small（メモリ2GiB）のEC2インスタンスの作成
$sudo apt-get update
$sudo apt-get install openjdk-8-jdk
$sudo apt-get install zip unzip
$export MULE_HOME=/opt/mule-enterprise-standalone-4.3.0
$sudo $MULE_HOME/bin/mule install
$sudo $MULE_HOME/bin/mule start
// Muleアプリケーションの配置（Muleアプリケーションの相互認証設定完了後）
$sudo mv /home/ubuntu/{Muleアプリケーション}.jar /opt/mule-enterprise-standalone-4.3.0/apps/"
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76270/0bf2a6cd-03d3-fa4e-fdd0-29398544bc6b.png)

# SSLキーストアとSSLトラストストアの作成
SSLキーストアとSSLトラストアの作成手順は以下の通りです。

```
// 1. サーバキーストア作成
$keytool -alias mule-server01 -genkeypair -keystore keydir/server-keystore.jks -dname "CN=localhost, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown" -keypass password -storepass password -keyalg RSA -sigalg SHA1withRSA -keysize 2048 -ext SAN=DNS:{パブリックDNS（重要）},IP:{パブリックIP} -validity 9999
// 2. サーバ証明書作成
$keytool -export -alias mule-server01 -keystore keydir/server-keystore.jks -file keydir/server.crt
// 3. クライアントキーストア作成
$keytool -genkey -alias mule-client01 -keyalg RSA -keystore keydir/client-keystore.jks   -dname "CN=localhost, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown"  -keypass password  -storepass password
// 4. クライアント証明書作成
$keytool -export -alias mule-client01 -keystore keydir/client-keystore.jks -file keydir/client.crt
// 5. クライアントトラストストアにインポート
$keytool -import -alias mule-client01 -keystore keydir/client-truststore.jks -file keydir/client.crt
$keytool -import -alias mule-server01 -keystore keydir/client-truststore.jks -file keydir/server.crt 
// 6. サーバトラストストアにインポート
$keytool -import -alias mule-client01 -keystore keydir/server-truststore.jks -file keydir/client.crt
// 7. POSTMAN用クライアント証明書作成
$keytool -importkeystore -srckeystore keydir/client-keystore.jks -srcstoretype JKS -deststoretype PKCS12 -destkeystore keydir/client-keystore.p12
// 8. トラストストアのキーストアエントリ内容の確認
$keytool -list -keystore keydir/server-truststore.jks
$keytool -list -keystore keydir/client-truststore.jks"
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76270/29ba91dd-0b30-96d1-7f83-a93a722e60e4.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76270/9e8a24db-70d0-0c9c-7ad2-03f01e859b43.png)

# Muleアプリケーションの相互認証設定
Muleアプリケーションの相互認証の設定は以下の通りです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76270/214415f6-0b1a-a413-0c47-8ef3150f2cff.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76270/229ed22c-59f0-d48f-90eb-9bc3340c05fa.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76270/b3ebe89c-68f0-5be8-5f6e-902d0f3e1335.png)

# Endpoint With Proxy設定
Endpoint With Proxyの設定は以下の通りです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76270/722eeb84-eac0-ccd8-d77e-9ea54054073a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76270/60b6b27a-b6d1-ef1b-1095-f651eb87426f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76270/6112eaea-1e99-71ae-7819-5ef3d4abc361.png)


# トラブルシューティング（１）
Endpoint With Proxyのログに下記のエラーが出力された場合の原因と対策をは以下の通りです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76270/c734bb9e-b79b-2765-ae09-f76e756a436f.png)

# トラブルシューティング（２）
Cloudhubに相互認証を設定したアプリケーションやAPIプロキシーをデプロイした場合にエラーが発生します。Muleの回答では、Cloudhubにデプロイは可能だが共通ロードバランサーの利用は不可で、Workerに直接アクセスすれば利用できるが、サーバ側の相互認証を利用する場合はDLBが推奨とのお話です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76270/5b9e12f3-4748-7c0c-d489-93b7ba8e309f.png)

[Q&A about not starting a listener of the mutual authentication in Cloudhub.Please let me know if you know?](https://help.mulesoft.com/s/question/0D72T000000fFqI/about-not-starting-a-listener-of-the-mutual-authentication-in-cloudhubplease-let-me-know-if-you-knowquestionis-mutual-authentication-possible-with-cloudhub-are-there-any-restrictions-if-possible?s1oid=00D300000006hWG&s1nid=0DB2T000000L2I4&emkind=chatterCommentNotification&emvtk=RbsHrI51MXhR7qULCprYeRiaUwnWsNhrcCswryJxEHI%3D&s1uid=0052T00000CVg1g&emtm=1592334175885&fromEmail=1&s1ext=0)

# POSTMANからの確認方法
POSTMANからの確認方法は以下の通りです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76270/cfc504fb-5e07-a39b-aaf0-2ef19af13db2.png)

# 最後に
　いかがだったでしょうか？
  MuleSoftのAPIProxyは、自己証明書で相互認証を要求するバックエンドシステムと認証できることが分かりました。
　構想段階など早い段階で考慮しておくべきポイントを明確にできることはいいですね。では