前回の記事では、Oracle Database の接続を暗号化する方法として、 「Native Network Encryption (NNE)」と「TLS」の2つの選択肢があることを紹介しました。
前者の Native Network Encryption は、sqlnet.ora の設定だけで比較的簡単に通信の暗号化を有効化できます。一方、TLS はウォレットや証明書の準備が必要になりますが、証明書を用いた接続先の検証が可能であり、標準的な暗号化方式として利用できます。


本記事では、Oracle Database への接続を TLS で暗号化する手順を中心に紹介します。また、最後に補足として、より簡易に通信の暗号化を有効化できる Native Network Encryption (NNE) の設定例も紹介していきます。

 

0. はじめに

本記事で実施する内容は以下のとおりです。

実施内容TLS による接続暗号化の設定
・サーバー用ウォレットと証明書の作成
・Listener の TCPS ポート設定
・クライアント用ウォレットの作成
・SQLcl からの TCPS 接続確認

Native Network Encryption(NNE)の設定例
作業時間の目安環境構築済みの状態で約 60 分
実行環境・Oracle AI Database 26ai FREE
・Oracle Linux 9(OCI 上のコンピュート・インスタンスを使用します)
・クライアントツール:SQLcl

Oracle AI Database 26ai FREE は、コンテナ・イメージ、VMイメージ、rpmパッケージなどの形式で提供されています。以下のリンクを参考に、環境に合わせて任意の方法で準備ください。

本記事では、見やすさのために実行結果の一部を省略または加工しています。そのため、実際の出力と異なる場合があります。
※ Oracle Database は 26ai より、AI 機能を追加する形でブランド名が「Oracle AI Database 26ai」へと置き換えられました。本記事では以降、文脈に応じて「Oracle Database」と表記します。

 

1. 環境の準備

1-1. Oracle Database の準備

本記事では Oracle AI Database 26ai FREE を使用しますので、まずはその環境を準備します。

26ai FREE を作成すると、FREE という CDB の中に FREEPDB1 という PDB が作成されます。 DBへ接続する際に使用するコマンドを以下に挙げておきます。本手順はすべて FREEPDB1 に対して行いますが、以下コマンドは手順において省略されることがあることをご了承ください。

DB サーバー上で SYS ユーザーとして CDB に接続する場合は、以下のように実行します。

$ sqlplus / as sysdba

CDB から PDB (FREEPDB1) に接続を切り替える場合は、以下を実行します。

SQL> alter session set container = FREEPDB1;

PDB に直接接続する場合は、以下のように実行します。

$ sqlplus sys/<password>@localhost:1521/FREEPDB1 as sysdba

その他コマンドについてはドキュメントの方もご参照ください。

1-2. DBクライアントの用意

本手順では、クライアントとデータベース間の通信を確認するため、Oracle Database に接続できるクライアントツールが必要です。
クライアントツールとしては、SQL Developer や SQL*Plus、SQLcl、VS Code の拡張機能としての SQL Developer などいずれかのツールを用いて FREEPDB1 に接続できる環境をご準備ください。 本手順では SQLcl を使用します。

各クライアントツールのインストール方法については以下を参照ください

接続に必要なサービス名やリスナーの状態は、DB サーバーで以下のコマンドを実行することで確認できます。

$ lsnrctl status

 

2. TLS 設定の概要

ここから、クライアントから Oracle Database へ TCPS で接続し、通信経路を TLS で暗号化する設定を行います。
Oracle AI Database 26ai では TLS 1.3 がサポートされるようになりました。TLS 1.2 も引き続き利用が可能です。

本記事では、検証用として以下の構成にします

  • サーバー認証のみを実施
  • 自己署名ルート CA を作成し、クライアント側ウォレットにルート CA 証明書を登録
  • ドメインは使用しない

 

3. サーバー用ウォレットと証明書の作成

3-1. 作業ディレクトリの作成

ウォレットおよび証明書を配置するための作業ディレクトリを作成します。
ここでは、/home/oracle/wallet/tls 配下で作業を行っていきます。

# DBサーバー
mkdir -p /home/oracle/wallet/tls
cd /home/oracle/wallet/tls

ウォレットおよび証明書の作成には orapki ユーティリティを使用します。まずはDBサーバーにて、このコマンドが使用できるかを確認しつつ、サブコマンドについても確認します。

[oracle@db-tut tls]$ orapki help
Oracle PKI Tool Release 23.0.0.0.0 - Production
Version 23.0.0.0.0
Copyright (c) 2004, 2026, Oracle and/or its affiliates. All rights reserved.

orapki [crl|wallet|cert|secretstore|help] <-nologo> <-jsafe> <-use_jce> <-use_jce_only> <-fips140_mode [FIPS_140_2|FIPS_140_3]>
Syntax :
[-option [value]]     : mandatory, for example [-wallet [wallet]]
[-option <value>]     : optional, but when option is used its value is mandatory.
<option>              : optional, for example <-summary>, <-complete>
[option1] | [option2] : option1 'or' option2

なお、以降はウォレットの配置場所を $WALLET_LOCATION 変数で扱います。

3-2. サーバ用ウォレットの作成

サーバー証明書を格納するためのウォレットを作成します。ウォレットを操作するための <password> を指定することにご注意ください。

orapki wallet create -wallet $WALLET_LOCATION -pwd <password> -auto_login

-auto_login を指定することで、自動ログイン用の cwallet.sso が生成されます。また、代わりに -auto_login_local を指定すると作成ホスト限定の自動ログインになり、他ホストへコピーして使えないようになります。配布する場合はご注意ください。

以上のコマンドにて作成されたファイルを確認します。

$ ls -l $WALLET_LOCATION
total 8
-rw-------. 1 oracle oinstall 270 Feb 13 07:18 cwallet.sso
-rw-------. 1 oracle oinstall   0 Feb 13 07:18 cwallet.sso.lck
-rw-------. 1 oracle oinstall 225 Feb 13 07:18 ewallet.p12
-rw-------. 1 oracle oinstall   0 Feb 13 07:18 ewallet.p12.lck

各ファイルの概要は以下となります

  • ewallet.p12 : パスワード付きウォレット(編集・追加時に使用)
  • cwallet.sso : 自動ログイン用ウォレット(利用時のパスワード入力を省略)

3-3. 自己署名ルート CA 証明書の作成

次にサーバー証明書を自己署名で作成し、ウォレットに登録します。

orapki wallet add \
  -wallet $WALLET_LOCATION \
  -pwd <password> \
  -dn "CN=`hostname`" \
  -keysize 2048 \
  -self_signed \
  -validity 3650

作成・登録した証明書の情報は、以下のコマンドで確認を行うことができます。

orapki wallet display \
  -wallet $WALLET_LOCATION \
  -details
## 実行例
$ orapki wallet display -wallet $WALLET_LOCATION -pwd <password> -details
Oracle PKI Tool Release 23.0.0.0.0 - Production
Version 23.0.0.0.0
Copyright (c) 2004, 2026, Oracle and/or its affiliates. All rights reserved.

==================
User Certificates:
==================
--------------------
User Certificate [1]
--------------------
Subject:        CN=db-tut
=====================
Trusted Certificates:
=====================
-----------------------
Trusted Certificate [1]
-----------------------
Subject:        CN=db-tut

クライアントに配布するため、作成した証明書をエクスポートします。実行すると cert_<hostname>.crt で証明書ファイルが出力されます。

orapki wallet export \
  -wallet $WALLET_LOCATION \
  -dn "CN=`hostname`" \
  -cert $WALLET_LOCATION/cert_`hostname`.crt

 

4. クライアント用ウォレットを作成し、証明書を登録する

出力した自己署名のサーバ証明書を、信頼された証明書として登録した「クライアント用ウォレット」を用意します。
実行ホストはDBサーバーでなくても構いませんが、orapkiコマンドを引き続き使用するため、ここでは先程と同様DBサーバーで実行していきます。
ここでは、$WALLET_LOCATION 配下に client_wallet ディレクトリを作成し、その中にクライアント用ウォレットを作成していきます。

4-1. クライアント用ウォレットを作成

サーバー用ウォレットの作成時と同様にウォレットを作成します。再び、ウォレットを操作するために別途 <clientPassword> を指定することにご注意ください。

orapki wallet create \
  -wallet $WALLET_LOCATION/client_wallet \
  -pwd <clientPassword> \
  -auto_login

作成されたファイルを確認します。

[oracle@db-tut client_wallet]$ ls -l
total 8
-rw-------. 1 oracle oinstall 270 Feb 13 09:37 cwallet.sso
-rw-------. 1 oracle oinstall   0 Feb 13 09:37 cwallet.sso.lck
-rw-------. 1 oracle oinstall 225 Feb 13 09:37 ewallet.p12
-rw-------. 1 oracle oinstall   0 Feb 13 09:37 ewallet.p12.lck

4-2. サーバー証明書を追加

先ほどエクスポートしたサーバー証明書をクライアント用ウォレットに追加します。-cert 部分はお手元のファイル名に置き換えてください。

orapki wallet add \
  -wallet $WALLET_LOCATION/client_wallet \
  -trusted_cert \
  -cert $WALLET_LOCATION/cert_db-tut.crt \
  -pwd <clientPassword>

実行が成功したら、以下のコマンドを参考に、正しく証明書が登録されたかを確認します。

[oracle@db-tut client_wallet]$ orapki wallet display -wallet $WALLET_LOCATION/client_wallet
Oracle PKI Tool Release 23.0.0.0.0 - Production
Version 23.0.0.0.0
Copyright (c) 2004, 2026, Oracle and/or its affiliates. All rights reserved.

Requested Certificates:
User Certificates:
Trusted Certificates:
Subject:        CN=db-tut

このウォレットはフォルダ(client_wallet)ごとクライアントホストへ移動させておきます。

 

5. DBサーバーのネットワーク設定

引き続きDBサーバー側で操作を行っていきます。

5-1. SQL Net の設定

3-3. にて作成したサーバー証明書を参照するように、sqlnet.ora に以下の2行を追記します。
この設定ファイルの場所は環境により異なりますが、一般に $ORACLE_HOME/network/admin/sqlnet.ora に配置されます。

SSL_CLIENT_AUTHENTICATION=FALSE
WALLET_LOCATION=(SOURCE=(METHOD=FILE)(METHOD_DATA=(DIRECTORY=<$WALLET_LOCATIONのパス>)))

5-2. Listener の設定

listener.ora を編集し、 listener 側で TCPS のエンドポイントを追加します。 ファイルは先程の sqlnet.ora と同様、$ORACLE_HOME/network/admin に配置されています。
既存のTCP (1521) に加え、TCPS用のエンドポイント(ここでは 1522 を使用)を追加します。以下は追記の例です。

# listener.ora Network Configuration File: /opt/oracle/product/26ai/dbhomeFree/network/admin/listener.ora
# Generated by Oracle configuration tools.

DEFAULT_SERVICE_LISTENER = FREE

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = db-tut.sub01150410170.koivcntest.oraclevcn.com)(PORT = 1521))
      (ADDRESS = (PROTOCOL = TCPS)(HOST = db-tut.sub01150410170.koivcntest.oraclevcn.com)(PORT = 1522))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
  )

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

設定後、リスナーを再起動します。

lsnrctl stop
lsnrctl start

その後、 リスナーが TCPS で待ち受けていることを確認します。

$ lsnrctl status

LSNRCTL for Linux: Version 23.26.1.0.0 - Production on 15-FEB-2026 12:56:56

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

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=db-tut.sub01150410170.koivcntest.oraclevcn.com)(PORT=1521)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 23.26.1.0.0 - Production
Start Date                15-FEB-2026 09:27:33
Uptime                    0 days 3 hr. 29 min. 22 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Default Service           FREE
Listener Parameter File   /opt/oracle/product/26ai/dbhomeFree/network/admin/listener.ora
Listener Log File         /opt/oracle/diag/tnslsnr/db-tut/listener/alert/log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=db-tut.sub01150410170.koivcntest.oraclevcn.com)(PORT=1521)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcps)(HOST=db-tut.sub01150410170.koivcntest.oraclevcn.com)(PORT=1522)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
Services Summary...
Service "4a017ab47ba8e1ede0631800000a54a4" has 1 instance(s).
  Instance "FREE", status READY, has 1 handler(s) for this service...
Service "FREE" has 1 instance(s).
  Instance "FREE", status READY, has 1 handler(s) for this service...
Service "FREEXDB" has 1 instance(s).
  Instance "FREE", status READY, has 1 handler(s) for this service...
Service "freepdb1" has 1 instance(s).
  Instance "FREE", status READY, has 1 handler(s) for this service...
The command completed successfully

5-3. ファイアーウォールの確認

使用している仮想環境に併せて、firewall設定を確認・許可の設定を行います。

OCIのコンピュート(Oracle Linux)では firewalld が動作しているため、1522/tcp を許可する必要があります。

sudo firewall-cmd --zone=public --add-port=1522/tcp --permanent
sudo firewall-cmd --reload

また、OCI環境などクラウド環境を利用している場合、セキュリティリストなどの仮想ファイアーウォールの設定も忘れずに確認しておきます。

 

6. SSL/TLS の動作確認

この時点で、openssl s_client を使用して、TCPS ポートで TLS ハンドシェイクが行えることを確認します。
DB サーバー上、またはネットワーク的に DB サーバーへ到達できるホストで以下を実行します。

openssl s_client -connect <hostname>:1522

以下は実行例です。

$ openssl s_client -connect db-tut:1522
Connecting to 10.0.0.209
CONNECTED(00000003)
Can't use SSL_get_servername
depth=0 CN=db-tut
verify error:num=18:self-signed certificate
verify return:1
depth=0 CN=db-tut
verify return:1
---
Certificate chain
 0 s:CN=db-tut
   i:CN=db-tut
   a:PKEY: RSA, 2048 (bit); sigalg: sha256WithRSAEncryption
   v:NotBefore: Feb 13 07:27:33 2026 GMT; NotAfter: Feb 11 07:27:33 2036 GMT
---
Server certificate
-----BEGIN CERTIFICATE-----
MIICpjCCAY4CEQDDNwYpy1BrRyBuSIu8wv3RMA0GCSqGSIb3DQEBCwUAMBExDzAN
BgNVBAMTBmRiLXR1dJIkebYssaeyMTMwNzI3MzNaFw0zNjAyMTEwNzI3MzNaMBEx
DzANBgNVBAMTBmRiLXR1dDCCASIwDQYJIuoIhvcNAQEBBQADggEPADCCAQoCggEB
...

 

7. クライアント側のネットワーク設定

ここからは、クライアントの方で設定を行うため、クライアント側の設定ファイルを作成、編集をおこなっていきます。
まず、作業ディレクトリを作成します。ここでは ~/wallet/tls を作業ディレクトリとします。
そのディレクトリ内に、サーバーにて生成したクライアント用ウォレット(client_wallet)をインポートし、ディレクトリ全体が次の構成になるように作成、配置します。

wallet/
└── tls
    ├── client_wallet   # インポート
    │   ├── cwallet.sso
    │   ├── cwallet.sso.lck
    │   ├── ewallet.p12
    │   └── ewallet.p12.lck
    └── tnsnames.ora    # 作成

また、環境変数 TNS_ADMIN をこの wallet ディレクトリへのパスに設定しておき、DB クライアントがこれらファイルを参照できるようにしておきます。

次にtnsnames.oraを作成・編集し、以下を参考に追記を行います。

$ vi wallet/tls/tnsnames.ora

oradb26ai_freepdb1_tcps =
  (DESCRIPTION=
    (ADDRESS=(PROTOCOL=tcps)(HOST=<DB hostname>)(PORT=1522))
    (CONNECT_DATA=(SERVICE_NAME=freepdb1))
    (SECURITY=
      (WALLET_LOCATION=<client_walletディレクトリのパス>)
      (SSL_SERVER_DN_MATCH=NO) 
    )
  )

 

8. 接続テスト

適当なユーザーを使用して SQLcl などで DB に接続し、無事成功することを確認します。

$ sql hr/<password>@oradb26ai_freepdb1_tcps

SQLcl: Release 25.3 Production on Sun Feb 15 21:57:55 2026

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

Connected to:
Oracle AI Database 26ai Free Release 23.26.1.0.0 - Develop, Learn, and Run for Free
Version 23.26.1.0.0

SQL> sho user
USER is "HR"

接続後、現在の接続が TCPS であることを確認し、TLS 接続が成功したかを確認します。

SQL> select sys_context('USERENV','NETWORK_PROTOCOL') as network_protocol from dual;

NETWORK_PROTOCOL
________________
tcps

SQL> select sys_context('USERENV','TLS_VERSION') as tls_version from dual;

TLS_VERSION
___________
TLS 1.2

SQL> select sys_context('USERENV','TLS_CIPHERSUITE') as tls_ciphersuite from dual;

TLS_CIPHERSUITE
______________________________________
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384

 

9. Native Network Encryption を使用する場合

ここまで、TLS による接続暗号化を設定しました。
一方で、証明書やウォレットを用意せず、より簡易に Oracle Net の通信を暗号化したい場合は、Oracle Database の Native Network Encryption(NNE)を使用する方法もあります。
この構成は sqlnet.ora のパラメータで制御します。 通信の暗号化を有効化のためには、クライアントとサーバー側のどちらか(または両方)で設定を行うことができますが、今回はDBサーバーの $ORACLE_HOME/network/admin にある sqlnet.ora ファイルを編集します。

最小構成として、サーバ側で暗号化を「必須」にし、許可する暗号方式を追記します。

SQLNET.ENCRYPTION_SERVER = REQUIRED
SQLNET.ENCRYPTION_TYPES_SERVER = (AES256, AES192, AES128)

これにより通信が暗号化されるようになります。
暗号化だけでなく改ざん検出(整合性チェック)も有効にしたい場合は、以下も追記します。

SQLNET.CRYPTO_CHECKSUM_SERVER = REQUIRED
SQLNET.CRYPTO_CHECKSUM_TYPES_SERVER = (SHA512)

設定後、通常の TCP 接続でデータベースに接続します。

接続後、以下の SQL で現在のセッションのネットワーク・サービス情報を確認します。

SQL> select network_service_banner from v$session_connect_info where sid in (select distinct sid from v$mystat);

NETWORK_SERVICE_BANNER
_____________________________________________________________________________
TCP/IP NT Protocol Adapter for Linux: Version 23.26.1.0.0 - Production
Encryption service for Linux: Version 23.26.1.0.0 - Production
AES256 Encryption service adapter for Linux: Version 23.26.1.0.0 - Production
Crypto-checksumming service for Linux: Version 23.26.1.0.0 - Production

AES256 Encryption service adapter のような行が表示されていれば、NNE による暗号化が有効になっています。

同一環境で TCP と TCPS の両方を扱う場合や、2つの暗号化方式の併用を検討する場合は、設定の組み合わせに注意してください。同時に使用する場合のパラメータとしては IGNORE_ANO_ENCRYPTION_FOR_TCPS があります。

 

10. まとめ

本記事では、Oracle Database への接続を TLS で暗号化する手順を紹介しました。
検証環境では自己署名証明書を使用できますが、本番環境では信頼された CA によって署名された証明書を使用し、SSL_SERVER_DN_MATCH=YES を有効にする構成を推奨します。

今回は、サーバー証明書を格納したウォレットを作成し、クライアント側にも信頼用の証明書を登録したウォレットを配置する方法を紹介しましたが、ウォレットではなくエクスポートした証明書をクライアント側の信頼ストアに登録する構成をとることも可能です。
また、Entra ID や OCI IAM などのトークン認証を利用する場合は、TCPS 接続が前提となるケースがあるため、TLS の設定方法を理解しておくことは重要となります。

また、 補足として、Native Network Encryption(NNE)の設定例も紹介しました。証明書を使った接続先検証が必要な場合は TLS、より簡易に Oracle Net の通信暗号化を有効化したい場合は NNE、というように、要件に応じて使い分けてください。