JavaアプリからTLS対応のDb2へ接続する方法を試してみた

## はじめに
JavaアプリケーションからTLS対応のDb2へ接続する方法を試してみました。確認したかったのはクライアント側の構成方法だったのですが、確認用に接続先データベースが必要になるので、Db2に付属のSAMPLEデータベースをTLS対応にして接続先データベースとしました。
手順と設定方法を備忘録として残しておくことにします。

## 環境
本投稿内容は以下の環境で動作確認しています。

|ソフトウェア|バージョン|備考|
|:----------|:---------|:---------|
|Windows 11 Pro|23H2||
|Db2 for Windows (x64)|11.5.8|Db2 Community Edition|
|Java       |17||
|Open Liberty |23.0.0.10||

## Db2サーバーのTLSサポート構成
Db2に付属のSAMPLEデータベースをTLS対応にします。
サーバー側の構成作業として以下を実施します。
1. 鍵ストアの作成
2. 証明書(自己証明書)の作成
3. 証明書の抽出(配布用)
4. データベース構成の変更

### 1. 鍵ストアの作成
以下のコマンドで鍵ストア`server.p12`を作成します（参照情報[1][2]）。
```
gsk8capicmd_64 -keydb -create -db server.p12 -pw password -stash -pqc false
```
### 2. 証明書(自己証明書)の作成
前記鍵ストア`server.p12`の中に自己証明書を作成します（参照情報[3]）。
```
gsk8capicmd_64 -cert -create -db server.p12 -stashed -label myselfsigned -dn "CN=localhost" -size 2048 -sigalg SHA256_WITH_RSA
```
### 3. 証明書の抽出(配布用)
クライアントに配布する証明書を抽出します（参照情報[4]）。
```
gsk8capicmd_64 -cert -extract -db server.p12 -stashed -label myselfsigned -target myselfsigned.crt -format ascii
```
### 4. データベース構成の変更（参照情報[5]）
鍵ストア・ファイルのパス(`C:\db2tls`に配置するものとします)を設定します。
```
db2 update dbm cfg using SSL_SVR_KEYDB C:\db2tls\server.p12
```
stashファイルのパス(`C:\db2tls`に配置するものとします)を設定します。
```
db2 update dbm cfg using SSL_SVR_STASH C:\db2tls\server.sth
```
SSL_SVR_LABEL構成パラメーターに自己証明書のラベルを設定します。
```
db2 update dbm cfg using SSL_SVR_LABEL myselfsigned
```
SSL_SVCENAME 構成パラメーターにTLS接続をlistenするポートを設定します。
```
db2 update dbm cfg using SSL_SVCENAME 25001
```
TLS を DB2COMM レジストリー変数に追加します。
```
db2set DB2COMM=SSL
```

## Db2クライアントの構成
Db2クライアントの構成作業として以下を実施します。
1. サーバー側から配布された証明書をインポート
2. Javaアプリ実行時に参照する構成情報の設定

### 1. サーバー側から配布された証明書をインポート
「Db2サーバーのTLSサポート構成」の「3. 証明書の抽出(配布用)」で抽出した証明書をDb2クライアント側の鍵ストアにインポートします。以下のコマンドはJDKに付属のkeytoolを利用した例です（参照情報[6]）。
```
keytool -importcert -alias myselfsigned -file myselfsigned.crt -keystore clientks.p12 -storetype pkcs12 -storepass password
```
### 2. Javaアプリ実行時に参照する構成情報の設定
構成情報の設定には構成プロパティーを使用します。
実行時に参照される構成プロパティーは以下いずれかの方法で設定できます(参照情報[7])。

* CLASSPATH上に`DB2JccConfiguration.properties`を配置
* システム・プロパティー`db2.jcc.propertiesFile`で指定(スタンドアロンJavaアプリの場合`-Ddb2.jcc.propertiesFile=`で構成プロパティー・ファイルのパスを指定、ファイル名は任意の名前でOK)
* 個々の構成プロパティーをシステム・プロパティーで指定

構成プロパティーの設定例を以下に示します(参照情報[8])。
```DB2JccConfiguration.properties
db2.jcc.sslConnection=true
db2.jcc.sslTrustStoreLocation=C:/db2tls/clientks.p12
db2.jcc.sslTrustStorePassword=password
```
## Liberty環境から接続する場合の設定
IBM WebSphere LibertyまたはOpen Liberty(以下Libertyと表記)から接続する場合は、Libertyの構成ファイルである`server.xml`のDataSource定義に前記の構成プロパティーを記述します。以下に記述例を示します(参照情報[9])。
```server.xml（DataSource定義の抜粋）
<dataSource id="DefaultDataSource" jndiName="jdbc/db2/SAMPLE">
    <jdbcDriver libraryRef="DB2JCCLib"/>
    <properties.db2.jcc currentSchema="TSUNO" databaseName="SAMPLE"
     serverName="localhost" portNumber="25001" user="db2admin" password="password"
     sslConnection="true"
     sslTrustStoreLocation="C:/db2tls/clientks.p12"
     sslTrustStorePassword="password" />
</dataSource>
```

以上です。

## 参照情報
[1][Global Security Kit のインストールの紹介](https://www.ibm.com/docs/ja/db2/11.5?topic=encryption-global-security-kit-installation-gskit)
[2][GSKit を使用した鍵ストアの作成](https://www.ibm.com/docs/ja/db2/11.5?topic=certificate-creating-keystore-gskit)
[3][GSKit を使用した自己署名証明書の作成](https://www.ibm.com/docs/ja/db2/11.5?topic=certificate-creating-self-signed)
[4][Db2 クライアントへの自己署名証明書の配布](https://www.ibm.com/docs/ja/db2/11.5?topic=certificate-distributing-self-signed)
[5][Db2 サーバーでの TLS サポートの構成](https://www.ibm.com/docs/ja/db2/11.5?topic=certificate-configure-tls-db2-server)
[6][TLS を使用するための Java ランタイム環境の構成](https://www.ibm.com/docs/ja/db2/11.5?topic=clients-configuring-java-runtime-environment-use-tls)
[7][IBM Data Server Driver for JDBC and SQLJ 構成プロパティーのカスタマイズ](https://www.ibm.com/docs/ja/db2/11.5?topic=iuudsdjsdluws-customization-data-server-driver-jdbc-sqlj-configuration-properties)
[8][IBM Data Server Driver for JDBC and SQLJ 構成プロパティー](https://www.ibm.com/docs/ja/db2/11.5?topic=information-data-server-driver-jdbc-sqlj-configuration-properties)
[9][Liberty Server configuration (dataSource > properties.db2.jcc)](https://openliberty.io/docs/latest/reference/config/dataSource.html#dataSource/properties.db2.jcc)