Java配置Kerberos认证连接DB2数据源的问题求助
Java DB2数据源Kerberos认证配置问题与解决方案
问题描述
配置Java中DB2数据源的Kerberos认证时,存在以下三个困惑:
- 不确定Kerberos相关属性应通过
DB2SimpleDataSource的set方法设置,还是通过Properties变量配置; - 使用
com.ibm.db2.jcc.DB2SimpleDataSource(版本4.19.49)编写配置代码时出现权限错误,虽可通过VM参数--add-exports java.base/sun.security.action=ALL-UNNAMED解决,但希望无需该参数即可运行; - 根据IBM文档,需将
dataSource.setKerberosServerPrincipal中的@后内容替换为krb5.conf中的realm,但不清楚多realm场景下该如何处理;
注:已设置
System.setProperty("java.security.krb5.conf", "path\\krb5.conf");
配置代码
DB2SimpleDataSource dataSource = new DB2SimpleDataSource(); dataSource.setDriverType(4); dataSource.setServerName("server"); dataSource.setPortNumber(portnumber); dataSource.setDatabaseName("database name"); dataSource.setSslConnection(true); dataSource.setClientProgramName("program name"); dataSource.setRetrieveMessagesFromServerOnGetMessage(true); dataSource.setSecurityMechanism(dataSource.KERBEROS_SECURITY);
错误信息
com.ibm.db2.jcc.am.SqlException: [jcc][t4][10262][11223][4.19.49] Unexpected Throwable caught: class com.ibm.db2.jcc.am.le (in unnamed module @0x49097b5d) cannot access class sun.security.action.GetPropertyAction (in module java.base) because module java.base does not export sun.security.action to unnamed module @0x49097b5d. ERRORCODE=-4228, SQLSTATE=null at com.ibm.db2.jcc.am.kd.a(Unknown Source) at com.ibm.db2.jcc.am.kd.a(Unknown Source) at com.ibm.db2.jcc.am.kd.a(Unknown Source) at com.ibm.db2.jcc.t4.b.b(Unknown Source) at com.ibm.db2.jcc.t4.b.a(Unknown Source) at com.ibm.db2.jcc.t4.b.a(Unknown Source) at com.ibm.db2.jcc.t4.b.a(Unknown Source) at com.ibm.db2.jcc.t4.b.<init>(Unknown Source) at com.ibm.db2.jcc.DB2SimpleDataSource.getConnection(Unknown Source) at com.ibm.db2.jcc.DB2SimpleDataSource.getConnection(Unknown Source) at com.ibm.db2.jcc.DB2SimpleDataSource.getConnection(Unknown Source) at test.connection.TestDbConnectionDataSource.main(TestDbConnectionDataSource.java:81) Caused by: java.lang.IllegalAccessError: class com.ibm.db2.jcc.am.le (in unnamed module @0x49097b5d) cannot access class sun.security.action.GetPropertyAction (in module java.base) because module java.base does not export sun.security.action to unnamed module @0x49097b5d at com.ibm.db2.jcc.am.le.a(Unknown Source) at com.ibm.db2.jcc.am.le.a(Unknown Source) at com.ibm.db2.jcc.t4.b.a(Unknown Source)
解决方案
1. Kerberos属性配置方式
两种方式都支持,优先推荐DB2SimpleDataSource的set方法:
- set方法:直接调用如
dataSource.setKerberosServerPrincipal("db2/server@REALM"),类型安全,避免属性键名拼写错误; - Properties变量:创建
Properties对象,添加kerberosServerPrincipal等属性,再通过dataSource.setProperties(props)传入,适合批量配置场景。
两种方式效果一致,set方法更直观易维护。
2. 移除VM参数解决权限错误
错误根源是DB2 JCC驱动4.19.49版本未适配Java 9+模块化系统,非法访问了java.base模块的内部API。解决方案:
- 升级驱动版本:将DB2 JCC驱动升级到4.26.14及以上版本(IBM后续版本已修复该模块化兼容问题),升级后无需添加
--add-exports参数即可正常运行; - 若暂时无法升级,可尝试改用JDBC URL方式配置连接(而非
DB2SimpleDataSource),但长期来看升级驱动是最优解。
3. 多Realm场景下的KerberosServerPrincipal处理
多Realm场景下需结合krb5.conf的配置来处理:
- 配置域-Realm映射:在krb5.conf的
[domain_realm]段添加服务器主机名与对应Realm的映射,例如:[domain_realm] .server1.com = REALM1.COM server1.com = REALM1.COM .server2.com = REALM2.COM - 指定完整Principal:直接设置包含正确Realm的完整服务器Principal,例如
dataSource.setKerberosServerPrincipal("db2/server1@REALM1.COM"); - 配置跨Realm信任:若客户端与服务器属于不同Realm,需在krb5.conf的
[realms]段配置Realm之间的信任关系,确保Kerberos客户端能获取跨Realm的票据。
只要krb5.conf配置正确,客户端会自动根据服务器主机名匹配对应的Realm,无需手动切换。
内容的提问来源于stack exchange,提问作者bagb
相关产品推荐
相关产品推荐

