JDBC接続(プール)


※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

postgreSQLのSSL対応をした後の話

プールの設定

WebContext/META-INF/context.xmlを作成する
<?xml version='1.0' encoding='utf-8'?>
<Context>
<Resource name="jdbc/public" auth="Container" type="javax.sql.DataSource"
	driverClassName="org.postgresql.Driver" url="jdbc:postgresql://localhost:5432/データベース"
	username="ユーザ" password="パスワード" initialSize="5" maxActive="5"
	maxIdle="5" minIdle="5" maxAge="0" maxWait="1800" />
</Context>

WebContext/WEB-INF/web.xml
<resource-ref>
 <res-ref-name>jdbc/public</res-ref-name>
 <res-type>javax.sql.DataSource</res-type>
 <res-auth>Container</res-auth>
</resource-ref>

ソース
DataSource ds = null;
Context ctx = new InitialContext();
ds = (DataSource) ctx.lookup("java:comp/env/jdbc/public");
try {
} catch (Exception e) {
}
Connection conn = ds.getConnection();

javaの証明書を作成する(サーバ証明書を作成後)


1)cacertsをコピーして名前を変える
C:\Program Files\Java\jre7\lib\securityのcacertsをcacerts_java

2)コマンドプロンプトを管理者モードで開き、C:\Program Files\Java\jre7\binに移動して以下を実行する

keytool.exe -import -alias postgresql -file c:\Opt\apache\conf\server.crt -trustcacerts -keystore ..\lib\security\cacerts_java
キーストアのパスワードを入力してください:changeit
所有者: O=Internet Widgits Pty Ltd, ST=Some-State, C=AU
発行者: O=Internet Widgits Pty Ltd, ST=Some-State, C=AU
シリアル番号: cc3fcda13d33aede
有効期間の開始日: Wed Jul 09 14:52:52 JST 2014終了日: Sat Jul 06 14:52:52 JST 20
24
証明書のフィンガプリント:
        MD5:  82:75:19:B7:23:B2:78:6C:5B:E1:67:66:AA:66:CF:C4
        SHA1: 5E:73:BC:CD:67:7F:7A:B9:E1:B2:2D:AA:A5:F2:C2:46:CF:3C:CF:18
        SHA256: 76:91:14:B5:4F:E1:FA:45:63:28:00:4C:6E:AB:78:A3:DF:B7:8A:B4:F3:
6E:DE:7A:A1:37:BC:82:95:D6:35:8F
        署名アルゴリズム名: SHA1withRSA
        バージョン: 1
この証明書を信頼しますか。 [いいえ]:  はい
証明書がキーストアに追加されました

3)作成した、cacerts_javaをどこでもいいがc:\Opt\apache\confに置く
jdbcを呼び出す前に、プロパティをセットする(以下はソースの抜粋)

System.setProperty("javax.net.ssl.trustStore", "C:/Opt/apache/conf/cacerts_java");
System.setProperty("javax.net.ssl.trustStorePassword", "changeit");


SSL接続にする(postgreSQLをSSL化した後の話)

context.xmlを以下を追記する
connectionProperties="ssl=true"


context.xmlにベタにユーザ/パスワードを記載したくない場合の抜け道

context.xmlを以下を追記する
factory="hoge.dao.MyBasicDataSourceFactory"

クラスを作成する

public class MyBasicDataSourceFactory extends BasicDataSourceFactory {

@Override
public Object getObjectInstance(Object obj, Name name, Context nameCtx, Hashtable environment)
		throws Exception
{
	if ((obj == null) || (!(obj instanceof Reference))) {
		return null;
	}
	Reference ref = (Reference) obj;
	if (!("javax.sql.DataSource".equals(ref.getClassName()))) {
		return null;
	}

	// 見えないフィールドなので、リフレクションで取得する
	Field field = BasicDataSourceFactory.class.getDeclaredField("ALL_PROPERTIES");
	field.setAccessible(true);
	String[] ALL_PROPERTIES = (String[]) field.get(BasicDataSourceFactory.class);

	Properties properties = new Properties();
	for (int i = 0; i < ALL_PROPERTIES.length; ++i) {
		String propertyName = ALL_PROPERTIES[i];
		RefAddr ra = ref.get(propertyName);
		if (ra != null) {
			String propertyValue = ra.getContent().toString();
			// パラメータ名がpasswordだった場合は復号化して、セットする
			if ("password".equals(propertyName)) {
				// 復号化

				// TODO: 復号化ロジックを呼び出す

				// セットしなおす
				propertyValue = "xxxx";
			}
			properties.setProperty(propertyName, propertyValue);
		}
	}

	System.setProperty("javax.net.ssl.trustStore", "C:/Opt/apache/conf/cacerts_java");
	System.setProperty("javax.net.ssl.trustStorePassword", "changeit");

	return createDataSource(properties);
}

}