API Connect v10 での相互TLS認証検証③ - API Connectがクライアントとなる通信

# はじめに

前回の記事：[API Connect v10 での相互TLS認証検証① - トラストストア認証](https://qiita.com/ryota_n/items/997550f6525002d7559f)では、API ConnectがTLS通信のサーバーサイドになる場合の相互TLS認証設定について紹介してきました。今回は、API Connectがクライアントとなり、バックエンド側のTLS認証サーバーとの通信をする場合の設定例について紹介します。


# 事前準備

## クライアント証明書の作成
クライアント証明書の作成は[前回の記事](https://qiita.com/ryota_n/items/997550f6525002d7559f)と同様なので割愛します。
前回作成したファイルを利用して検証を行っています。

## バックエンドサーバーの相互TLS認証設定

相互TLS認証の接続先となるバックエンドサーバーは、[前回の記事](https://qiita.com/ryota_n/items/997550f6525002d7559f)で設定したAPI ConnectサーバーとAPIを使用しています。


# クライアントとなるAPI Connect設定

## 鍵ストアの登録

API Managerにログインします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403443/f677cfe8-70ad-8fe4-64e0-c6e6053a69b8.png)


リソース - TLS メニューから鍵ストアを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403443/03deb138-dc0b-defa-448d-16cb07d0b865.png)


前回の記事で作成した秘密鍵（client_key.pem）と公開鍵（client_certificate.pem）をアップロードします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403443/5df5bbb6-c776-7c44-7721-2c8074664f22.png)


## TLSクライアント・プロファイルの登録

次にTLSクライアント・プロファイルを作成します。
サーバー接続では、「非セキュア・サーバー接続を許可する」にチェックを入れます。今回は、サーバー証明書として自己署名証明書を使用しているため、このような非セキュアな通信を許可する設定になります。
また、鍵ストアには、先ほど作成した定義（client-key）を選択します。非セキュア通信のため、トラストストアは不要となります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403443/bea3b0b6-57c2-977e-f390-284bad3a5eb4.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403443/e59a9a04-da26-4b24-8e62-81bc0f734d83.png)

これで、リソースの登録が完了しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403443/0be8ed29-867c-8956-823e-9446d44f93df.png)



## カタログのTLSクライアント・プロファイル設定

APIの公開先のカタログで先ほど登録したTLSクライアント・プロファイルを使用できるように設定を行います。
対象カタログを選択し、カタログ設定-TLSクライアント・プロファイルメニューを開き、編集します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403443/5d7529d2-99fd-2bfb-4bdb-a5bd883a9e45.png)

このカタログで参照可能なプロファイルの一覧が表示されますので、先ほど、登録した「clientprofile」をチェックして、保存します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403443/cbc5c74b-991e-7427-3563-9000c276ae6f.png)

## API定義 - InvokeポリシーでのTLSクライアント・プロファイル利用

テストのため、新規にAPIを登録します。
アセンブリ画面で、バックエンドサーバー呼び出しのためのInvokeポリシーを追加します。
URLは、前回の記事で登録したAPIのエンドポイントとなります。TLSプロファイルでは、先ほど登録した「clientprofile」を選択するのですが、このバージョンレベルでは、バグなのかGUIから選択することができませんでした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403443/01d7ea3b-e3b3-eebc-103a-87ca9b9ffc81.png)

今回は、アセンブリ画面の右上のアイコン（</>）からソース画面に移行し、YAMLファイルを直接編集します。invokeポリシー下に「tls-profile: clientprofile:1.0.0」を追記します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403443/51b60abd-8c5c-b325-ad93-d0d2f56916c6.png)

設定が反映されていることが確認できたら、保存し、オンラインにします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403443/461b3c9d-8183-ab84-07c9-09f25d953820.png)


以上で設定は完了です。


# 動作確認

API Managerのテスト機能で動作確認を実施します。

## TLSクライアント・プロファイルが設定されない場合

アセンブル画面でInvokeポリシーにTLSクライアント・プロファイルが設定されていない場合は、以下のような結果となりました。相互TLS認証に失敗し、500エラーとなっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403443/7734768b-6b56-376e-f30b-f8b8742685e5.png)

## TLSクライアント・プロファイルが設定した場合

アセンブル画面でInvokeポリシーにTLSクライアント・プロファイルを設定していた場合は、以下のような結果となりました。相互TLS認証に成功し、APIの応答がありました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403443/ceb552ee-4a7b-1243-fab8-194893252e65.png)



以上となります。