クライアント側でウォレットを使用しないTLS接続の構成

参考資料は以下。

セキュリティ・ガイド
Transport Layer Security認証を使用するようにOracle Databaseを構成できます。
セキュリティ・ガイド
orapkiコマンドライン・ユーティリティとsqlnet.oraのパラメータを使用して、公開キー・インフラストラクチャ(PKI)要素を管理できます。
証明書と公開キー・インフラストラクチャの管理

マニュアルには記載されていないが、この方法は19cのとあるRU以降からしか使えないことに注意。

DBサーバ側の設定

DBサーバはLinuxの想定。

ウォレット(自動ログインウォレット)を作成。今回はホームディレクトリ配下に作成し、-pwd オプションでパスワードも直接指定している。

mkdir -p /home/oracle/wallet
orapki wallet create -wallet /home/oracle/wallet/tls -auto_login -pwd Oracle.1234

自己署名のルート証明書をウォレットに追加。

orapki wallet add -wallet /home/oracle/wallet/tls -dn 'CN=root_test,C=US' -keysize 2048 -self_signed -validity 3650 -pwd Oracle.1234

ユーザ証明書の証明書リクエストをウォレットに追加。

orapki wallet add -wallet  /home/oracle/wallet/tls -dn 'CN=server_test,C=US' -keysize 2048 -pwd Oracle.1234

証明書リクエストをウォレットからファイルにエクスポート。

orapki wallet export -wallet /home/oracle/wallet/tls -dn 'CN=server_test,C=US' -request /home/oracle/csr.txt

証明書リクエストから署名付きユーザ証明書を作成。

orapki cert create -wallet /home/oracle/wallet/tls -request /home/oracle/csr.txt -cert /home/oracle/cert.txt -validity 3650 -pwd Oracle.1234
orapki cert display -cert /home/oracle/cert.txt -complete

作成したユーザ証明書をウォレットに追加。

orapki wallet add -wallet /home/oracle/wallet/tls -user_cert -cert /home/oracle/cert.txt -pwd Oracle.1234

sqlnet.ora に以下を追記。

AUTHENTICATION_SERVICES=(tcps)
SSL_CLIENT_AUTHENTICATION=FALSE
WALLET_LOCATION=(SOURCE=(METHOD=file)(METHOD_DATA=(DIRECTORY=/home/oracle/wallet/tls)))

listener.ora に以下を追記し、既存の設定(PROTOCOL)をTCPSに修正。

SSL_CLIENT_AUTHENTICATION=FALSE
WALLET_LOCATION=(SOURCE=(METHOD=file)(METHOD_DATA=(DIRECTORY=/home/oracle/wallet/tls)))

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCPS)(HOST = ol8db19.dn.home)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
  )

local_listenerの動的登録用に tnsnames.ora の PROTOCOLも修正。

LISTENER_DB19 =
  (ADDRESS = (PROTOCOL = TCPS)(HOST = ol8db19.dn.home)(PORT = 1521))

ルート証明書をファイルにエクスポート。

orapki wallet export -wallet /home/oracle/wallet/tls -dn 'CN=root_test,C=US' -cert /home/oracle/cacert.txt

ルート証明書をOSのシステム信頼ストアに追加してアップデートをかける(rootユーザで)。

cp /home/oracle/cacert.txt /etc/pki/ca-trust/source/anchors
update-ca-trust

この状態でリスナーとDBを(再)起動。リスナーにサービスが動的登録されていることを確認する。

[oracle@ol8db19 ~]$ lsnrctl status

LSNRCTL for Linux: Version 19.0.0.0.0 - Production on 27-4月 -2024 22:09:48

Copyright (c) 1991, 2022, Oracle.  All rights reserved.

(DESCRIPTION=(ADDRESS=(PROTOCOL=TCPS)(HOST=ol8db19.dn.home)(PORT=1521)))に接続中
リスナーのステータス
------------------------
別名                      LISTENER
バージョン                TNSLSNR for Linux: Version 19.0.0.0.0 - Production
開始日                    27-4月 -2024 22:09:20
稼働時間                  0 日 0 時間 0 分 28 秒
トレース・レベル          off
セキュリティ              ON: Local OS Authentication
SNMP                      OFF
パラメータ・ファイル      /u01/app/oracle/product/19.0.0/dbhome_1/network/admin/listener.ora
ログ・ファイル            /u01/app/oracle/diag/tnslsnr/ol8db19/listener/alert/log.xml
リスニング・エンドポイントのサマリー...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcps)(HOST=ol8db19.dn.home)(PORT=1521)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
サービスのサマリー...
サービス"db19"には、1件のインスタンスがあります。
  インスタンス"db19"、状態READYには、このサービスに対する1件のハンドラがあります...
サービス"db19XDB"には、1件のインスタンスがあります。
  インスタンス"db19"、状態READYには、このサービスに対する1件のハンドラがあります...
コマンドは正常に終了しました。

クライアント側の設定(Linux)

サーバ側で出力したルート証明書をクライアントにコピーする。

scp oracle@ol8db19.dn.home:/home/oracle/cacert.txt /etc/pki/ca-trust/source/anchors

OSのシステム信頼ストアをリフレッシュ。

update-ca-trust

sqlnet.ora に以下を追記。

SQLNET.SSL_CLIENT_AUTHENTICATION=FALSE

tnsnames.ora に接続記述子を追加。SECURITY の WALLET_LOCATION でシステム信頼ストアを設定しているのがポイント。

OL8DB19 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCPS)(HOST = ol8db19.dn.home)(PORT = 1521))
    (SECURITY=(WALLET_LOCATION=SYSTEM))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = db19)
    )
  )

接続テスト。USERENV の NETWORK_PROTOCOL が TCPS に切り替わっていれば成功。

[oracle@oradbs admin]$ sqlplus system/oracle@ol8db19

SQL*Plus: Release 19.0.0.0.0 - Production on 土 4月 27 22:14:44 2024
Version 19.14.0.0.0

Copyright (c) 1982, 2021, Oracle.  All rights reserved.

最終正常ログイン時間: 土 4月  27 2024 22:14:29 +09:00


Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.18.0.0.0
に接続されました。
SQL> SELECT SYS_CONTEXT ('USERENV', 'NETWORK_PROTOCOL') FROM DUAL;

SYS_CONTEXT('USERENV','NETWORK_PROTOCOL')
--------------------------------------------------------------------------------
tcps

クライアント側の設定(Windows)

サーバ側で出力したルート証明書をクライアントにコピーし、拡張子を .cer に変更する。

証明書をダブルクリックで開き、「証明書のインストール」を押下。

保存場所にローカル コンピューターを選択。

「証明書をすべて次のストアに配置する」を選択し、参照ボタンで「信頼されたルート証明機関」を選択する。

ルート証明書のインポートが完了したら、sqlnet.ora に以下を追記。

SQLNET.SSL_CLIENT_AUTHENTICATION=FALSE

tnsnames.ora に接続記述子を追加。SECURITY の WALLET_LOCATION でシステム信頼ストアを設定しているのがポイント。

OL8DB19 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCPS)(HOST = ol8db19.dn.home)(PORT = 1521))
(SECURITY=(WALLET_LOCATION=SYSTEM))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = db19)
)
)

接続テスト。USERENV の NETWORK_PROTOCOL が TCPS に切り替わっていれば成功。

コメント