[Oracle Cloud] Base Database ServiceからAutonomous DatabaseにWalletを使ったmTLS接続とBase Database のPDBへの接続の併用(2023/02/20)

# はじめに
Oracle Cloud Infrastructure Base Database ServiceからAutonomous DatabaseにWalletを使ったmTLS接続とBase Database のPDBへの接続の併用するtnanames.oraの記述を試してみました。
Autonomous Databaseへのtls接続ができないバージョンのBase DatabaseからのDatabase Linkの作成が簡便になります。


# ウォレット ( Wallet ) のダウンロード・解凍

Autonomous Database接続用のウォレットをダウンロードし、Base Databaseのノードでoracleユーザで解凍します。

```
unzip Wallet_ADB.zip /home/oracle/wallet
Archive:  ../Wallet_ADB.zip
  inflating: ewallet.pem             
  inflating: README                  
  inflating: cwallet.sso             
  inflating: tnsnames.ora            
  inflating: truststore.jks          
  inflating: ojdbc.properties        
  inflating: sqlnet.ora              
  inflating: ewallet.p12             
  inflating: keystore.jks     
```

# Base Databaseのtnsnames.oraの編集

解凍したtnsnames.oraから Autonomous Database接続用の TNSエントリを Base Databaseの $ORACLE_HOME/network/admin/tnsnames.ora に追記します。

```
$ more $ORACLE_HOME/network/admin/tnsnames.ora 

adb_low=(description= (retry_count=20)(retry_delay=3)(address=(protocol=tcps)(port=1521)(host=adb.adb.ap-tokyo-1.oraclecloud.com))(connect_data=(service_name=XXXXXXX_adb_low.adb.oraclecloud.com))(s
ecurity=(ssl_server_dn_match=no)))
```

追加したTNSエントリに MY_WALLET_DIRECTORY パラメータを追記します。MY_WALLET_DIRECTORYには、ウォレットを解凍したディレクトリを指定します。
(ssl_server_dn_match=no) の次に追記します。


```
$ more $ORACLE_HOME/network/admin/tnsnames.ora 

adb_low=(description= (retry_count=20)(retry_delay=3)(address=(protocol=tcps)(port=1521)(host=adb.adb.ap-tokyo-1.oraclecloud.com))(connect_data=(service_name=XXXXXXX_adb_low.adb.oraclecloud.com))(s
ecurity=(ssl_server_dn_match=no)(MY_WALLET_DIRECTORY=/home/oracle/wallet)))
```

# Base Databaseのsqlnet.oraの編集

Base Databaseの $ORACLE_HOME/network/admin/sqlnet.ora のSQLNET.ENCRYPTION_CLIENT と SQLNET.CRYPTO_CHECKSUM_CLIENT の値を「 ACCEPTED 」に変更します。

```
# SQLNET.ENCRYPTION_CLIENT=REQUIRED
# SQLNET.CRYPTO_CHECKSUM_CLIENT=REQUIRED
SQLNET.ENCRYPTION_CLIENT=ACCEPTED
SQLNET.CRYPTO_CHECKSUM_CLIENT=ACCEPTED
```

# 接続の確認

```
$ sqlplus / as sysdba

SQL*Plus: Release 12.1.0.2.0 Production on Mon Feb 20 10:00:00 2023

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


Connected to:
Oracle Database 12c EE High Perf Release 12.1.0.2.0 - 64bit Production
With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
Advanced Analytics and Real Application Testing options

SQL> conn scott/<PASSWORD>@adb_low
Connected.
SQL> conn scott/<PASSWORD>@PDB
Connected.
```

```tnsnames.ora
# tnsnames.ora Network Configuration File: /u01/app/oracle/product/12.1.0.2/dbhome_1/network/admin/tnsnames.ora
# Generated by Oracle configuration tools.
adb_low=(description= (retry_count=20)(retry_delay=3)(address=(protocol=tcps)(port=1521)(host=adb.adb.ap-tokyo-1.oraclecloud.com))(connect_data=(service_name=XXXXXXX_adb_low.adb.oraclecloud.com))(s
ecurity=(ssl_server_dn_match=no)(MY_WALLET_DIRECTORY=/home/oracle/wallet)))

PDB =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = db01)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME =pdb1.oraclevcn.com)
    )
  )
```

```sqlnet.ora
ENCRYPTION_WALLET_LOCATION=(SOURCE=(METHOD=FILE)(METHOD_DATA=(DIRECTORY=/opt/oracle/dcs/commonstore/wallets/tde/$ORACLE_UNQNAME)))

SQLNET.ENCRYPTION_SERVER=REQUIRED
SQLNET.CRYPTO_CHECKSUM_SERVER=REQUIRED
SQLNET.ENCRYPTION_TYPES_SERVER=(AES256,AES192,AES128)
SQLNET.CRYPTO_CHECKSUM_TYPES_SERVER=(SHA1)
# SQLNET.ENCRYPTION_CLIENT=REQUIRED
# SQLNET.CRYPTO_CHECKSUM_CLIENT=REQUIRED
SQLNET.ENCRYPTION_CLIENT=ACCEPTED
SQLNET.CRYPTO_CHECKSUM_CLIENT=ACCEPTED
SQLNET.ENCRYPTION_TYPES_CLIENT=(AES256,AES192,AES128)
SQLNET.CRYPTO_CHECKSUM_TYPES_CLIENT=(SHA1)
SQLNET.EXPIRE_TIME=10
```


# おわりに
MY_WALLET_DIRECTORYパラメータで環境変数ではなくtnsnames.oraのサービスエントリ内でウォレットの場所を指定できました。これにより複数のウォレットを使い分けることができます。（別リージョンや別テナントのADBへの接続など）
Database Link作成時のUSING句に TNSサービス名を指定できます。


## 参考情報

- [How To Connect Two ADB/SSL Enabled Databases Without Changing TNS Admin Environmental Variable (Doc ID 2662158.1) ](https://support.oracle.com/knowledge/Oracle%20Cloud/2662158_1.html)
- [他のデータベースからAutonomous Databaseへのデータベース・リンクの作成](https://docs.oracle.com/cd/E83857_01/paas/autonomous-database/adbsa/database-links-inbound.html#GUID-EB369724-29CE-452E-8EC1-2E0B33AE0A49)
- [Oracle Cloud: Oracle Database 11gR2 から Autonomous Database へ Database Link接続してみてみた](https://qiita.com/shirok/items/ca303ebaefe0c1499436)


編集前の接続時エラー例

```
SQL> conn scott/Welcome1#Welocme1#@adb_low
ERROR:
ORA-28759: failure to open file
```

tnsnames.oraのみ編集後の接続時エラー例

```
SQL> conn scott/<PASSWORD>@adb_low
ERROR:
ORA-12696: Double Encryption Turned On, login disallowed
```