OCIクライアント証明書とFLBを使ってSSLクライアント認証をしてみた

# はじめに
クライアント証明書を持っている人だけがWebサーバへアクセスできるような構成を作っていきます。
事前準備として、以下のURLのようにサーバ証明書を使った構成がある状態から始めていきます。

https://qiita.com/Skogkatter112/items/da7847861c203fdab8ee

# 構成イメージ
事前に認証局、FLB、Webサーバ、クライアント端末がある構成をとっています。
今回は太文字のところを設定していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1899411/6dcdf859-8040-02e8-be6b-2f1121393ea8.png)




# httpsリスナーにピア証明書の検証を設定
FLBのhttpsリスナーを編集します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1899411/b7c04ee1-835e-3d6d-fe5b-9af8dd8df1b5.png)
・**CA証明書の指定**：作成した認証局
・**ピア証明書の検証**　
・**深さ**：1（ルート認証局場合は1　中間認証局の数に応じて2以上）



# クライアント端末でCSRを作成する
クライアント端末で秘密鍵とCSR（Certificate Signing Request）を作成します。CSR には「公開鍵」とその所有者情報などが記載されています。ここではクライアントの情報を入力します。
```text:秘密鍵の作成
openssl genrsa -out client.key 2048
```

```text:X509証明書発行要求（CSR）の作成
openssl req -new -key client.key -out client.csr
```
```text:CSR情報の入力
～～～～
Country Name (2 letter code) [AU]:
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:★必須
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:★そのままエンターでも可
An optional company name []:
openssl req -new -key client.key -out client.csr
```
後ほど認証局に登録する際にCN（Common Name）の値が空欄だとエラーになったので値を入力しておきます。
それ以外は任意で入力してください。

# 認証局でCSRを承認してクライアント証明書を作成
認証局から証明書の発行を選択します。  

■ **基本情報**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1899411/a487f2b6-4a6c-c9a4-3a1f-a6172197bc59.png)
・**[内部CAによって発行され、外部で管理]** を選択します。

■ **証明書構成**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1899411/19beb574-1b94-11fb-0298-75a8e4edddfd.png)
client.csrをcatコマンドなどで開き、貼り付けます。

# クライアント端末でクライアント証明書と秘密鍵をバンドルする
先ほど作成した証明書を選択後、バージョン、最新のバージョンの トリコロン をクリックします。「詳細の表示」から証明書のpemファイルをダウンロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1899411/1e9992a9-cc50-8f2e-825d-4b48c5a8442d.png)

```text:クライアント証明書と秘密鍵をバンドルしてpkcs12を作成
openssl pkcs12 -export -inkey client.key -in　client_certificate.pem -out client.p12 -name "client1"
```
Enter Export Password:
Verifying - Enter Export Password:
と出てきますが、今回はそのままエンターを押します。

:::note warn
私の環境ではパスフレーズの入力プロンプトが出ず無反応になってしまう事象がありました。
    Git for Windows付属のopensslを実行するときはwinptyが必要なのでwinptyコマンドが必要です。
$ **winpty** openssl pkcs12 -export -inkey client.key -in client_certificate.pem -out client.p12 -name "client1"
:::

# アクセス
まずは、インポートせずにアクセスします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1899411/2c72c5f3-db18-0b17-8687-caaf5aae0fe6.png)

No required SSL certificate was sentと出てきてアクセスできません。

続いてpkcs12ファイルを端末にインストールします。
pkcs12ファイルをクリックするとウィザードが出てきますので、個人の欄にインポートされていることを確認してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1899411/e406f0e1-64d6-fbd3-aa68-1d161d1a6bf1.png)

インポート後アクセスしてみると証明書の選択と出てきますのでOKを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1899411/32804517-2902-46c9-d187-952aad2fce9b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1899411/6da1bb16-039b-1b65-8ee4-d704e7aff5f3.png)

アクセスできました。

# さいごに
クライアント証明書を持っている人だけがアクセスできるような環境はできました。しかしながら実運用では端末を紛失したり秘密鍵などが漏れた場合、証明書を失効させるケースがありますがFLBには失効を確認する手段がないため、例えば証明書の有効期限を短くする運用などが求められると思います。


# 参考文献
https://qiita.com/NICAREGI/items/a1077ca67f5d4a8f0e29

https://qiita.com/ryotkato/items/1968819381353e05f665

https://www.simpletraveler.jp/2021/09/23/client-certificate-authorization-part1-overview-certificate-creation/

https://docs.oracle.com/ja-jp/iaas/Content/Balance/Tasks/managingcertificates.htm