OCI証明書サービスの使用体験

本ブログは、[オラクル・クラウドの個人ブログ](https://qiita.com/liu-wei/items/10152a4fec813c1b7d98)の1つです。

__初めに__

OCI証明書は、2021年10月27日にリリースされた新しいOCIマネージド・サービスです。以前、OCIロード・バランサーから証明書を利用したい時、OCI自分の証明書ではなく、外部の証明書しか利用できませんでした。これから、OCI自分で証明局(CA)、証明書(Certificate)、CAバンドルの作成とライフサイクル管理ができるようになりました。証明書サービスは<font color=blue>無料</font>で利用できます。

__サポート対象のOCIサービス__
Load Balancer
API Gateway
WAF (Web Application Firewall)

__OCIコンソールからの入り口__
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/8931084b-678f-0fc1-7bdd-121d5a0401ef.png)


__サービス制限__
<font color=blue>Free Tier</font>の場合、一つのテナンシに、最大 <font color=blue>5</font> 証明局(CA)、<font color=blue>150</font> 証明書(Certificate)が作成できます。有料アカウントの場合、以下となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/3c7303d5-17be-3fc4-4e01-04620d16d4ed.png)

__他社の類似サービス__

|OCI|AWS|Azure|Google Cloud|
|:--|:--|:--|:--|
|OCI Certificates|AWS Certificate Manager|App Service Certificates|Google Cloud CA Service|


今回は、証明局(CA)、証明書(Certificate)の作成方法と、Load Balancerからの利用方法を簡単に紹介したいと思います。

__ステップ__
- [1. 準備](#1-準備)
  - [1-1. IAMポリシーの作成](#1-1-iamポリシーの作成)
  - [1-2. ボールトの作成](#1-2-ボールトの作成)
  - [1-3. マスター暗号化キーの作成](#1-3-マスター暗号化キーの作成)
- [2. 証明局(CA)の作成](#2-証明局caの作成)
- [3. 証明書の作成](#3-証明書の作成)
- [4. Load Balancerから証明書の使用](#4-load-balancerから証明書の使用)
  - [4-1. LBの作成](#4-1-lbの作成)
  - [4-2. ドメイン名とLBのIPアドレスを紐付ける](#4-2-ドメイン名とlbのipアドレスを紐付ける)
  - [4-3. LBの動作確認](#4-3-lbの動作確認)

# 1. 準備
## 1-1. IAMポリシーの作成

|ポリシー名|グループ・動的グループ|目的|権限|
|:--|:--|:--|:--|
|[Policy_Security_Admin](#policy_security_admin)|SecurityAdmins|<font color=blue>セキュリティ</font><strong>管理者</strong>向け|Vault/Key/Secretの作成・更新・削除|
|[Policy_CA_DG](#policy_ca_dg)|CertificateAuthority-DG|<font color=blue>動的グループ</font>向け|キーの利用、関連オブジェクトの作成・更新・削除|
|[Policy_CA_Admin](#policy_ca_admin)|CertificateAuthorityAdmins|<font color=blue>証明局(CA)</font><strong>管理</strong>者向け|CAの作成・更新・削除|
|[Policy_Certificate_Admin](#policy_certificate_admin)|CertificateAdmins|<font color=blue>証明書</font><strong>管理</strong>者向け|証明書の作成・更新・削除|
|[Policy_Certificate_User](#policy_certificate_user)|CertificateUsers|<font color=blue>証明書</font><strong>利用</strong>者向け|証明書の使用|

__動的グループ（CertificateAuthority-DG）の一致ルール__
resource.type='certificateauthority'

__Policy_Security_Admin__
```
Allow group SecurityAdmins to manage vaults in compartment PoC
Allow group SecurityAdmins to manage keys in compartment PoC
Allow group SecurityAdmins to manage secret-family in compartment PoC
```

__Policy_CA_DG__

```
Allow dynamic-group CertificateAuthority-DG to use keys in compartment PoC
Allow dynamic-group CertificateAuthority-DG to manage objects in compartment PoC
```

__Policy_CA_Admin__

```
Allow group CertificateAuthorityAdmins to manage certificate-authority-family in compartment PoC
Allow group CertificateAuthorityAdmins to read keys in compartment PoC
Allow group CertificateAuthorityAdmins to use key-delegate in compartment PoC
Allow group CertificateAuthorityAdmins to read buckets in compartment PoC
Allow group CertificateAuthorityAdmins to read vaults in compartment PoC
```

__Policy_Certificate_Admin__

```
Allow group CertificateAdmins to inspect certificate-authority-family in compartment PoC
Allow group CertificateAdmins to use certificate-authority-delegate in compartment PoC
Allow group CertificateAdmins to manage leaf-certificate-family in compartment PoC
```

__Policy_Certificate_User__

```
Allow group CertificateUsers to use leaf-certificate-family in compartment PoC
Allow group CertificateUsers to use certificate-authority-delegate in compartment PoC
Allow group CertificateUsers to manage certificate-associations in compartment PoC
Allow group CertificateUsers to inspect certificate-authority-associations in compartment PoC
Allow group CertificateUsers to manage cabundle-associations in compartment PoC
```
この例は、ルート・コンパートメントの下に「PoC」というコンパートメントを使用しています。

## 1-2. ボールトの作成
メニュー → アイデンティティとセキュリティ → ボールト
ボールト名を入力し、「ボールトの作成」ボタンをクリックします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/c4c7e08d-811c-fea5-d1ea-320d24f7f96b.png" width="550">

## 1-3. マスター暗号化キーの作成
ボールトが作成された後、マスター暗号化キーの作成を続行します。
マスター暗号化キー → キーの作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/5fed592d-dccf-3feb-8589-c5ecca6b4558.png)

「保護モード」は、デフォルトの<font color=blue>HSM</font>にします。
「キーのシェイプ: アルゴリズム」の選択肢が以下のような三つがあります。
<strong>デフォルト</strong>は、<strong>AES(対称キー)</strong>となりますが、証明局(CA)作成時、<font color=blue>非対称キー</font>は必要であるので、ご注意ください。この例では、RSAを利用します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/a6062f65-8038-909e-e48e-8f701ca45465.png" width="550">
作成後
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/3857efbe-17f6-a292-c5d1-be084bb9dbd4.png">


# 2. 証明局(CA)の作成
Menu -> Identity & Security -> Certificate Authorities-> Create Certificate Authority

__基本情報__
この例は、"Root CA"を作成します。名前と説明を入力してから、続行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/a8e337ac-6b12-8125-d1d9-8ba56504f796.png)

__サブジェクト情報__
適当な名前を入力してから続行します。必要に応じて、追加情報（オプション）を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/37ce8f09-0829-cae7-5463-b1d9bc709cf5.png)

__CA構成情報__
|項目|内容|
|:--|:--|
|有効期間の開始日|デフォルトは空白（即時有効になる）。|
|有効期間の終了日|デフォルトは、<font color=blue>10年後</font>の当日00時(UTC)である。<br>2037年12月31日以降の日付は指定できない。|
|ボールト|既存のボールトを指定|
|キー|既存のキーを指定（HSM 非対称キー）|
|署名アルゴリズム|キーシェイプは、RSAの場合:<br>SHA256_WITH_RSA, SHA384_WITH_RSA, SHA512_WITH_RSA<br>キーシェイプは、ECDSAの場合:<br>SHA256_WITH_ECDSA, SHA384_WITH_ECDSA, SHA512_WITH_ECDSA|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/2a4edb49-a141-85a3-4405-20583bf58c42.png)

__ルール__: デフォルトのままにして、続行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/71f364e3-6bfc-c9fa-b2fc-800fd8cd08c6.png)

__失効構成の情報__（<strong>オプション</strong>）
|項目|内容|
|:--|:--|
|失効のスキップ|証明書失効リスト(CRL)を構成しない場合は、チェックする。デフォルトは、チェックしない。|
|オブジェクト・ストレージ・バケット|既存のバケットを指定|
|オブジェクト名の書式|適当な名前を入力|
|カスタム書式設定済URL|オプション|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/519768af-001c-b1d3-2c88-51fb228d8015.png)

__サマリー__
入力した情報を確認して、作成を開始します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/7e9ea0d0-8b99-0d42-25de-da9b07525920.png)

CA作成後
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/04b0cdc3-9556-b0d1-99a9-78ccfb654fd9.png)

__以下のようなエラーが発生したら__
`Authorization failed or requested resource not found: Key Id <OCID>`

<strong>原因</strong>：キーの利用権限が足りない。
<strong>解決策</strong>：動的グループの方法で、キーの利用権限を付与する。
上記のステップ1-1に、動的グループとポリシー(Policy_CA_DG)が、正しく設定されているのかを確認してください。

# 3. 証明書の作成
Menu -> Identity & Security -> Certificates -> Create Certificate
この例は、「内部CAによって発行済」を指定します。証明書の名前と説明を入力し、続行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/b463ae02-b85c-0869-7a41-2c13807798ea.png)
__サブジェクト情報__
Common Name: ドメイン名を入力
DNS名: ドメイン名を入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/886237dc-389b-2b9a-b3ce-f2a4a08c62f7.png)

証明書のの構成情報を入力します。

|項目|内容|
|:--|:--|
|証明書プロファイル・タイプ|選択肢（四つ）：<br>TLS Server or Client, TLS Server, TLS Client, TLS Code Sign|
|発行者認証局|既存のCAを指定|
|有効期間の開始日|デフォルトは空白（即時有効になる）。|
|有効期間の終了日|デフォルトは、<font color=blue>90日後</font>の当日00時(UTC)である。<br>発行CAの有効期限を超えてはいけない。2037年12月31日以降の日付も指定できない。|
|キー・アルゴリズム|選択肢（四つ）：<br>RSA2048, RSA4096, ECDSA_P256, ECDSA_P384|

※この例は、「有効期間の終了日」について、デフォルトの90日後ではなく、50日後の日付にしています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/f448ff0a-d480-ce7c-70bb-c768a44a6674.png)

|項目|内容|
|:--|:--|
|更新間隔(日数)|デフォルトは、90日間である。<br>前画面の「有効期間の終了日」より、自動に計算される。|
|前払更新期間(日数)|デフォルトは、30日間|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/5b34ba3a-0d27-2643-cacb-f672058362a5.png)

サマリー画面で、入力した情報を確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/75f6699e-ce99-2a25-6a37-4c017fd1b7ec.png)

証明書作成後
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/27149d31-ea66-c673-aec6-3a17dfd98cdb.png)

__以下のようなエラーが発生したら__
`The validity period <number> exceeds the maximum validity period allowed <number>`.
<strong>原因</strong>: 指定した有効期間の日付は無効である。証明書の有効期間は、CAの有効期間を超えてはいけない。
<strong>解決策</strong>: 有効な日付を指定し、もう一回作成する。

# 4. Load Balancerから証明書の使用
## 4-1. LBの作成
MENU -> Networking -> Load Balancers -> Create Load Balancer
LBの構成情報は以下となります。作成画面の詳細を省略させていただきます。

|項目|内容|
|:--|:--|
|LBタイプ|従来通りの"Load Balancer"|
|可視性タイプ|パブリック|
|シェイプ|フレキシブル・シェイプ|
|ロード・バランシング・ポリシー|Weighted Round Robin|
|ヘルス・チェック・ポリシー|HTTP|
|リスナー|HTTPS|
|SSL Traffic|<font color=blue>SSL Termination</font><br>フロントはHTTPSで、バックエンドはHTTPである。|

この例で、バックエンドのヘルス・チェック・ポリシーは、HTTPを利用しています。もし、SSLを利用したい場合、次のように証明書の指定ができます。（CAバンドルか証明局のどちらを指定する）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/d72d6737-ee6a-05a9-626c-89eb9e1d5422.png)

リスナー構成画面で、証明書を指定してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/3f5db596-0dec-23c3-165d-09f18ec46ffd.png)

LB作成後、ヘルスステータスがOKであることを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/ab20ff8a-318f-b0dd-2ceb-aecf1f67fee1.png)

認証局(CA)と証明書のPEMファイルをダウンロードして、接続端末のブラウザを開き、次のように証明書をインポートします。
- 信頼されたルート証明機関に、認証局(CA)のPEMファイルをインストール。
- 信頼された発行元に、証明書のPEMファイルをインストール。

## 4-2. ドメイン名とLBのIPアドレスを紐付ける
ドメイン名を識別できるように、以下のいずれの方法はOKです。
- 方法１：Windowsホストファイルの編集
作業対象：接続端末	
編集ファイル名：C:\Windows\System32\drivers\etc\hosts	
編集内容：次の行を追加する	
例：\<LBのIPアドレス> xxx.com

- 方法２：LBのパブリックIPをDNSレコードに追加して、公開する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/3b01778e-6157-8c7d-4ea8-2d64c4efc30b.png)

## 4-3. LBの動作確認
ブラウザを開き、ドメイン名（`https://xxxx.com`）で無事にWelcomeページが表示できるのを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/5c040a45-d40b-e2a7-7123-9158f59d569b.png)

証明書は有効であるのを確認します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/c8f8b82f-0948-61ae-0f4c-39ffdb114163.png", width="450">

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/677288eb-8b02-41af-a7b6-ece27b882225.png", width="450">

ここまで、証明書の作成とLBからの利用は完了です。

以上

__関連記事__
[オラクル・クラウドの個人ブログ一覧](https://qiita.com/liu-wei/items/10152a4fec813c1b7d98)

----
__公式ドキュメント__
[証明書](https://docs.oracle.com/ja-jp/iaas/Content/certificates/home.htm)
[認証局の管理](https://docs.oracle.com/ja-jp/iaas/Content/certificates/managing-certificate-authorities.htm)
[ポリシー・リファレンス   ->  証明書サービスの詳細](https://docs.oracle.com/ja-jp/iaas/Content/Identity/Reference/certificatespolicyreference.htm)
[ロード・バランサのSSL証明書管理](https://docs.oracle.com/ja-jp/iaas/Content/Balance/Tasks/managingcertificates.htm)
[証明書サービスのトラブルシューティング](https://docs.oracle.com/ja-jp/iaas/Content/certificates/troubleshooting.htm)
[OCI Certificates FAQ](https://www.oracle.com/security/cloud-security/ssl-tls-certificates/faq/)