我正在尝试通过 Kerberos 环境连接到 Db2 服务器。我在代码中使用 DB2SimpleDataSource 来连接我的 DB2 服务器。根据我目前的理解,如果我有一个 kerberos tgt,那么我只需要在 Datasource、SecurityMechanism 和 kerberosServerPrincipal 中添加两个属性。以下是代码:
public static DB2BaseDataSource getDataSource() throws Exception {
DB2SimpleDataSource ds = new DB2SimpleDataSource();
ds.setPortNumber(port);
ds.setDatabaseName(dbname);
ds.setServerName(server);
ds.setSecurityMechanism(DB2BaseDataSource.KERBEROS_SECURITY);
ds.setKerberosServerPrincipal("user/[email protected]");
ds.setDriverType(4);
return ds;
}
然后按照以下代码获取连接:
DataSource ds = (DataSource) getDataSource();
Connection con = ds.getConnection();
以下是我尝试建立连接时遇到的错误的堆栈跟踪。
Exception in thread "main" com.ibm.db2.jcc.am.SqlException: [jcc][t4][10262][11223][3.71.22] Unexpected Throwable caught: empty realm part not allowed. ERRORCODE=-4228, SQLSTATE=null
at com.ibm.db2.jcc.am.gd.a(gd.java:797)
at com.ibm.db2.jcc.am.gd.a(gd.java:66)
at com.ibm.db2.jcc.am.gd.a(gd.java:98)
at com.ibm.db2.jcc.t4.b.b(b.java:926)
at com.ibm.db2.jcc.t4.b.a(b.java:784)
at com.ibm.db2.jcc.t4.b.a(b.java:430)
at com.ibm.db2.jcc.t4.b.a(b.java:403)
at com.ibm.db2.jcc.t4.b.<init>(b.java:341)
at com.ibm.db2.jcc.DB2SimpleDataSource.getConnection(DB2SimpleDataSource.java:233)
at com.ibm.db2.jcc.DB2SimpleDataSource.getConnection(DB2SimpleDataSource.java:199)
at com.ibm.db2.jcc.DB2SimpleDataSource.getConnection(DB2SimpleDataSource.java:181)
at com.test.KerberosTest.main(KerberosTest.java:16)
Caused by: java.lang.IllegalArgumentException: empty realm part not allowed
at sun.security.krb5.Realm.parseRealmAtSeparator(Realm.java:133)
at sun.security.krb5.PrincipalName.<init>(PrincipalName.java:399)
at sun.security.krb5.PrincipalName.<init>(PrincipalName.java:471)
at sun.security.jgss.krb5.Krb5NameElement.getInstance(Krb5NameElement.java:114)
at sun.security.jgss.krb5.Krb5MechFactory.getNameElement(Krb5MechFactory.java:95)
at sun.security.jgss.GSSManagerImpl.getNameElement(GSSManagerImpl.java:203)
at sun.security.jgss.GSSNameImpl.getElement(GSSNameImpl.java:477)
at sun.security.jgss.GSSNameImpl.init(GSSNameImpl.java:201)
at sun.security.jgss.GSSNameImpl.<init>(GSSNameImpl.java:170)
at sun.security.jgss.GSSManagerImpl.createName(GSSManagerImpl.java:138)
at com.ibm.db2.jcc.am.je.b(je.java:133)
at com.ibm.db2.jcc.am.je.a(je.java:165)
at com.ibm.db2.jcc.t4.b.a(b.java:6578)
at com.ibm.db2.jcc.t4.b.b(b.java:868)
... 8 more
如果我在 DataSource 属性中使用用户名和密码,那么它会要求提供 jaas 配置文件。提供后,我仍然收到相同的错误。我非常感谢有关此问题的任何帮助。
答案1
很抱歉延迟发布此查询的解决方案。我们通过在 Kerberos 机器上设置 DB2_KRB5_PRINCIPAL 环境变量解决了此问题。