Oracle Wallet認証 Java JDBC接続

概要

Wallet認証情報を用いて、JDBC Thinドライバ接続検証した時のメモを残しておきます。

Oracle Help Center の記事 を参考にしています。

前提条件

環境の前提条件は以下の通りです。

  • Windows環境
  • Oracle 12c インストール済、テストユーザ作成済
  • Eclipse インストール済
  • JDK8 インストール済

作業の流れ

おおまかな作業の流れは、以下の通りです。

  • Oracle Wallet 作成
  • 環境変数の設定
  • DB接続確認(SQL*Plus)
  • Javaからの接続準備
  • テストプログラム作成&動作確認

Oracle Wallet 作成

tnsnames.ora の作成

$ORACLE_HOME/network/admin 配下にあるtnsnames.oraとは別で作成します。

ディレクトリ作成:

C:\app\oracle\wallet

ファイル作成:

tnsnames.ora

サービス・ネーミング「hogepdb」 を追加します。

hogepdb =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = WinPro)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = pdb)
    )
  )

※サービス・ネーミング「hogepdb」、サービス名「pdb」、

ホスト名「WinPro」、ポート番号「1521」として作成する例です。

sqlnet.ora に必要なパラメータを記載

ファイル作成:

C:\app\oracle\wallet\sqlnet.ora

WALLET_LOCATION=(SOURCE=(METHOD=FILE)(METHOD_DATA=(DIRECTORY=C:\app\oracle\wallet)))
SQLNET.WALLET_OVERRIDE=TRUE

Oracle Walletの作成

mkstore -wrl ”Walletファイル保存ディレクトリ” -create

C:\app\oracle\wallet>mkstore -wrl . -create

※Wallet本体のパスワードを入力します。 パスワード例:Wa11etPass

Walletファイル保存ディレクトリにファイルが生成されます。

Oracle Walletに接続DBユーザとパスワードを登録

mkstore -wrl ”Walletファイルディレクトリ” -createCredential ”サービス・ネーミング” ”接続DBユーザ名”

例としてSAMPLEUSR1ユーザに対してwalletを作成してみます。

C:\app\oracle\wallet>mkstore -wrl . -createCredential hogepdb SAMPLEUSR1

Oracle Walletの内容確認

mkstore -wrl ”Walletファイルディレクトリ” -listCredential

C:\app\oracle\wallet>mkstore -wrl . -listCredential

※上記のように確認できれば作成完了です。

削除する場合の書式:

mkstore -wrl ”Walletファイルディレクトリ” -deleteCredential ”サービス・ネーミング” ”接続DBユーザ名”

変更する場合の書式:

mkstore -wrl ”Walletファイルディレクトリ” -modifyCredential ”サービス・ネーミング” ”接続DBユーザ名” ”新パスワード”

環境変数の設定

[スタート] > [コントロール パネル] > [システム] を選択します。

[システムの詳細設定] を選択し [詳細設定] タブを表示します。

[環境変数] を選択し、

変数名: TNS_ADMIN

変数値: TNSNames.ora ファイルが含まれるディレクトリ

を入力して [OK] をクリックします。

DB接続確認(SQL*Plus)

新たにコマンドプロンプトを立ち上げ、DB接続確認を行います。

C:\USERS>sqlplus /@hogepdb

Javaからの接続準備

ウォレットのロケーションの設定

以下のファイル

 $JRE_HOME/jre/lib/security/java.security

プロバイダ・リストの末尾にOraclePKIProviderを追加します。

security.provider.11=oracle.security.pki.OraclePKIProvider

※上書き禁止になっている場合、他のディレクトリにコピーして編集し、元のファイルを上書きコピーすることで対応可能です。

テストプログラム作成&動作確認

テストプログラム

以下のテストプログラムを記述します。

package sample.jdbc;

import java.io.File;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class OracleWalletExample {
	public static void main(String[] argv) {
		System.out.println("-------- Oracle JDBC Connection Testing ------");
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
		} catch (ClassNotFoundException e) {
			System.out.println("Where is your Oracle JDBC Driver?");
			e.printStackTrace();
			return;
		}
		System.out.println("Oracle JDBC Driver Registered!");
		determineAndSetTnsHome();
		Connection connection = null;
		try {
			connection = DriverManager.getConnection("jdbc:oracle:thin:@hogepdb");
		} catch (SQLException e) {
			System.out.println("Connection Failed! Check output console");
			e.printStackTrace();
			return;
		}
		if (connection != null) {
			System.out.println("You made it, take control your database now!");
		} else {
			System.out.println("Failed to make connection!");
		}
	}

	private static void determineAndSetTnsHome() {
		String tnsAdmin = System.getenv("TNS_ADMIN");
		System.out.println("tnsAdmin=" + tnsAdmin);
		if (tnsAdmin == null) {
			String oracleHome = System.getenv("ORACLE_HOME");
			System.out.println("oracleHome=" + oracleHome);
			if (oracleHome == null) {
				return; //failed to find any useful env variables
			}
			tnsAdmin = oracleHome + File.separatorChar + "network" + File.separatorChar + "admin";
		}

		System.setProperty("oracle.net.tns_admin", tnsAdmin);
		System.setProperty("oracle.net.wallet_location",
				"(SOURCE=(METHOD=FILE)(METHOD_DATA=(DIRECTORY=" + tnsAdmin + ")))");
	}
}

Eclipse プロジェクト例

※ クラスパスにoraclepki.jar、 osdt_core.jar、 osdt_cert.jar が必要です。

Oracleのライブラリからコピーするか、 直接パスを通してください。

※以下、コピーした場合の例です。

動作確認

Eclipseで「OracleWalletExample.java」ソースを右クリック、「実行」>「Java アプリケーション」を選択します。

プログラムが実行され、「コンソール」に「You made it, take control your database now!」が表示されていれば、接続確認OKです。

タイトルとURLをコピーしました