こちら の記事では、LinuxでJDBC接続を行う方法 をご紹介しました。
今回は、SSL/TLS を使用するように InterSystems IRIS スーパーサーバを構成 した IRIS に対して、JDBCで SSL/TLS 接続をする方法をご紹介します。
LinuxでJDBC接続を行う方法 の記事で紹介している手順で、SSL/TLS なしでJDBC接続できる環境を用意していることを前提にご説明します。
手順は以下のようになります。手順の詳細は、この後で説明します。
1.CA証明書を用意します
2.Java キーストアに証明書をインポートします
3.Java ファイルを含むディレクトリに、SSLConfig.properties という名前の構成ファイルを作成ます
4.Java のコードに SSL/TLS の使用を指定する設定を追加します
1.CA証明書を用意します
最初に、CA証明書を用意します。証明書に問題がないか証明書情報を確認します。
※ ***.***.***.*** :接続先IRISサーバのIPアドレス
# openssl s_client -connect ***.***.***.***:1972 -showcerts -CAfile /home/ec2-user/ca_certificate.crt < /dev/null
CONNECTED(00000003)
:
No ALPN negotiated
Early data was not sent
Verify return code: 0 (ok)
---
DONE
「Verify return code: 0 (ok)」が返れば、CA証明書に問題はありません。
2.以下のコマンドで、Java キーストアに証明書をインポートします
実行ディレクトリに keystore.jks ファイルが生成されます。
$ su -
# keytool -importcert -file /path-to-cert/ca_certificate.crt -keystore keystore.jks
Enter keystore password: <-- 任意のパスワード
Re-enter new password: <-- 任意のパスワード(再入力)
Trust this certificate? [no]: yes <-- Yes
Certificate was added to keystore
#
※keytool 実行可能ファイルは、JDK ディストリビューションに同梱されています。
3.Java ファイルのあるディレクトリに、SSLConfig.properties という名前の構成ファイルを作成します
SSLConfig.properties ファイルには、次の2つのプロパティを含めます。
trustStore=path-to-keystore/keystore.jks <-- 2 で作成した keystore.jks のファイルパス
trustStorePassword=keystore-password <-- 2 で設定したパスワード
※クライアント認証が必要な場合、キーストアやその他構成ファイルの詳細については、こちら のドキュメントをご覧ください。
4.Java のコードに SSL/TLS の使用を指定する設定を追加します
※%SuperServerの設定をした接続先のIRISでは、「スーパーサーバSSL/TLSサポート」を「有効」または「必須」に設定してください。
こちらのサンプルでは、DriverManager クラスを使用した接続テスト を行います。
import java.sql.*;
public class JDBCSample_TLS {
public static void main(String[] str) throws Exception {
String url = "jdbc:IRIS://***.***.***.***:1972/USER/";
java.util.Properties prop = new java.util.Properties();
prop.put("connection security level", "10");
prop.put("user", "_System");
prop.put("password", "SYS");
Connection connection = DriverManager.getConnection(url,prop);
Statement statement = connection.createStatement();
String query = "SELECT top 5 TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE FROM INFORMATION_SCHEMA.TABLES";
ResultSet resultSet = statement.executeQuery(query);
System.out.println("Printing out contents of SELECT query: ");
while (resultSet.next()) {
System.out.println(resultSet.getString(1) + ", " + resultSet.getString(2) + ", " + resultSet.getString(3));
}
resultSet.close();
statement.close();
connection.close();
}
}
コンパイル&実行します。
# javac JDBCSample_TLS.java
# java JDBCSample_TLS
Printing out contents of SELECT query:
%CSP_Util, CSPLogEvent, SYSTEM TABLE
%CSP_Util, Performance, SYSTEM TABLE
%Calendar, Hijri, SYSTEM TABLE
%Compiler_Informix, ConversionRule, SYSTEM TABLE
%Compiler_Informix, ImportedObject, SYSTEM TABLE
※IRISDataSource を使用する場合は以下のようになります。
import com.intersystems.jdbc.*;
import java.sql.*:;
public class JDBCSample_TLS {
public static void main(String[] str) throws Exception {
String url = "jdbc:IRIS://***.***.***.***:1972/USER/";
IRISDataSource ds = new IRISDataSource();
ds.setURL(url);
ds.setUser("SYS");
ds.setPassword("_System");
ds.setConnectionSecurityLevel(10);
Connection connection = ds.getConnection();
:
詳細は以下のドキュメントをご覧ください。
Securing the JDBC Connection with TLS