Database Support Blog

  • Oracle Cloud
2023.09.15

【Oracle Cloud】OCI Certificatesで作成したクライアント証明書をOCI Load Balancerで使ってみよう

OCI Load Balancer(Oracle Cloud Infrastructure Flexible Load Balancer、以下、ロード・バランサ)を利用するにあたってSSL通信をする要件が多いかと思います。また、要件によってクライアント認証を使用するケースもあります。

OCIでは、Oracle Cloud Infrastructure Certificates(以下、OCI Certificates)のサービスで作成した証明書をロード・バランサで使用することが可能ですが、クライアント証明書をロード・バランサで使用する手順が煩雑なため、本記事で手順をご紹介します。

ブラウザの種類やバージョンによってブラウザ側のセキュリティ要件も変わりうるため、一部手順が異なる可能性がある点、あらかじめご了承ください。

なお、クライアント証明書を使用するにあたり前提として必要となるOCI Certificatesのサービスを使用したプライベート認証局(ルート認証局)とサーバー証明書の作成手順、ロード・バランサの作成手順については、オラクル社が公開している以下資料に記載があるため、本記事では割愛します。


チュートリアル

 プライベート認証局と証明書の発行(手順2~4)

 ロードバランサーでWebサーバーを負荷分散する(手順3~4)




OCI Certificatesでクライアント証明書を作成する手順

まず、OCIコンソールからOCI Certificatesのサービスでクライアント証明書を作成します。その後、OCIコンソールのCloud Shellから、秘密鍵とクライアント証明書をPKCS#12形式に変換し、変換後のファイルをクライアントマシンに転送します。


OCIコンソールを使用したクライアント証明書の作成

OCIコンソールからOCI Certificatesのサービスでクライアント証明書を作成します。



OCIコンソールのメニューから、「アイデンティティとセキュリティ > 証明書」より「証明書の作成」をクリックします。


「基本情報」ページにて、「証明書タイプ」に「内部CAによって発行済」を選択します。
名前」と「説明」には任意の値を入力し、「」をクリックします。


「サブジェクト情報」ページにて、「共通名」に任意の値を入力します。
サブジェクトの代替名」で「DNS名」を選択して、右にあるテキストボックスにはロード・バランサのホスト名とする任意の値を入力し、「」をクリックします。


「証明書構成」ページにて、各項目を選択および指定して「」をクリックします。

・「証明書プロファイル・タイプ」で「TLSクライアント」を選択
・「<コンパートメント名>の発行元認証局」で「ルート認証局」を選択
・「有効期間の開始日」に証明書の有効期間の開始日を指定
・「有効期間の終了日」に証明書の有効期間の終了日を指定
・「キー・アルゴリズム」にサーバー証明書の作成時に作成した非対称キーのアルゴリズムと鍵長の組み合わせを指定

※有効期間の開始日を指定しない場合は作成直後から有効になります。


「ルール」ページにて、「更新間隔(日数)」に証明書の更新間隔(日)を指定し、「拡張更新期間(日数)」に証明書の有効期限が切れる前に更新が行われる日数を指定して、「」をクリックします。


※「更新間隔(日数)」ついては、認証局の作成時に指定した「証明書の最大有効期間(日数)」未満、およびクライアント証明書の作成時(「証明書構成」ページ)に指定している「有効期間の終了日」未満を指定する必要があります。


「サマリー」ページで内容に問題が無いかを確認し、問題が無ければ「証明書の作成」をクリックします。


「証明書が正常に作成されました」のメッセージが表示されれば作成完了です。



秘密鍵とクライアント証明書をPKCS#12形式に変換

クライアント証明書の作成が完了しましたが、このままではクライアント証明書を使用した接続で使用することができないため、秘密鍵とクライアント証明書をPKCS#12形式に変換する手順が必要です。



OCIコンソールの、作成したクライアント証明書のページにて、クライアント証明書のOCIDをコピーしてメモします。以下のような形式です。


ocid1.certificate.oc1.ap-tokyo-1.XXXXXXXXXXXX …


OCIコンソールの画面右上にある「開発者ツール」から「Cloud Shell」をクリックしてCloud Shellを起動します。


Cloud Shellが起動すると以下のようなプロンプトが表示されます。


秘密鍵を取得するため、Cloud Shellにて、以下コマンドを実行します。

※2023年9月現在、OCIコンソールから秘密鍵を取得する方法が無いため、以下コマンドを実行する必要があります。

コマンド構文

oci certificates certificate-bundle get
--certificate-id <クライアント証明書のOCID>
--bundle-type CERTIFICATE_CONTENT_WITH_PRIVATE_KEY


(実行例)


$ oci certificates certificate-bundle get \ > --certificate-id ocid1.certificate.oc1.ap-tokyo-1.XXXXXXXXXXXX … \ > --bundle-type CERTIFICATE_CONTENT_WITH_PRIVATE_KEY

{ "data": { "cert-chain-pem": "-----BEGIN CERTIFICATE-----\nMIIFUzCCBD … KX0pD+vDXxlDgY=\n-----END CERTIFICATE-----\n", "certificate-bundle-type": "CERTIFICATE_CONTENT_WITH_PRIVATE_KEY", "certificate-id": "ocid1.certificate.oc1.ap-tokyo-1.XXXXXXXXXXXX …", certificate-name": "kka-cert-client", "certificate-pem": "-----BEGIN CERTIFICATE-----\nMIIFeTCCB … IHOkhn2g9Zq0w==\n-----END CERTIFICATE-----\n", "private-key-pem": "-----BEGIN PRIVATE KEY-----\nMIIEvwIBA … Yj5Df7vJuxAhw==\n-----END PRIVATE KEY-----\n", "private-key-pem-passphrase": null, "revocation-status": null, "serial-number": "299410338515099185874451945528179435305265146203", "stages": [ "CURRENT", "LATEST" ], "time-created": "2023-07-08T14:20:18.622000+00:00", "validity": { "time-of-validity-not-after": "2023-10-05T00:00:00+00:00", "time-of-validity-not-before": "2023-07-08T14:20:18+00:00" }, "version-name": null, "version-number": 1 } }


oci certificatesコマンドで表示された結果から、「private-key-pem」の値をprivate_key.pemとして、「certificate-pem」の値をclientcert.pemとしてファイルを作成します。

その際、「\n」を削除して改行を入れる形で整形します。


$ vi private_key.pem $ vi clientcert.pem
$ cat private_key.pem -----BEGIN PRIVATE KEY----- MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQCxIVmzj+60Olav
 :
JEHeDyGspu39Ggju8QEEqYIUywxxLBdqlrFjmLmWpgWGQrbyY2gjJeUeHR1wn36o fi+ok+uIuFAzvYj5Df7vJuxAhw== -----END PRIVATE KEY-----


$ cat clientcert.pem -----BEGIN CERTIFICATE----- MIIFeTCCBGGgAwIBAgIUNHIGH8F21/aGhZqEuTT5UpxeKVswDQYJKoZIhvcNAQEL
 :
ReuLNeq4NDwGzBX9nREbFFkqWi9pFJzNYS2Tit46kFjG6ro532c8Md4PqyrQDqun Sh27bIHOkhn2g9Zq0w== -----END CERTIFICATE-----




Cloud Shellにて、以下コマンドを実行して秘密鍵とクライアント証明書をPKCS#12形式のファイル(client.pfx)に変換します。パスワードの入力を求められますが、本記事の例では何も入力せずにEnterを押下します。

コマンド構文

openssl pkcs12 -export
-inkey <「private-key-pem」の値から作成した秘密鍵ファイル>
-in <「certificate-pem」の値から作成したクライアント証明書ファイル>
-out <変換後のPKCS#12形式のファイル名(任意)>


(実行例)


$ openssl pkcs12 -export -inkey private_key.pem -in clientcert.pem -out client.pfx Enter Export Password: <何も入力せずに Enter を押下> Verifying - Enter Export Password: <何も入力せずに Enter を押下> $


Cloud Shellの右上にあるCloud Shellのメニュー(歯車アイコン)をクリックし、「ダウンロード」をクリックしてclient.pfxをダウンロードします。



ダウンロードが完了したらCloud Shellの右上にある ✕ アイコンをクリックしてCloud Shellを終了します。
その後、ダウンロードしたclient.pfxをロード・バランサ経由でアクセスするクライアントマシンに転送します。



ロード・バランサで証明書を使用する設定手順

ロード・バランサ自体は既存のものを使用しますが、サーバー証明書とクライアント証明書を使用してHTTPS(SSL)で接続するようにロード・バランサのリスナーを構成します。

また、ロード・バランサ用のサブネットにおけるセキュリティリスト(イングレスルール)でロード・バランサのSSLリスニングポートを使用できるように許可(開放)する必要があります。



証明書を使用するロード・バランサのリスナーの構成

OCIコンソールからロード・バランサのサービスで証明書を使用するリスナーを作成します。



​OCIコンソールのメニューから、「ネットワーキング > ロード・バランサ」より事前に作成したロード・バランサ名をクリックします。


”リソース”より「リスナー」を選択し、「リスナーの作成」をクリックします。


各項目を入力および選択し、「リスナーの作成」をクリックしてリスナーを作成します。

・「名前」に任意の値を入力
・「プロトコル」で「HTTPS」を選択
・「ポート」にSSLリスニングポート番号を入力
・「証明書リソース」で「証明書サービス管理対象証明書」を選択
・「<コンパートメント名>の証明書」で事前に作成したサーバー証明書を選択
・「CA証明書の指定」にチェックを入れる
・「CAバンドルor認証局の選択」で「認証局」を選択
・「<コンパートメント名>の認証局」でクライアント証明書を作成した時のルート認証局を選択
・「ピア証明書の検証」にチェックを入れる
・「深さの検証」に「1」を入力
・「バックエンド・セット」で事前に作成したバックエンドセットを選択



セキュリティリスト(イングレスルール)の許可

ロード・バランサ用のサブネットにおけるセキュリティリスト(イングレスルール)でロード・バランサのSSLリスニングポートを許可しているか確認し、許可していない場合は許可します。



クライアント証明書を使用し、ロード・バランサ経由でアクセスする手順

クライアントマシンのブラウザから、クライアント証明書を使用してロード・バランサ経由でバックエンドサーバーにアクセスするため、PKCS#12形式に変換したクライアント証明書(client.pfx)をクライアントマシンにインポートします。その後、ブラウザからアクセスします。



PKCS#12形式に変換したクライアント証明書のインポート

クライアントマシンのブラウザから証明書の管理画面を表示し、「インポート」をクリックします。

※証明書の管理画面の内容はブラウザおよびバージョンによって異なる場合があります。
 本記事ではMicrosoft Edgeで手順を実施しています。


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


「インポートする証明書ファイル」画面にて、「ファイル名」に、PKCS#12形式に変換したクライアント証明書(client.pfx)のフルパスを指定して「次へ」をクリックします。「参照」から該当ファイルを選択する方法でも問題ありません。


本記事では秘密鍵にパスワードを設定していないため、「秘密キーの保護」画面にて、何も入力や変更はせずに「次へ」をクリックします。


「証明書ストア」画面にて、「証明書をすべて次のストアに配置する」を選択し、証明書ストアに「個人」が指定されていることを確認して「次へ」をクリックします。


なお、証明書ストアに「個人」が指定されていない場合は、「参照」から「個人」の証明書ストアを選択して「OK」をクリックします。


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


「正しくインポートされました」のポップアップが表示されたら「OK」をクリックし、証明書の管理画面にて「個人」のストアにクライアント証明書が追加されていることを確認して「閉じる」をクリックします。



クライアントマシンのブラウザからアクセス

クライアント証明書の作成時に指定した、ロード・バランサのホスト名とする値でロード・バランサのIPアドレスが名前解決できるようにhostsファイルなどを設定します。

名前解決の設定を行った後、クライアントマシンのブラウザからロード・バランサ経由でバックエンドサーバーにHTTPS(SSL)のURLでアクセスすると、クライアント証明書の選択を求められるため、クライアント証明書を選択して「OK」をクリックします。


正しいクライアント証明書を選択している場合は正しい結果が表示されます。


なお、クライアント証明書の選択を求められた時に「キャンセル」をクリックするなど、正しいクライアント証明書が選択されなかった場合、「400 Bad Request No required SSL certificate was sent」のエラーが表示されます。こちらのエラーが表示された場合は証明書の有効期限や作成手順などに問題が無いかご確認ください。



まとめ

本記事ではOCI Certificatesのサービスで作成したクライアント証明書をロード・バランサで使用する手順をご紹介しました。

2023年9月時点においては、OCI Certificatesのサービスで作成したクライアント証明書をロード・バランサで使用する手順に関する情報は非常に少ないため、本記事がお役に立てれば幸いです。


執筆者情報

こばやしけんた プロフィール画像

2008年度アシストに入社後、Oracle WebLogic Server や Oracle HTTP Server を中心にサポートエンジニアとして活動しており、これまでに4000件以上の問い合わせを対応。



■本記事の内容について
 本記事に示した定義及び条件は変更される場合があります。あらかじめご了承ください。

■商標に関して
 ・Oracle®、Java、MySQL及びNetSuiteは、Oracle、その子会社及び関連会社の米国及びその他の国における登録商標です。
 ・Amazon Web Services、AWS、Powered by AWS ロゴ、[およびかかる資料で使用されるその他の AWS 商標] は、Amazon.com, Inc. またはその関連会社の商標です。
  文中の社名、商品名等は各社の商標または登録商標である場合があります。

関連している記事

  • Oracle Cloud
  • Oracle Database
2024.02.02

OCIにおけるOracle Database 11g R2、12g R1、12g R2の新規プロビジョニング終了とその影響

Oracle Databaseのバージョン11g R2、12g.R1、12g.R2は既にすべてのメーカーサポートが終了しています。OCIのBase Database Serviceでも2024年1月中旬ころから11g R2、12g R1、12g R2での新規プロビジョニングができなくなりました。

  • Oracle Cloud
2024.01.19

Oracle Cloudのサービスリミットを理解し、適切に対処する方法

Oracle Cloudでクラウドアカウントごとに設定されているサービスの利用上限値「サービス制限(サービスリミット)」の引上げ方法とその注意点をご紹介します。

  • Oracle Database
  • Oracle Cloud
2023.12.15

ライセンスの観点から考えるOracle Cloudのススメ

オラクル社が提供しているクラウドサービス「Oracle Cloud」は、Oracle Databaseライセンス観点でも様々な効果があることはご存じでしょうか? ここでは「ライセンス」に焦点をあて、Oracle Cloudがおススメできるポイントを説明します。

ページの先頭へ戻る