2025年8月28日木曜日

Oracle Database 23ai FreeでTLSでの通信を有効化する

オンプレミスのOracle DatabaseでEntra IDまたはOCI IAMによるユーザー認証を行うには、SQL*Netの通信をTCPSつまりTLSにより暗号化する必要があります。

Oracle Database 23ai Freeのコンテナを使って、TLSによる暗号化の実装手順を確認します。最初は以下のドキュメントにそって作業を行いました。

Authenticate Oracle Database 23ai with Microsoft Entra ID

しかし、orapkiを使った作業が煩雑だったため、自己署名証明書の生成はOpenSSLを使うように作業を変えました。概ねChatGPTに聞いて作業を進めています。

以下より、Oracle Database Freeのコンテナの作成から実施した手順を紹介します。作業はApple Macbook Proで行なっています。

最初にホスト・コンピューターに、作業ディレクトリとしてtlsdbを作成します。ディレクトリ作成後に移動します。

mkdir tlsdb
cd tlsdb

% mkdir tlsdb

% cd tlsdb

tlsdb % 


作業に使用するディレクトリとしてtns_adminを作成します。

mkdir tns_admin

tlsdb % mkdir tns_admin

tlsdb % 


Oracle Database 23ai Freeのコンテナをtlsdbとして作成し実行します。作成したディレクトリtns_adminは、コンテナ内からは/home/oracle/tns_adminとして見えるように割り当てます。また、TCPのポートである1521に加え、TCPSのポートである1522もホストに割り当てます。

podman run -d --name tlsdb -v $PWD/tns_admin:/home/oracle/tns_admin -p 1521:1521 -p 1522:1522 -e ORACLE_PWD=<パスワード> container-registry.oracle.com/database/free:latest

tlsdb % podman run -d --name tlsdb -v $PWD/tns_admin:/home/oracle/tns_admin -p 1521:1521 -p 1522:1522 -e ORACLE_PWD=******** container-registry.oracle.com/database/free:latest

b18843d88a2908661aad8cb4ce71e489d62d57347b63998b607708b02e1c1ce3

tlsdb % 


コンテナのログを表示し、データベースが起動したことを確認します。DATABASE IS READY TO USE!と表示されていれば、データベースは利用できます。

podman logs tlsdb

tlsdb % podman logs tlsdb

Starting Oracle Net Listener.

Oracle Net Listener started.

Starting Oracle Database instance FREE.

Oracle Database instance FREE started.


The Oracle base remains unchanged with value /opt/oracle


SQL*Plus: Release 23.0.0.0.0 - Production on Wed Aug 27 06:54:01 2025

Version 23.9.0.25.07


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



Connected to:

Oracle Database 23ai Free Release 23.0.0.0.0 - Develop, Learn, and Run for Free

Version 23.9.0.25.07


SQL> 

User altered.


SQL> 

User altered.


[中略]


SQL> Disconnected from Oracle Database 23ai Free Release 23.0.0.0.0 - Develop, Learn, and Run for Free

Version 23.9.0.25.07

The Oracle base remains unchanged with value /opt/oracle

#########################

DATABASE IS READY TO USE!

#########################

The following output is now a tail of the alert.log:

2025-08-27T06:54:01.328737+00:00

FREEPDB1(3):TABLE AUDSYS.AUD$UNIFIED: ADDED INTERVAL PARTITION SYS_P328 (4076) VALUES LESS THAN (TIMESTAMP' 2025-08-28 00:00:00')

2025-08-27T06:54:01.348382+00:00


[省略]


tlsdb %


コンテナtlsdbに接続し、作業を行ないます。

podman exec -it tlsdb bash

tlsdb % podman exec -it tlsdb bash

bash-4.4$ 


ディレクトリtns_adminに移動し、自己署名証明書の作成を行ないます。

cd tns_admin

bash-4.4$ cd tns_admin

bash-4.4$ 


ルートCAの鍵を、ファイルrootCA.keyとして生成します。パスフレーズの入力を求められるので、適切な文字列を入力し記録しておきます。

openssl genrsa -aes256 -out rootCA.key 4096

bash-4.4$ openssl genrsa -aes256 -out rootCA.key 4096

Generating RSA private key, 4096 bit long modulus (2 primes)

..............................................................................++++

.........................................................................................................................................................................................................................................................................................................++++

e is 65537 (0x010001)

Enter pass phrase for rootCA.key: ****

Verifying - Enter pass phrase for rootCA.key: ****

bash-4.4$ 


自己署名によるルートCA証明書を作成します。証明書のサブジェクトはCN=My Root CAとしています。rootCA.keyを開くために、rootCA.keyを作成するときに設定したパスフレーズを入力します。

openssl req -x509 -new -key rootCA.key -sha256 -days 3650 -out rootCA.crt -subj "/CN=My Root CA"

bash-4.4$ openssl req -x509 -new -key rootCA.key -sha256 -days 3650 -out rootCA.crt -subj "/CN=My Root CA"

Enter pass phrase for rootCA.key: ****

bash-4.4$ 


以下の内容を記載したファイルをapex.confとして作成します。CNおよびSANに指定するホスト名はapexとしています。
[ req ]
default_bits       = 2048
prompt             = no
default_md         = sha256
distinguished_name = dn
req_extensions     = v3_req

[ dn ]
CN = apex

[ v3_req ]
basicConstraints = CA:FALSE
keyUsage         = digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth
subjectAltName   = @alt_names

[ alt_names ]
DNS.1 = apex

サーバーの秘密鍵を、ファイルserver.keyとして作成します。

openssl genrsa -out server.key 2048

bash-4.4$ openssl genrsa -out server.key 2048

Generating RSA private key, 2048 bit long modulus (2 primes)

................................+++++

...................................+++++

e is 65537 (0x010001)

bash-4.4$ 


設定ファイルapex.confを元に、CSR(Certificate Singing Request - 証明書署名要求)をファイルserver.csrとして作成します。

openssl req -new -key server.key -out server.csr -config apex.conf

bash-4.4$ openssl req -new -key server.key -out server.csr -config apex.conf

bash-4.4$ 


server.csrをルートCAで署名し、サーバー証明書sever.crtを作成します。

openssl x509 -req -in server.csr -CA rootCA.crt -CAkey rootCA.key -CAcreateserial -out server.crt -days 397 -sha256 -extfile apex.conf -extensions v3_req

bash-4.4$ openssl x509 -req -in server.csr -CA rootCA.crt -CAkey rootCA.key -CAcreateserial -out server.crt -days 397 -sha256 -extfile apex.conf -extensions v3_req

Signature ok

subject=CN = apex

Getting CA Private Key

Enter pass phrase for rootCA.key: ****

bash-4.4$    


作成されたサーバー証明書server.crtに、SANが記載されているか確認します。

openssl x509 -in server.crt -noout -text | grep -A2 "Subject Alternative Name"

bash-4.4$ openssl x509 -in server.crt -noout -text | grep -A2 "Subject Alternative Name"

            X509v3 Subject Alternative Name: 

                DNS:apex

    Signature Algorithm: sha256WithRSAEncryption

bash-4.4$ 


ルートCAの証明書、サーバー証明書およびサーバー秘密鍵を、PKCS12形式のファイルserver.p12にまとめます。エクスポートしたファイルにパスワードを設定します。

openssl pkcs12 -export -out server.p12 -inkey server.key -in server.crt -certfile rootCA.crt -name "apex"

bash-4.4$ openssl pkcs12 -export -out server.p12 -inkey server.key -in server.crt -certfile rootCA.crt -name "apex"

Enter Export Password: ****

Verifying - Enter Export Password: ****

bash-4.4$ 


Oracle Walletを作成します。ウォレットの位置は/opt/oracle/admin/FREE/walletとします。

orapki wallet create -wallet /opt/oracle/admin/FREE/wallet -pwd <パスワード> -auto_login

bash-4.4$ orapki wallet create -wallet /opt/oracle/admin/FREE/wallet -pwd ******** -auto_login

Oracle PKI Tool Release 23.0.0.0.0 - Production

Version 23.0.0.0.0

Copyright (c) 2004, 2025, Oracle and/or its affiliates. All rights reserved.


Operation is successfully completed.

bash-4.4$ 


ルートCA証明書rootCA.crtを、信頼済み証明書としてウォレットに追加します。

orapki wallet add -wallet /opt/oracle/admin/FREE/wallet -trusted_cert -cert rootCA.crt -pwd ********

bash-4.4$ orapki wallet add -wallet /opt/oracle/admin/FREE/wallet -trusted_cert -cert rootCA.crt -pwd ********

Oracle PKI Tool Release 23.0.0.0.0 - Production

Version 23.0.0.0.0

Copyright (c) 2004, 2025, Oracle and/or its affiliates. All rights reserved.


Operation is successfully completed.

bash-4.4$ 


サーバーの鍵と証明書を含むファイルserver.p12をウォレットに追加します。-pwdで指定するパスワードはOracle Walletのパスワードです。-pkcs12pwdで指定するパスワードは、PKCS12形式のファイルserver.p12の作成時に設定したパスワードです。

orapki wallet import_pkcs12 -wallet /opt/oracle/admin/FREE/wallet -pwd <Oracle Walletのパスワード> -pkcs12file server.p12 -pkcs12pwd <server.p12のパスワード>

bash-4.4$ orapki wallet import_pkcs12 -wallet /opt/oracle/admin/FREE/wallet -pwd *********** -pkcs12file server.p12 -pkcs12pwd ****

Oracle PKI Tool Release 23.0.0.0.0 - Production

Version 23.0.0.0.0

Copyright (c) 2004, 2025, Oracle and/or its affiliates. All rights reserved.


orapki command import_pkcs12 executed successfully.

bash-4.4$ 


以上でOracle Walletは作成できました。作成したウォレットの内容を確認します。

orapki wallet display -wallet /opt/oracle/admin/FREE/wallet -pwd <パスワード> -summary

User CertificatesとしてCN=apexTrusted CertificatesとしてCN=My Root CAが見つかります。

bash-4.4$ orapki wallet display -wallet /opt/oracle/admin/FREE/wallet -pwd ******** -summary

Oracle PKI Tool Release 23.0.0.0.0 - Production

Version 23.0.0.0.0

Copyright (c) 2004, 2025, Oracle and/or its affiliates. All rights reserved.


Requested Certificates: 

User Certificates:

Subject:        CN=apex

Trusted Certificates: 

Subject:        CN=My Root CA

bash-4.4$ 


ホストからウォレットを参照できるように、/opt/oracle/admin/FREE/wallet以下を/home/oracle/tns_adminにコピーします。

cp -i /opt/oracle/admin/FREE/wallet/* .

bash-4.4$ cp -i /opt/oracle/admin/FREE/wallet/* .

bash-4.4$ pwd

/home/oracle/tns_admin

bash-4.4$ ls

apex.conf ewallet.p12   rootCA.key  server.csr

cwallet.sso ewallet.p12.lck  rootCA.srl  server.key

cwallet.sso.lck  rootCA.crt   server.crt  server.p12

bash-4.4$ 


ネットワーク設定を更新します。

cd $ORACLE_HOME/network/admin

bash-4.4$ cd $ORACLE_HOME/network/admin

bash-4.4$ 


listener.oraの内容を以下に変更します。
DEFAULT_SERVICE_LISTENER = FREE

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 0.0.0.0)(PORT = 1521))
      (ADDRESS = (PROTOCOL = TCPS)(HOST = 0.0.0.0)(PORT = 1522))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
  )

SSL_CLIENT_AUTHENTICATION = FALSE
WALLET_LOCATION = 
  (SOURCE =
    (METHOD = FILE)
    (METHOD_DATA =
        (DIRECTORY = /opt/oracle/admin/FREE/wallet)
    )
  )
sqlnet.oraWALLET_LOCATIONを追記します。
NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT, HOSTNAME)
DISABLE_OOB=ON
SQLNET.EXPIRE_TIME=3

WALLET_LOCATION = 
  (SOURCE =
    (METHOD = FILE)
    (METHOD_DATA =
        (DIRECTORY = /opt/oracle/admin/FREE/wallet)
    )
  )
tnsnames.oraにTNS名FREEPDB1_TLSを追加します。
FREEPDB1_TLS =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCPS)(HOST = 0.0.0.0)(PORT = 1522))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = FREEPDB1)
    )
    (SECURITY =
      (SSL_SERVER_DN_MATCH=TRUE)
      (SSL_SERVER_CERT_DN="CN=apex")
    )
  )
TNSリスナーを再起動します。

lsnrctl stop
lsnrctl start

bash-4.4$ lsnrctl stop


LSNRCTL for Linux: Version 23.0.0.0.0 - Production on 27-AUG-2025 07:45:46


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


Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=0.0.0.0)(PORT=1521)))

The command completed successfully

bash-4.4$ lsnrctl start


LSNRCTL for Linux: Version 23.0.0.0.0 - Production on 27-AUG-2025 07:45:48


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


Starting /opt/oracle/product/23ai/dbhomeFree/bin/tnslsnr: please wait...


TNSLSNR for Linux: Version 23.0.0.0.0 - Production

System parameter file is /opt/oracle/product/23ai/dbhomeFree/network/admin/listener.ora

Log messages written to /opt/oracle/diag/tnslsnr/94ef00fe5beb/listener/alert/log.xml

Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=0.0.0.0)(PORT=1521)))

Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcps)(HOST=0.0.0.0)(PORT=1522)))

Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))


Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=0.0.0.0)(PORT=1521)))

STATUS of the LISTENER

------------------------

Alias                     LISTENER

Version                   TNSLSNR for Linux: Version 23.0.0.0.0 - Production

Start Date                27-AUG-2025 07:45:48

Uptime                    0 days 0 hr. 0 min. 0 sec

Trace Level               off

Security                  ON: Local OS Authentication

SNMP                      OFF

Default Service           FREE

Listener Parameter File   /opt/oracle/product/23ai/dbhomeFree/network/admin/listener.ora

Listener Log File         /opt/oracle/diag/tnslsnr/94ef00fe5beb/listener/alert/log.xml

Listening Endpoints Summary...

  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=0.0.0.0)(PORT=1521)))

  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcps)(HOST=0.0.0.0)(PORT=1522)))

  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))

The listener supports no services

The command completed successfully

bash-4.4$


TNSリスナーの再起動後にサービスを認識させます。

sqlplus / as sysdba
alter system register;
exit

bash-4.4$ sqlplus / as sysdba


SQL*Plus: Release 23.0.0.0.0 - Production on Wed Aug 27 12:18:21 2025

Version 23.9.0.25.07


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



Connected to:

Oracle Database 23ai Free Release 23.0.0.0.0 - Develop, Learn, and Run for Free

Version 23.9.0.25.07


SQL> alter system register;


System altered.


SQL> exit

Disconnected from Oracle Database 23ai Free Release 23.0.0.0.0 - Develop, Learn, and Run for Free

Version 23.9.0.25.07

bash-4.4$


追加したTNS名FREEPDB1_TLSを指定してデータベースに接続し、通信プロトコルを確認します。

sqlplus system@freepdb1_tls
select sys_context('userenv','network_protocol');
exit

bash-4.4$ sqlplus system@freepdb1_tls


SQL*Plus: Release 23.0.0.0.0 - Production on Wed Aug 27 11:37:03 2025

Version 23.9.0.25.07


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


Enter password: **********

Last Successful login time: Wed Aug 27 2025 11:36:46 +00:00


Connected to:

Oracle Database 23ai Free Release 23.0.0.0.0 - Develop, Learn, and Run for Free

Version 23.9.0.25.07


SQL> select sys_context('userenv','network_protocol');


SYS_CONTEXT('USERENV','NETWORK_PROTOCOL')

--------------------------------------------------------------------------------

tcps


SQL> exit

Disconnected from Oracle Database 23ai Free Release 23.0.0.0.0 - Develop, Learn, and Run for Free

Version 23.9.0.25.07

bash-4.4$ 


通信プロトコルとしてtcpsが使用されていることが確認できました。

続いてコンテナの外からTLSで接続してみます。

cd tns_admin

tlsdb % cd tns_admin

tns_admin % 


sqlnet.oraを作成し、以下を記述します。DIRECTORYにはtlsdb/tns_adminの位置をフルパスで指定します。
SSL_CLIENT_AUTHENTICATION = FALSE
WALLET_LOCATION = 
  (SOURCE =
    (METHOD = FILE)
    (METHOD_DATA =
        (DIRECTORY = /Users/**********/Documents/tlsdb/tns_admin)
    )
  )
tnsnames.oraを作成し、TNS名としてFREEPDB1_TLSを設定します。
FREEPDB1_TLS =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCPS)(HOST = 0.0.0.0)(PORT = 1522))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = FREEPDB1)
    )
    (SECURITY =
      (SSL_SERVER_DN_MATCH=TRUE)
      (SSL_SERVER_CERT_DN="CN=apex")
    )
  )
SQLclで接続することを考慮し、ojdbc.propertiesを作成して以下を記述します。
oracle.net.wallet_location=(SOURCE=(METHOD=FILE)(METHOD_DATA=(DIRECTORY=${TNS_ADMIN})))
SQLclで接続を確認します。環境変数TNS_ADMINに設定ファイルのあるディレクトリを設定します。

export TNS_ADMIN=$PWD
sql system@freepdb1_tls
select sys_context('userenv','network_protocol');
exit

tns_admin % sql system@freepdb1_tls



SQLcl: 水 8月 27 21:29:44 2025のリリース25.2 Production


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


パスワード (**********?) ******

Last Successful login time: 水 8月  27 2025 21:29:46 +09:00


接続先:

Oracle Database 23ai Free Release 23.0.0.0.0 - Develop, Learn, and Run for Free

Version 23.9.0.25.07


SQL> select sys_context('userenv','network_protocol');


SYS_CONTEXT('USERENV','NETWORK_PROTOCOL')    

____________________________________________ 

tcps                                         


SQL> exit

Oracle Database 23ai Free Release 23.0.0.0.0 - Develop, Learn, and Run for Free

Version 23.9.0.25.07から切断されました

tns_admin % 


通信プロトコルとしてtcpsが使用されていることが確認できました。

以上でオンプレミスのOracle Database 23ai FreeのSQL*Net通信をTLSで暗号化することができました。