【OCI_15】プライベート認証局を作成、証明書を発行し、ロード・バランサへ適用してHTTPS通信を検証する
OCIチュートリアルを参考にプライベート認証局を作成、証明書を発行し、証明書をロード・バランサへ適用してHTTPS通信ができるか検証してみたいと思います。
AWSのACMのようにパブリック証明書を試してみたかったのですが、無料アカウントでは難しそうでしたのでプライベート認証局の証明書を試してみようと思います。
プライベート認証局と証明書の発行
https://oracle-japan.github.io/ocitutorials/intermediates/certificate/
目次
プライベート認証局(Private CA)とは
プライベート認証局とは、企業や組織が自分たちの閉じたネットワーク内で運用する認証局(CA)のことです。
発行する証明書は、その組織の内部でのみ有効で、主に 社内システムの認証用 や VPN通信、ロードバランサ内部の暗号化通信 などに利用されます。
プライベート認証局で発行した証明書は、インターネット上の一般ブラウザからは信頼されません。
ただし、プライベート認証局からダウンロードしたルート証明書をブラウザにインポートすれば、そのブラウザ(または端末)では信頼された状態となり、HTTPS通信が可能になります。
前提条件
・作業は、管理者権限を持つユーザーで行います。ルートユーザーと全体管理者を準備してください。
・空のオブジェクトストレージを作成しておく必要があります。
・証明書を適用できるロード・バランサやWEBサーバを準備しておきます。
・証明書の共通名とするドメイン名やFQDNを準備しておきます。
動的グループとポリシーの作成
証明書サービスを利用する際は、証明書サービス自体がVaultサービスやオブジェクトストレージを利用する権限が必要になるので、そのために証明書サービスを動的グループに所属させ、その動的グループに権限を付与したいと思います。
調べたところ、動的グループは、テナンシ直下に存在しているため、通常はルートアカウントでないと作業できないようです。
ルートアカウントでサインインして、ルートテナンシ → アイデンティティとセキュリティ → アイデンティティ → ドメイン → Default → 動的グループタブを辿らないと見つけれませんでした。
ポリシーは、ルートアカウントでも全体管理者(コンパートメントレベル)でも作成できるそうですが、面倒なので動的グループとポリシーは、ルートアカウントで作成したいと思います。
さらに調べたところ、OCIの証明書サービス・Vault・オブジェクトストレージなどは「OCIが提供するネイティブサービス」でこれらの内部的な操作(API呼び出し)を行う際に使われる サービスプリンシパル(Service Principal) は、すべて Defaultドメイン に存在しているそうです。
なので動的グループの作成は、Defaultドメインの動的グループタブから作成しないとうまく機能しないそうです。
例えば、全体管理者で別途ドメイン(例:testdomain)を作成し、そのドメインの動的グループタブから動的グループを作成してもtestdomainドメインには、証明書サービス・Vault・オブジェクトストレージなどの実体(Principal)がいないため、実質的に動作しないそうです。(このあたりは、もう少し慣れてきたら理解できるかもと思ってます。)
動的グループの作成
ルートアカウントでサインインします。
左上ハンバーガーメニューから アイデンティティとセキュリティ > ドメイン > Default > 動的グループタブ を選択し、「動的グループの作成」をクリックします。

動的グループの作成画面で以下を入力、選択します。
名前:任意名
説明:任意名

一致ルールで以下を入力、選択し、他はデフォルトのままで右下の「作成」をクリックします。
一致ルール:下で定義したいずれかのルールに一致、もしくは、下で定義したすべてのルールに一致のどちらでも可
ルール1:resource.type = ‘certificateauthority’
※「リソースタイプが certificateauthority(認証局)であるリソースを、この動的グループのメンバーとみなす」という意味になります。

動的グループが作成されました。

ポリシーの作成
左上ハンバーガーメニューから アイデンティティとセキュリティ > ポリシー を選択し、「ポリシーの作成」をクリックします。

ポリシーの作成画面で以下を入力、選択します。
名前:任意名
説明:任意名
コンパートメント:自身の権限のあるコンパートメント(ここではルート・コンパートメントを選択しています)

ポリシー・ビルダー:「手動エディタの表示」をクリックし、テキストウィンドウへ以下を入力します。
例:Allow dynamic-group 動的グループ名 to use keys in compartment コンパートメント名
例:Allow dynamic-group 動的グループ名 to manage objects in compartment コンパートメント名

その他はデフォルトのまま、右下の「作成」をクリックします。
ポリシーが作成されました。

ルートアカウントの作業はここまでとしてサインアウトします。
ボールト(Vault)の作成
全体管理者でサインインします。

左上ハンバーガーメニューから アイデンティティとセキュリティ > ボールト を選択し、「ボールトの作成」をクリックします。

ボールトの作成画面で以下を入力、選択し、右下の「ボールトの作成」をクリックします。
コンパートメントに作成:自身の権限のあるコンパートメント
名前:任意名
仮想プライベート・ボールトにする:OFF
※チュートリアルの注意書きより「仮想プライベート・ボールトにする」をONにすると1時間あたり「¥446.88」の課金が発生し、後から変更できないようです。さらにボールト作成後は、最短でも7日後でしか削除できない仕様のようなので最低でも「約¥75,000」の課金が発生するそうです。
ご注意ください!

マスター暗号化キーの作成
ここで作成するマスター暗号化キーは、Vault の中で、他の鍵(データ暗号化キーなど)を暗号化/保護するために使われる「トップレベルの鍵」となります。
左上ハンバーガーメニューから アイデンティティとセキュリティ > ボールト > 作成したボールト名 を選択、「マスター暗号化キー」タブを選択、「キーの作成」をクリックします。

キーの作成画面で以下を入力、選択し、右下の「キーの作成」をクリックします。
コンパートメントに作成:自身の権限のあるコンパートメント
保護モード :[HSM]
名前:任意名
キーのシェイプ: アルゴリズム:[RSA]
キーのシェイプ: 長さ:[2048 ビット]
外部キーのインポート:OFF

マスター暗号化キーが作成されました。

プライベート認証局の作成
チュートリアルによると認証局は作成後すぐに削除はできず、最短で 7日後から削除指定が可能のようですので間違わないよう注意してください。
左上ハンバーガーメニューから アイデンティティとセキュリティ > 認証局 を選択、「認証局の作成」をクリックします。

基本情報画面で以下を入力、選択し、左下の「次」をクリックします。
コンパートメントに作成:自身の権限のあるコンパートメント
認証局タイプ:ルート認証局
名前:任意名
説明:任意名

サブジェクト情報画面で以下を入力、選択し、左下の「次」をクリックします。
共通名:任意名(証明書の発行者を意味するそうです)
※追加フィールドの項目は、必須でないそうなのでデフォルトのままとします

権威の構成画面で以下を入力、選択し、左下の「次」をクリックします。
有効期間の開始日:デフォルトのまま (即時有効になる)
有効期間の終了日:デフォルトのまま(10年後のUTC0:00時)
<コンパートメント名>のボールト:作成したものを選択(デフォルトで選択されました)
<コンパートメント名>のキー:作成したものを選択(デフォルトで選択されました)
署名アルゴリズム :[SHA256_WITH_RSA] を選択(デフォルトで選択されました)

ルール画面で以下を入力、選択し、左下の「次」をクリックします。
証明書の最大有効期間(日数):90(デフォルト)
下位CAの最大有効期間(日数):3650(デフォルト)

失効構成画面で以下を入力、選択し、左下の「次」をクリックします。
失効のスキップ:OFF
オブジェクトストレージバケット:事前に作成した空のオブジェクトストレージ
オブジェクト名形式:任意名
カスタム形式のURL:空(デフォルト)

サマリーの内容を確認し、「認証局の作成」をクリックします。

「認証局が正常に作成されました」が表示されることを確認します。
以上で、「認証局」の作成は完了となります。

証明書の作成
チュートリアルによると証明書も認証局同様、作成後すぐに削除はできず、最短で 7日後から削除指定が可能のようですので間違わないよう注意してください。
左上ハンバーガーメニューから アイデンティティとセキュリティ > 認証局 > 作成した認証局 を選択、「証明書の発行」をクリックします。

基本情報画面で以下を入力、選択し、左下の「次」をクリックします。
コンパートメントに作成:自身の権限のあるコンパートメント
認証局タイプ:内部CAによって発行済み
名前:任意名
説明:任意名

サブジェクト情報画面で以下を入力、選択し、左下の「次」をクリックします。
共通名:任意名(FQDN やドメイン名を付けることが多いです。自身の環境に合わせてください)
サブジェクトの代替名:リストボックスから [DNS名] を選択し、テキストボックスに任意のFQDNまたはドメイン名を指定します。
※追加フィールドの項目は、必須でないそうなのでデフォルトのままとします

証明書構成画面で以下を入力、選択し、左下の「次」をクリックします。
証明書プロファイル・タイプ:TLSサーバーまたはクライアント
<コンパートメント名>の発行元認証局:作成したものを選択
有効期間の開始日:デフォルトのまま(即時有効になる)
有効期間の終了日:デフォルトの日付「-1日」を指定
※デフォルトは 90日後が指定されているが、その値では未満にならない為、デフォルトの90日後から「-1日」を設定する必要があります
キー・アルゴリズム:RSA2048

ルール画面で以下を入力、選択し、左下の「次」をクリックします。
更新間隔(日数):89(デフォルトでは、前画面の有効期限が反映されます)
拡張更新期間(日数) :30(デフォルト)

サマリーの内容を確認し、「証明書の作成」をクリックします。

「証明書が正常に作成されました」が表示されることを確認します。
以上で、「証明書」の作成は完了となります。

ロードバランサに証明書サービスを適用
証明書サービスをロードバランサに適用することで、証明書の更新などを行った際に自動的に更新できます。
リスナーの作成
ロードバランサの作成時、もしくはロードバランサ作成後にリスナーの構成をします。
今回は、ロード・バランサは作成済みとなります。ロード・バランサの構成に関する記事は、冒頭で紹介しています。
左上ハンバーガーメニューから ネットワーキング > ロード・バランサ > 作成したロード・バランサ を選択、「リスナー」タブを選択、「リスナーの作成」をクリックします。

リスナーの作成画面で以下を入力、選択します。
名前:任意名
プロトコル:HTTPS
ポート:443
証明書リソース:証明書サービス管理対象証明書
証明書コンパートメント:証明書を作成したコンパートメント
証明書:作成した証明書

バックエンド・セットを選択し、右下の「リスナーの作成」をクリックします。

HTTPS通信用のリスナーが追加されました。「SSLの使用」が「はい」になっていることを確認します。

ロード・バランサ用のセキュリティリストの編集
ロード・バランサ用のセキュリティリストへ443番ポート宛てのTCPを許可するイングレスルールを設定します。
左上ハンバーガーメニューから ネットワーキング > 仮想クラウド・ネットワーク > 作成したVCN を選択、「セキュリティ」タブを選択、ロード・バランサ用のセキュリティ・リストをクリックします。

「セキュリティ・ルール」タブを選択、「イングレス・ルールの追加」から443番ポート宛てのTCPを許可するイングレスルールを設定します。

ルート証明書のインポート
ロードバランサから送られてきたサーバー証明書が本当に正しい証明書なのかを検証するために、クライアント側でルート証明書をあらかじめ用意しておく必要があります。
ルート証明書のダウンロード
左上ハンバーガーメニューから アイデンティティとセキュリティ > 認証局 > 作成した認証局 を選択します。
左ペインのバージョンを選択、バージョンの右側のトリコロンを展開し、「コンテンツの表示」をクリックします。

「証明書PEM」の「ダウンロード」をクリックして証明書ファイル(pem)をダウンロードします。

証明書ファイル(pem)がダウンロードされました。

ルート証明書のインポート
自身のブラウザの設定で、ダウンロードしたルート証明書をインポートします。
今回は、Microsoft Edge を利用します。
Edgeを起動します。
右上の「…(設定など)」> [設定] をクリックします。
左側メニューで [プライバシー、検索、サービス] を選択します。
下にスクロールして [セキュリティ] > [証明書の管理] をクリックします。
[ Windowsからインポートされた証明書を管理 ] をクリックします。
[ 信頼されたルート証明機関 ]タブを選択、インポートをクリックします。
「証明書のインポートウィザード」が起動するので「次へ」をクリックします。

「参照」ボタンをクリックして事前にダウンロードしていた証明書ファイルを選択し、「次へ」をクリックします。

証明書ストアで「証明書をすべてのストアに配置する」を選択、「信頼されたルート証明機関」を選択し、「次へ」をクリックします。

証明書のインポートウィザードの完了で「完了」をクリックします。

セキュリティ警告が表示された場合は、「はい」をクリックします。

「正しくインポートされました。」が表示されることを確認し、「OK」をクリックします。

「信頼された証明機関」へルート証明書がインポートされました。

ブラウザで動作確認
すべての設定が完了したのでルート証明書をインポートしたMicrosoft Edgeを起動して「https://web.ドメイン名」へアクセスします。
警告は表示されず「https」でWEBサーバのWEBページを表示することができました!!
証明書ビューアーでも証明書の詳細を確認することができました。

まとめ
プライベート認証局を作成、証明書を発行し、ロード・バランサへ適用してHTTPS通信を検証することができました。
以下、他の記事をまとめた一覧です。OCI以外にAWSもまとめています。