ねら~ITエンジニア雑記

やきうのお兄ちゃんが綴るOracle Databaseメインのブログ

Autonomous Database(ATP) に Java(JDBC Thin Driver) で ウォレット無しで接続してみる。

Autonomous Database(ATP/ADW/AJSON) は、従来は Autonomous Database自体が持つウォレットのファイル群を
クライアント側に配置する必要がありましたが、ウォレット無しのTLS接続を許可するオプションが追加されました。

Update Network Options to Allow TLS or Require Only Mutual TLS (mTLS) Authentication on Autonomous Database
https://docs.oracle.com/en/cloud/paas/autonomous-database/adbsa/support-tls-mtls-authentication.html#GUID-3F3F1FA4-DD7D-4211-A1D3-A74ED35C0AF5

About TLS Authentication
https://docs.oracle.com/en/cloud/paas/autonomous-database/adbsa/connect-introduction.html#GUID-5ACCC8FF-7637-48F6-8FE4-049A720AC275
If the client is connecting with JDBC Thin using TLS authentication, the client can connect without providing a wallet.

今回はこの追加された機能を使用して、ウォレット無しで Autonomous Database に接続してみるやで。
彡(゚)(゚)

1. Autonomous Database(ATP) の作成

まず Autonomous Database を作成します。ウォレット無しのTLS接続 は ADB の
ACL(Access Control List) による接続制限を行うか、プライベートエンドポイントで作成する必要があります。

Update Network Options to Allow TLS or Require Only Mutual TLS (mTLS) Authentication on Autonomous Database
https://docs.oracle.com/en/cloud/paas/autonomous-database/adbsa/support-tls-mtls-authentication.html#GUID-3F3F1FA4-DD7D-4211-A1D3-A74ED35C0AF5
If the instance is configured to operate over the public internet,
then one or more Access Control Lists (ACLs) must be defined before you allow TLS authentication.

If the instance is configured with a private endpoint, then you can allow TLS authentication.

今回は下記のトポロジーで Private Endpoint に ATP を作成します。 NoWallet001.jpg

2. Mutual TLS(mTLS)認証必須の無効化

DB作成後、Autonomous Database のコンソールからmTLS認証必須を無効化します。 NoWallet002.jpg NoWallet003.jpg

3. TLS接続の接続文字列確認

DB Connection ⇒ TLS(プルダウン) で TLS接続 の接続文字列を確認します。
従来の mTLS はポート番号が 1522 なのですが、TLS接続は 1521 となるもよう。
NoWallet004.jpg

事前定義サービスは幾つかあるのですが、今回は TP接続 を選択します。彡(゚)(゚)

4. Instant Client(jdbc) の yum install(※オプション)

Compute に Instant Client を yum install して JDBC Thin Driver をゲットしておきます。
既に JDBC Thin Driver が有る場合は省略して構いません。下記では無駄に sqlplus をインストールしていたり…。

sudo su -

cd /etc/yum.repos.d
wget http://yum.oracle.com/public-yum-ol7.repo

yum install -y yum-utils
yum-config-manager --enable ol7_oracle_instantclient

yum list | grep -i oracle-instant

yum install oracle-instantclient-basic.x86_64
yum install oracle-instantclient-sqlplus.x86_64
yum install oracle-instantclient-jdbc.x86_64
yum install oracle-instantclient-tools.x86_64

export ORACLE_HOME=/usr/lib/oracle/21/client64
export PATH=${ORACLE_HOME}/bin:${PATH}
export LD_LIBRARY_PATH=${ORACLE_HOME}/lib

sqlplus /nolog

SQL*Plus: Release 21.0.0.0.0 - Production on Sat Oct 30 06:38:42 2021
Version 21.3.0.0.0

5. JDKダウンロードと展開(※オプション)

Compute に JDK をダウンロードして展開します。既にJDKインストール済みの場合は省略して構いません。
今回は JDK17 をダウンロードして展開します。生の wget で tar.gz の JDK をダウンロードできる…!
彡(゚)(゚)

mkdir work
cd work
wget https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.tar.gz
tar xvzf latest/jdk-17_linux-x64_bin.tar.gz
cd jdk-17.0.1
cd bin
./java -version

java version "17.0.1" 2021-10-19 LTS
Java(TM) SE Runtime Environment (build 17.0.1+12-LTS-39)
Java HotSpot(TM) 64-Bit Server VM (build 17.0.1+12-LTS-39, mixed mode, sharing)

6. サンプルのソースコード

ソースコードは以前の記事のものを流用します。

Autonomous DB(ADW/ATP) に JavaJDBC Thin Driver で接続してみる。(OCI, Oracle Cloud Infrastructure)
https://qiita.com/ora_gonsuke777/items/91ec0e15848a78ede385

接続文字列部分には 3. で確認した接続文字列をセットします。
接続文字列内のダブルクォートは \ でエスケープしておきましょう。

import java.sql.*;

public class GetContainerName {
    public static void main(String[] args) {
        final String path = "jdbc:oracle:thin:@(description=(retry_count=20)(retry_delay=3)(address=(protocol=tcps)(port=1521)(host=xxxxxxxx.adb.ap-tokyo-1.oraclecloud.com))(connect_data=(service_name=xxxxxxxxxxxx_ayuatp1_tp.adb.oraclecloud.com))(security=(ssl_server_cert_dn=\"CN=adb.ap-tokyo-1.oraclecloud.com, OU=Oracle ADB TOKYO, O=Oracle Corporation, L=Redwood City, ST=California, C=US\")))";
        final String id = "ADMIN";  //ID
        final String pw = "xxxxxxxx";  //password

        try (
            Connection conn = DriverManager.getConnection(path, id, pw);
            Statement  stmt = conn.createStatement();
            ResultSet  rs   = stmt.executeQuery("SELECT NAME FROM V$CONTAINERS");
        ) {
            while (rs.next()) {
                String cn = rs.getString("name");
                System.out.println("Container Name => " + cn);
            }
        } catch(SQLException ex) {
            ex.printStackTrace();  //Error
        }
    }
}

7. コンパイルと実行

ソースをコンパイルして実行します。漢の 生javac に 生java実行……。

export JAVA_HOME=/home/opc/work/jdk-17.0.1
export PATH=${JAVA_HOME}/bin:${PATH}

javac GetContainerName.java

java -classpath /usr/lib/oracle/21/client64/lib/ojdbc8.jar:. GetContainerName

Container Name => xxxxxxxxxxxxxx_AYUATP1

ウォレット無しでも ADB(ATP) への接続が成功して、コンテナ名が取得できました。

8. まとめ

幾つか事前準備は有りますが、ウォレット無しでも Autonomous Database に接続できるようになりました。
ウォレットの管理やローテション等の手間が無くなり、より使いやすくなっています。

Autonomous Database は Exadata のリソースを安価に使用できるので、皆さん活用して下さいね。
彡(^)(^)