【Oracle Cloud】Load Balancer でクライアント証明書を使った認証をしてみる

# はじめに

Oracle Cloud が提供している ロードバランサではクライアント証明書による認証を行うことができます。
以下のドキュメントにもそのような記載はあるのですが、これだけだとあまりピンと来ません。

[リスナーの管理](https://docs.oracle.com/ja-jp/iaas/Content/Balance/Tasks/managinglisteners.htm)
> ピア証明書の検証: オプション。ピア証明書の検証を有効にする場合は、このオプションを選択します。

今回はロードバランサにクライアント証明書を設定する方法と実際にどのような動作になるかを見ていきます。


# クライアント証明書の作成

クライアント証明書の作成は今回はオレオレ証明書をサーバ上で作成していきます。
作成の際には以下のサイトを参考にさせていただきました。

[クライアント証明書認証の設定メモ（Apache2.4 + CentOS）](https://blog.apar.jp/linux/14057/)
[サーバ証明書・クライアント証明書作成](https://pig-log.com/server-client-certificate/)

作成環境は Oracle Cloud Infrastructure(以下、OCI)上に CentOSのインスタンスを作成し
そのインスタンス上で openssl を利用して証明書を作成しました。
作成したものは以下の通りです。

**サーバ証明書**

* SERVER_CERT.key：秘密鍵
* SERVER_CERT.csr：CSR
* SERVER_CERT.crt：サーバー証明書

**クライアント証明書**

* client.key：秘密鍵
* cacert.pem：クライアント証明書を発行した認証局の証明書
* client.p12： 秘密鍵と発行したクライアント証明書を PKCS#12形式にしたもの

# 通常のSSL通信

実際にロードバランサに設定をしてきます。事前にHTTPでアクセスできることは確認しています。
まずは先ほど作成した サーバ側の証明書のみを使用して通常のSSL通信ができるかどうかを検証します。

ロードバランサの下記の画面でサーバー証明書を追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62936/d60b18c4-0e7c-1b0f-037d-dd33044e20ee.png)

証明書の追加をクリックし、証明書名とSSL証明書ファイル、秘密キーの指定をチェック入れて選択。
設定している場合は秘密キーのパスフレーズも入力します。証明書の追加をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62936/a6ab2db1-3998-6be3-e0e9-fd1b19222b94.png)


追加が完了したらリスナーの画面に遷移し、リスナーの作成をクリックします。
プロトコルはHTTPを選択、ポートは443とします。SSLの使用にチェックを入れます。
証明署名に先程登録した normal_ssl を設定し、バックエンド・セットを選択して作成をします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62936/f650c94e-5d8e-14be-ce79-c80fccce42c9.png)

作成したらアクセスをしていきます。今回はドメインを指定してないのでロードバランサのパブリックIPでアクセスします。

https://<ロードバランサのIP>

アクセスすると以下のような画面が表示されます。オレオレ証明書のため警告が出ますが
詳細情... をクリックして危険性を承知で続行 をクリックします。

![firefox.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62936/9ca3ef17-52fa-d8a2-1c1b-b92cb9a621ab.png)

無事にアクセスできれば下記のようにURLバーに鍵マークがついています。
これでサーバー証明書だけのアクセスは確認できました。
![access.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62936/d8f9163f-0399-56b8-99a7-302b4c0450f7.png)

# クライアント証明書の設定

次はクライアント証明書の設定をしていきます。
先程のロードバランサの証明書設定画面で証明書の追加をクリックし
先程と同じように証明書名を入力。サーバ証明書を選択。
**CA証明書ソースの指定にチェックをいれ、CA証明書ファイルの選択でクライアント証明書作成の際に利用したクライアント証明書を発行した認証局の証明書であるcacert.pem を選択。**
秘密キーの指定をチェック入れて、証明書の追加をクリック。

![a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62936/d818a5d7-13f5-23e3-068d-e0b8e4a114d4.png)

先程作成したHTTPS用のリスナーの内容を更新します。
証明書名としてclient_sslを選択し、ピア証明書の検証にチェックを入れます。
深さの検証はそのまま1にしてリスナーを更新します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62936/5183943d-3e33-1460-ae7c-ba68ca808cca.png)

# 検証

まずはクライアント証明書をブラウザに登録しない状態でアクセスをしてみます。
先程のようにアクセスをすると以下のように 400 Bad Request で エラーが返却されます。

![client_error.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62936/ab7493dc-fcf1-a9ef-60ca-9635c5e80731.png)

以下のブログを参考にブラウザに自作したクライアント証明書を追加します。

[クライアント証明書を登録する（Mac／Mozilla Firefox）](https://support.kaonavi.jp/function-admin/secure-access/014/)

証明書を追加した状態でアクセスをするとポップアップが表示され、OKをクリックすると以前と同じようにSSLでアクセスができます。

![check.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62936/e9bada88-11f2-61f7-9ceb-ed7d029851b9.png)

![access2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62936/810afb07-95da-0935-bf7d-6d7c3191229a.png)

無事にクライアント証明書を利用してのアクセスができました。
OCIのロードバランサでクライアント証明書が利用できるというのはなかなか知られていませんが、そのような要件がある場合は是非利用してみてください。