【问题标题】:Connecting to cassandra cluster with kerberos using java driver使用 java 驱动程序使用 kerberos 连接到 cassandra 集群
【发布时间】:2014-03-08 17:49:37
【问题描述】:

我按照以下 datastax 帖子中的说明进行操作 - Accessing secure DSE clusters

这是我的代码 sn-p -

public static void main(String[] args) {
KerberosAuthenticatedClient client = new KerberosAuthenticatedClient();     
System.setProperty("java.security.krb5.conf","C:/Users/ADMIN/Desktop/krb5.config");
System.setProperty("java.security.auth.login.config","C:/Users/ADMIN/Desktop/DseClient.config");    
cluster = Cluster.builder().addContactPoint(node).withAuthProvider(new DseAuthProvider()).build();
session = cluster.connect();

这是我的 DseClient 文件 -

DseClient {
    com.sun.security.auth.module.Krb5LoginModule required
     useKeyTab=true
   doNotPrompt=true
     keyTab="C:/Users/ADMIN/Desktop/dse.keytab"
     principal="rock@MY.COM";
};

这是我的 krb5.conf -

[libdefaults]
default_realm = MY.COM
dns_lookup_realm = false
dns_lookup_kdc = false
ticket_lifetime = 24h
renew_lifetime = 7d
forwardable = true

[realms]
MY.COM = {
kdc = x.x.x.x
admin_server = x.x.x.x
}

[domain_realm]
.my.com = MY.COM
my.com = MY.COM

我已经在我的客户端机器和服务器上安装了 kerberos。但是当我运行时出现以下错误:-

Exception in thread "main" java.lang.RuntimeException: javax.security.auth.login.LoginException: Unable to obtain password from user

at com.datastax.driver.core.sasl.KerberosAuthenticator.loginSubject(KerberosAuthenticator.java:113)
at com.datastax.driver.core.sasl.KerberosAuthenticator.<init>(KerberosAuthenticator.java:94)
at com.datastax.driver.core.sasl.DseAuthProvider.newAuthenticator(DseAuthProvider.java:52)
at com.datastax.driver.core.Connection.initializeTransport(Connection.java:163)
at com.datastax.driver.core.Connection.<init>(Connection.java:131)
at com.datastax.driver.core.Connection.<init>(Connection.java:59)
at com.datastax.driver.core.Connection$Factory.open(Connection.java:444)
at com.datastax.driver.core.ControlConnection.tryConnect(ControlConnection.java:205)
at com.datastax.driver.core.ControlConnection.reconnectInternal(ControlConnection.java:168)
at com.datastax.driver.core.ControlConnection.connect(ControlConnection.java:81)
at com.datastax.driver.core.Cluster$Manager.init(Cluster.java:812)
at com.datastax.driver.core.Cluster$Manager.access$100(Cluster.java:739)
at com.datastax.driver.core.Cluster.<init>(Cluster.java:82)
at com.datastax.driver.core.Cluster.<init>(Cluster.java:67)
at com.datastax.driver.core.Cluster$Builder.build(Cluster.java:708)
at KerberosAuthenticatedClient.connect(KerberosAuthenticatedClient.java:19)
at KerberosAuthenticatedClient.main(KerberosAuthenticatedClient.java:45)
Caused by: javax.security.auth.login.LoginException: Unable to obtain password from user

at com.sun.security.auth.module.Krb5LoginModule.promptForPass(Unknown Source)
at com.sun.security.auth.module.Krb5LoginModule.attemptAuthentication(Unknown Source)
at com.sun.security.auth.module.Krb5LoginModule.login(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at javax.security.auth.login.LoginContext.invoke(Unknown Source)
at javax.security.auth.login.LoginContext.access$000(Unknown Source)
at javax.security.auth.login.LoginContext$4.run(Unknown Source)
at javax.security.auth.login.LoginContext$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.login.LoginContext.invokePriv(Unknown Source)
at javax.security.auth.login.LoginContext.login(Unknown Source)
at com.datastax.driver.core.sasl.KerberosAuthenticator.loginSubject(KerberosAuthenticator.java:109)
... 16 more

【问题讨论】:

    标签: cassandra kerberos datastax-enterprise datastax


    【解决方案1】:

    堆栈跟踪中的错误抱怨它无法为执行请求的操作系统用户找到任何凭据。这通常是由以下三种情况之一引起的:

    1. 未正确设置 JAAS 配置的位置(这会导致我们退回到使用 TGT 缓存的默认设置,并且通常会导致 2。)
    2. 一个空的本地票证缓存(不使用 keytab 时)
    3. keytab 中缺少指定主体的凭据

    我要检查的第一件事是您是否已正确地将java.security.auth.login.config 系统属性设置为您的 JAAS 配置文件(DseClient 文件)的位置? 如果您有并且仍然看到错误,您可以使用 klist -e -t -k /path/to/keytab 检查 keytab 的内容

    另一个有用的调试技巧是设置-Dsun.security.krb5.debug=true,它将大量详细信息转储到标准输出。

    【讨论】:

    • 我已经尝试了调试选项,这就是我所看到的 - >>> KeyTabInputStream, readName(): MY.COM >>> KeyTabInputStream, readName(): rock >>> KeyTab: load () 条目长度:64; type: 18 >>> KeyTabInputStream, readName(): MY.COM >>> KeyTabInputStream, readName(): rock >>> KeyTab: load() entry length: 48; type: 17 >>> KeyTabInputStream, readName(): MY.COM >>> KeyTabInputStream, readName(): rock >>> KeyTab: load() entry length: 56;类型:16
    • >>> KeyTabInputStream, readName(): MY.COM >>> KeyTabInputStream, readName(): rock >>> KeyTab: load() entry length: 48; type: 23 >>> KeyTabInputStream, readName(): MY.COM >>> KeyTabInputStream, readName(): rock >>> KeyTab: load() entry length: 40; type: 8 >>> KeyTabInputStream, readName(): MY.COM >>> KeyTabInputStream, readName(): rock >>> KeyTab: load() entry length: 40;类型:3
    • Java 配置名称:C:/Users/ADMIN/Desktop/krb5.config 从 Java 配置加载 添加密钥:3version:3 发现 rock@MY.COM 不支持的密钥类型 (8) 添加密钥:23version :3 添加密钥:16 版本:3 添加密钥:17 版本:3 发现 rock@MY.COM 不支持的密钥类型(18) 订购密钥 wrt default_tkt_enctypes 列表 使用 default_tkt_enctypes 的内置默认 etypes default_tkt_enctypes 的默认 etypes:17 16 23 1 3。跨度>
    • >>> KrbAsReq 创建消息 getRealmFromDNS:尝试 usac.MY.com 线程“main”中的异常 java.lang.RuntimeException:javax.security.auth.login.LoginException:无法在 com 找到默认领域.datastax.driver.core.sasl.KerberosAuthenticator.loginSubject(KerberosAuthenticator.java:113)
    • 该输出末尾有关 getRealmFromDNS 的错误表明主机解析存在问题。有关更多详细信息,请参阅web.mit.edu/kerberos/krb5-current/doc/admin/princ_dns.html
    【解决方案2】:

    我将服务原则从 cassandra/hostname@REALM 更改为 dse/hostname@REALM 并且它起作用了。我不确定为什么我从 Windows 机器上运行的 java 程序将服务原则作为 dse/hostname 而不是 cassandra/hostname

    【讨论】:

    • 因为这是默认的 github.com/datastax/java-driver/blob/2.0/driver-dse/src/main/… 这不在驱动程序 1.0 版的 javadoc 中,因为 Kerberos 组件位于特定于 DSE 的分支中。在 2.0 版中,这已移至新的子模块中,因此将被包括在内(一旦驱动程序达到 GA 或发布新的 RC 并更新 Javadoc)。
    猜你喜欢
    • 1970-01-01
    • 2015-07-23
    • 2016-07-26
    • 2017-08-13
    • 2013-07-14
    • 2017-08-07
    • 2016-12-22
    • 1970-01-01
    • 2018-04-16
    相关资源
    最近更新 更多