SQL*Net 暗号化機能を試す（Oracle Database 19c）

# 通信の暗号化
　Oracle Database と Oracle Client 間の通信経路が信頼できない場合に通信データの暗号化を設定することができます。この機能は旧バージョンでは有償の Oracle Advanced Security ライセンスが必要でしたが、現在は標準ライセンスに含まれるようになりました。[マニュアル](https://docs.oracle.com/cd/F19136_01/dblic/Licensing-Information.html#GUID-68A4128C-4F52-4441-8BC0-A66F5B3EEC35)に記載があります。

# 暗号化設定
## SQLNET.ORA のパラメーター
　暗号化はクライアント側、サーバー側両方の sqlnet.ora ファイルに設定が存在します。

|パラメーター名|設定場所|説明|デフォルト値|
|:---|:---|:---|:---|
|SQLNET.ENCRYPTION_CLIENT|Client|クライアント側で暗号を有効化|accepted|
|SQLNET.ENCRYPTION_SERVER|Server|サーバー側で暗号を有効化|accepted|
|SQLNET.ENCRYPTION_TYPES_CLIENT|Client|クライアント側の暗号化アルゴリズム一覧|利用可能な全アルゴリズム|
|SQLNET.ENCRYPTION_TYPES_SERVER|Server|サーバー側の暗号化アルゴリズム一覧|利用可能な全アルゴリズム|
|SQLNET.CRYPTO_CHECKSUM_CLIENT|Client|クライアント側で暗号化チェックサムの有効化|accepted|
|SQLNET.CRYPTO_CHECKSUM_SERVER|Server|サーバー側で暗号化チェックサムの有効化|accepted|
|SQLNET.CRYPTO_CHECKSUM_TYPE_CLIENT|Client|クライアント側の暗号化チェックサム・タイプ|利用可能な全タイプ|
|SQLNET.CRYPTO_CHECKSUM_TYPE_SERVER|Server|サーバー側の暗号化チェックサム・タイプ|利用可能な全タイプ|
|SQLNET.IGNORE_ANO_ENCRYPTION_FOR_TCPS|Server|TCPS 接続で ENCRYPTION_SERVER 設定を無視 |FALSE|

## 暗号化設定の組み合わせ
　SQLNET.ENCRYPTION_CLIENT と SQLNET.ENCRYPTION_SERVER は暗号化の要求を設定します。これらのパラメーターには以下の値を設定できます。

|設定値|説明|備考|
|:---|:---|:---|
|accepted|暗号化要求を受け入れる|デフォルト|
|rejected|暗号化通信を禁止する||
|requested|暗号化通信を要求する||
|required|暗号化通信を必須にする||

　SQLNET.ENCRYPTION_CLIENTとSQLNET.ENCRYPTION_SERVERの設定値の組み合わせにより、暗号化されるかが決定されます。
 
|通信|CLIENT accepted|CLIENT rejected|CLIENT requested|CLIENT required|
|:---|:---|:---|:---|:---|
|SERVER accepted|非暗号化|非暗号化|暗号化|暗号化| 
|SERVER rejected|非暗号化|非暗号化|非暗号化|接続エラー|
|SERVER requested|暗号化|非暗号化|暗号化|暗号化|
|SERVER required|暗号化|接続エラー|暗号化| 暗号化|

　暗号化に使用されるアルゴリズムは初期接続時にクライアントとサーバー間でネゴシエーションが行われ、双方が利用できる暗号化アルゴリズムから選択されます。クライアントのトレース・ファイルを取得すると以下のようなログが出力されます。

```: 暗号化アルゴリズムの選択
1405 2025-06-18 16:54:27.689 : naeecom:The server chose the 'AES256' encryption algorithm
```

サーバーとクライアント間に暗号化設定の矛盾がある場合（例えば ENCRYPTION_SERVER=REQUIRED, ENCRYPTION_CLIENT=REJECTED）は接続できず ORA-12660 エラーが発生します。

```Shell:暗号化の設定エラー
$ sqlplus user1/{Password}@dbsvr1:1521/pdb1

SQL*Plus: Release 19.0.0.0.0 - Production on Thu Jun 19 09:24:18 2025
Version 19.3.0.0.0

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

ERROR:
ORA-12660: Encryption or crypto-checksumming parameters incompatible


Enter user-name:
```


# パラメーター設定値
暗号化とチェックサムのアルゴリズムには以下の値が使用できます。

## 暗号化アルゴリズム
パラメーター SQLNET.ENCRYPTION_TYPES_{CLIENT|SERVER} で指定する暗号化アルゴリズムは Oracle Database Client 19.3 では以下の値が使用できます（トレースファイルから）。クライアントとサーバー間で一致するアルゴリズムを指定します。

|設定|ID|備考|
|:---|---:|:---|
|AES256|17| | 
|AES192|16| |
|AES128|15| |
|3DES168|12|非推奨|
|3DES112|11|非推奨|
|RC4_128|10|非推奨|
|RC4_56|8|非推奨|
|RC4_256|6|非推奨|
|DES40|3|非推奨|
|DES|2|非推奨|
|RC4_40|1|非推奨|

## チェックサム・アルゴリズム
暗号化チェックサムは Oracle Database Client 19.3 では以下の値が使用できます（トレースファイルから）

|設定|ID|備考|
|:---|---:|:---|
|MD5|1| | 
|SHA1|3| |
|SHA512|4||
|SHA256|5||
|SHA384|6||

## JDBC Driver
JDBC Driver (Thin) では通信の暗号化は接続時のプロパティで設定します。

|sqlnet.ora パラメーター|JDBC プロパティ|
|:---|:---|
|SQLNET.ENCRYPTION_CLIENT|OracleConnection.CONNECTION_PROPERTY_THIN_NET_ENCRYPTION_LEVEL|
|SQLNET.ENCRYPTION_TYPES_CLIENT|OracleConnection.CONNECTION_PROPERTY_THIN_NET_ENCRYPTION_TYPES|
|SQLNET.CRYPTO_CHECKSUM_CLIENT|OracleConnection.CONNECTION_PROPERTY_THIN_NET_CHECKSUM_LEVEL|
|SQLNET.CRYPTO_CHECKSUM_TYPE_CLIENT|OracleConnection.CONNECTION_PROPERTY_THIN_NET_CHECKSUM_TYPES|



Author: Noriyoshi Shinoda / Date: June 19, 2025