2017-02-27 448 views
1

我创建了一个扩展DriverManagerDataSource的类SecureImpalaDataSource,并使用UserGroupInformation.doAs()通过keytab文件获取与impala的连接。但我得到的错误如下:使用kerberos验证连接到具有JDBC的impala时出错

值java.sql.SQLException:[辛巴] ImpalaJDBCDriver错误 初始化或进行身份验证创建交通: [辛巴] ImpalaJDBCDriver无法连接到服务器:空。

但是,当我在测试演示中获得与kerberos票证缓存的连接时,我很成功。任何人都可以帮助我?

回答

1

其结果是,该我的URL中的HOST和FQDN不一致。

1

忘掉Hadoop的UGI:JDBC驱动程序只需要原始JAAS配置创建一个Kerberos票据上即时(与useKeyTab升起和降下useTicketCache

系统属性

  • java.security.krb5.conf =>(可选)非defaut的Kerberos CONF
  • java.security.auth.login.config => JAAS配置文件
  • javax.security.auth.useSubjectCredsOnly =>必须强制为 “假” (该默认已经在一些Java版本中发生了变化,嗯)

示例JAAS conf文件,Impala/Hive Cloudera驱动程序
此处带有Java风格表示法的Windows路径。

Client { 
    com.sun.security.auth.module.Krb5LoginModule 
    required 
    useTicketCache=false 
    doNotPrompt=true 
    useKeyTab=true 
    keyTab="file:C:/blah/blah/dummy.keytab" 
    principal="[email protected]" 
    debug=false; 
}; 

样品JAAS的conf文件,Apache的配置单元驱动
只需更改节的名称从Clientcom.sun.security.jgss.krb5.initiate
PS:你的东西,在相同的conf文件的多个部分;这意味着您可以定义一个“全局”配置文件,并使用它与多个工具&驱动程序库,具有一致的设置。

调试

  • sun.security.krb5.debug =>设置为 “true”
  • java.security.debug =>设置为 “gssloginconfig,CONFIGFILE,configparser,LoginContext的”
+0

非常感谢。 \t 虽然你的回答不会帮助我解决我的问题。 – SimbaHuang

1

验证您的jdbc连接的一种方法是使用ugi.doAs。以下是示例代码:

// 1. login use keytab 
System.setProperty("java.security.krb5.realm", "XXX.COM"); 
System.setProperty("java.security.krb5.kdc", "kdcXXX"); 
Configuration conf = new Configuration(); 
conf.set("hadoop.security.authentication", "Kerberos"); 
UserGroupInformation.setConfiguration(conf); 
UserGroupInformation ugi = UserGroupInformation.loginUserFromKeytabAndReturnUGI("test", "test.keytab"); 

// 2. create impala jdbc connection 
Class.forName(JDBCDriverName); 
conn = (Connection) ugi.doAs(new PrivilegedExceptionAction<Object>() { 
    public Object run() { 
    Connection tcon = null; 
    try { 
     tcon = DriverManager.getConnection(connectionUrl); 
    } catch (SQLException e) { 
     e.printStackTrace(); 
    } 
    return tcon; 
    } 
}); 

// 3. execute query using conn 
......