OCI LBロードバランサでTLS/SSLを終端する

#はじめに
検証でクイックにOracle Cloud Infrastructure(OCI) LB(ロードバランサ)でSSLを終端する手順。
（検証とはいえ、HTTP(80)で外部公開とか作りたくない人向け）

※本来はTLSであるが、マニュアル表記やGUI上の表記は「SSL」であるため、以後は「SSL」と記載している

参考ブログ：https://www.ateam-oracle.com/load-balancing-ssl-traffic-in-oci
マニュアル：https://docs.cloud.oracle.com/en-us/iaas/Content/Balance/Tasks/managingcertificates.htm


#全体の流れ

1. Linuxで自己証明書を作成
2. OCI LBでSSL終端させる設定(一般的なSSLアクセラレータ)
3. 【Appendix】＋ LB-WEBサーバ間もSSL通信させる設定(End to End SSL)
4. 【Appendix】LBはルーティングだけして、WEBサーバでSSL終端させる

#前提
- OCIのネットワーク周り、VCNやサブネットは構成済み
- 自己証明書発行用LinuxはOracle Linux 7.7 デプロイ直後の初期イメージでに1台
- LBはAlways Free(無償!）で構築済み
- バックエンドのWebサーバは、OCIマーケットプレイスで展開しているJenkins(ライセンスは無償）を利用でデプロイ済み

### 予備知識

- OCI LBは自己証明書は対応している
- OCI LBはLet's Encryptの証明書にも対応している
- OCI LBはセルフCAを建てて、CA認証局で署名したサーバ証明書(SSL証明書)は登録できなかった。追加確認。。


#1.Linuxで自己証明書を作成

### ①OSにSSHでログイン
「opc」ユーザ
### ②rootに切り替え

```
$ sudo -i
```
### ③秘密鍵生成
AES256bitの共通鍵を使って、RSA2048bitの秘密鍵を生成

```
# openssl genrsa -out private_key.pem -aes256 2048
Generating RSA private key, 2048 bit long modulus
................................................................................+++
....................................+++
e is 65537 (0x10001)
Enter pass phrase for private_key.pem:　(パスワード付与する)
Verifying - Enter pass phrase for private_key.pem:　(パスワード付与する)

# ll
total 4
-rw-r--r--. 1 root root 1766 Jan 28 14:30 private_key.pem
```

### ④CSR作成
先ほど生成した秘密鍵を使ってCSRを作成
※「Common Name」以外は適当。「Common Name」は実際にサーバにアクセスする際の名前もしくはIPアドレスにするのが良い。名前の場合、自分で所有している実在するドメイン名だと

```
# openssl req -new -key private_key.pem -out www.csr
Enter pass phrase for private_key.pem:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:JP
State or Province Name (full name) []:Osaka
Locality Name (eg, city) [Default City]:Osaka
Organization Name (eg, company) [Default Company Ltd]:Company
Organizational Unit Name (eg, section) []:Infra
Common Name (eg, your name or your server's hostname) []:www.sample.work       
Email Address []:user@sample.work

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []: (そのままEnter)
An optional company name []:　(そのままEnter)

# ll
total 8
-rw-r--r--. 1 root root 1766 Jan 28 14:30 private_key.pem
-rw-r--r--. 1 root root 1054 Jan 28 14:40 www.csr
```

### ⑤自己証明書の生成
ここで出てくる「www-self.crt 」がサーバ証明書（SSL証明書）である

```
# openssl x509 -in www.csr -out www-self.crt -req -signkey private_key.pem -days 3650
Signature ok
subject=/C=JP/ST=Osaka/L=Osaka/O=Company/OU=Infra/CN=www.sample.work/emailAddress=user@sample.work
Getting Private key
Enter pass phrase for private_key.pem: (秘密鍵のパスワードを問われるので、①のときに指定したPWを入力)
```

![Image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266598/48dbfccd-a97f-c90e-af8e-aac849800084.png)

⑥確認
www-self.crt・・・OCILBの「SSL証明書」として登録するもの
private_key.pem・・・OCILBに「秘密キー」として登録するもの

```
# ll
total 12
-rw-r--r--. 1 root root 1766 Jan 28 14:30 private_key.pem
-rw-r--r--. 1 root root 1054 Jan 28 14:40 www.csr
-rw-r--r--. 1 root root 1298 Jan 28 14:47 www-self.crt
```

#２．OCI LBでSSL終端させる設定

事前にLBも作成済（無料！）
![Image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266598/b379f5c4-6b1b-ed7e-d021-5ab7a792e5cf.png)

###①OCI設定を開く
ロードバランサ詳細開いて「証明書の追加」
![Image [2].png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266598/56a97422-9869-ec1b-a640-4cf8a97cc8fd.png)

###③証明書の登録
以下をそれぞれ登録（テキスト形式なので、今回は開いてコピペ）

- www-self.crt・・・OCILBの「SSL証明書」として登録するもの
- private_key.pem・・・OCILBに「秘密キー」として登録するもの

※パスフレーズは秘密鍵のパスワードを入力する
※自己証明書なので「CA証明書」は無いため、無くてもOK。ただし、LB-WEB間もSSL通信させたい場合は必要なので、~~無駄にでもopensslでCAで認証局を建ててその際に出てくるCA認証局の証明書を登録する。（自己CA認証局で署名したサーバ証明書は、OCILBでは「SSL証明書」として利用はできない~~ その際にはサーバ証明書をこちらにも登録する
![Image [3].png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266598/9416c908-3bee-894a-a7c9-594782e0c613.png)

登録された
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266598/cbd87268-2786-0573-ac7f-96edeff6ba14.png)


###④リスナー設定を変更
（下記手順で変更できない部分がある場合は、リスナーのみ再作成する）
ポイントを記載

- プロトコル：HTTP
- ポート：443
- SSL使用にチェック
- 登録したサーバ証明書を指定

![Image [4].png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266598/814fdf65-91ae-5586-d1d8-e2e80d39c86f.png)

※バックエンドセット名はいまは気にしない

###以上、の手順で完成
「OCI LBロードバランサでTLS/SSLを終端する」の確認

※今回はwww.sample.work は　PCのhostsに書いている。ここは実在するドメイン名で、自分で管理する権威DNSサーバでAレコード等を記載するのが良い。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266598/8ea8eb66-6477-b641-10d8-83b22bd76b13.png)

# [Appendix]LB-WEBサーバ間もSSL通信させる設定(End to End SSL)
バックエンドセットを編集し、「SSLの使用」にチェックを入れ、リスナーに登録したものと同じ証明書を選択する。
※ただし、証明書を登録する際に「CA証明書」も入ったものでないとエラーになる。よって、自己証明書ではEnd to End SSLは正しく設定できない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266598/52f0b7a1-2e13-9c6a-a1d3-4b57e50dd939.png)

# [Appendix]LBはルーティングだけして、WEBサーバでSSL終端させる

- リスナーはHTTPではなく、あえてTCPの443で待ち受ける。
そして、「SSLの使用」のチェックは外す。
![Image [5].png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266598/564eeebc-db5d-3128-f65e-dddf630c44db.png)

- バックエンドセットは プロトコル指定はないので、普通443宛に流す。
- 「SSLの使用」にチェックは入れない。
![Image [7].png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266598/ca4a65d5-8686-9f9e-0566-7dd507ed2d94.png)

- 「セキュア」属性のチェックは外す。

![Image [6].png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266598/62536432-233a-9bbe-07d9-a39fd4435f21.png)


以上