【SAP Destinations】SAP Destinations を用いてmTLS認証を行う方法

## 概要
業務内で、SAP Destinations を用いたmTLS認証が可能かの検証をする機会があったので、その方法を本記事にまとめました。

:::note warn
注意
2025/05/12時点で、ManagedApprouterで自己証明書を使ってのmTLS認証はできないことが分かっています。詳しくは「留意事項」をご確認ください。
**(2025/05/20追記)**
**2025/05/20現在、ManagedApprouterでも自己証明書を使ってのmTLS認証が可能になっています。**
:::

## mTLSとは
サーバとクライアントが相互に認証するしくみのことです。
サーバ側はクライアント側のルート証明書（CA証明書）をあらかじめ持ち、クライアント側から送られてきたクライアント証明書が信頼できるものかどうかを検証します。
クライアント側も同様にサーバ側のルート証明書（CA証明書）をあらかじめ持ち、サーバ側から送られてきたサーバ証明書が信頼できるものかどうかを検証します。
両方検証に成功すれば、接続可能になります。
![mTLS説明図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3334459/9a5650b8-2edb-4d62-a203-95246fbd3477.png)

今回はSAP Approuterをクライアント側として、
①SAP BTPでクライアント証明書の発行
②SAP Destinationsへサーバ証明書の登録
を行いました（サーバ側の設定手順は割愛させていただきます）。
## SAP BTPでクライアント証明書の発行
まず、Destination Certificates でp12形式のクライアント証明書を作成します。

![Destination Certificates.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3334459/dd13ac2a-316c-4f7a-8627-026da1b1ccef.png)
![Destination Certificates2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3334459/c7a4d492-7a7f-43b3-9125-aee938b668cd.png)

設定値は以下の通りです。
Generation Method : External service
Name : 任意の証明書の名前
File Extension : P12
Common Name : 任意
Validity : 任意
Passwoed : 任意のパスワード
Automatic Renewal : 任意

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3334459/4d58c191-00f8-430a-9b3c-d566c5bda31f.png)

次にDestinations で新しい接続先を作成します。
設定値は以下の通りです。
Name : 任意のDestination名
Type : HTTP
Description : 任意の説明文
URL : 接続先のURL
Proxy Type : Internet
Authentication : ClientCertificateAuthentication
Key Store Location : 先程作成したp12ファイル
Key Store Password : 作成したp12ファイルのパスワード

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3334459/cf7c8361-b65e-46a7-98e4-e4d02052893e.png)

作成したDestinationをエクスポートし、pemファイルを取得します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3334459/3753a641-ca7a-4102-8d7d-92830548fee0.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3334459/821bb949-362c-4fd5-aaf5-f95c196f9994.png)

中身を確認し、証明書が3種類入っていることを確認してください。内容は「クライアント証明書」「ルート証明書」「中間証明書」です（pemの中には秘密鍵は含まれていません）。

これで、クライアント証明書の発行が完了しました。本来ならば、この後サーバ側にクライアント側のルート証明書を配置する作業などがありますが、今回は割愛させていただきます…
## SAP Destinationsへサーバ証明書の登録
次に、サーバ側のルート証明書をSAP Destinationsに登録します。
もし、GoogleやAWSのような、有名どころのパブリック証明書を使う場合は、既に「default JDK truststore」にあらかじめ登録されている可能性があります。その場合は特別こちらからサーバ側のルート証明書を指定する必要はありません。
先程作成したDestinationの「default JDK truststore」にチェックを入れて保存してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3334459/9d1413ee-43ca-42af-ae8b-0a9c76e207e6.png)

自己証明書を使う場合は、こちらからサーバ側のルート証明書を指定する必要があります。
「default JDK truststore」のチェックを外し、「Upload and Delete Certificates」からサーバ側のルート証明書をアップロードしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3334459/2b2af543-1c85-43e2-a4a2-9f731d989f59.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3334459/61786611-a7b8-4296-9186-a553135cafa9.png)

これでSAP Destinationsへのサーバ証明書の登録が完了しました。
## 留意事項
冒頭にも書いた通り、2025/05/12時点で、ManagedApprouter(※1)で自己証明書を使ってのmTLS認証はできないことが分かっています。default JDK truststore を使う場合は、問題なく認証が可能です。
インシデントとして公式に問い合わせたところ、現在改修中でリリース予定は未定のようです。

StandaloneApprouter(※2)の場合、最新の@sap/approuterを使うことで、default JDK truststore、自己証明書両方でmTLS認証が可能です（2025/05/12時点の最新バージョン：20.3.1）。

**(2025/05/20追記)**
2025/05/20現在、ManagedApprouterでも自己証明書を使ってのmTLS認証が可能になっています。

:::note
注釈
※1 **ManagedApprouter**......SAPが提供・運用しているApprouterのこと。自分で用意する必要が無く、BTP が管理する環境で自動的に起動・運用される。
（詳細：https://help.sap.com/docs/btp/sap-business-technology-platform/managed-application-router?locale=ja-JP ）

※2 **StandaloneApprouter**......自分で用意し、SAP Cloud FoundryやSAP BTPにデプロイするApprouterのこと。
:::