使用凭证缓存的Kerberos身份验证通过Eclipse工作,但不通过命令行工作

问题描述:

说明:我构建了一个应用程序,用于从应用了Kerberos身份验证的远程集群中获取HDFS(Hadoop分布式文件系统)文件。我可以从Eclipse执行HDFS.copyToLocalFile(path1,path2),它工作正常。但是,当我将项目导出为可运行jar并尝试通过命令行运行它时,它会抛出下面的错误。注意:我遵循了@https://sourceforge.net/p/jsch/mailman/message/26939797/提到的步骤,并成功地从Eclipse运行项目。我在Eclipse中检查了其他文件,但找不到任何文件。我安装的Kerberos V5 MIT随着网络身份管理器(4.0版本)使用凭证缓存的Kerberos身份验证通过Eclipse工作,但不通过命令行工作

Caused by: java.io.IOException: org.apache.hadoop.security.AccessControlException: Client cannot authenticate via:[TOKEN, KERBEROS] 
at org.apache.hadoop.ipc.Client$Connection$1.run(Client.java:680) 
at java.security.AccessController.doPrivileged(Native Method) 
at javax.security.auth.Subject.doAs(Unknown Source) 
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1628) 
at org.apache.hadoop.ipc.Client$Connection.handleSaslConnectionFailure(Client.java:643) 
at org.apache.hadoop.ipc.Client$Connection.setupIOstreams(Client.java:730) 
at org.apache.hadoop.ipc.Client$Connection.access$2800(Client.java:368) 
at org.apache.hadoop.ipc.Client.getConnection(Client.java:1521) 
at org.apache.hadoop.ipc.Client.call(Client.java:1438) 
... 70 more 
Caused by: org.apache.hadoop.security.AccessControlException: Client cannot authenticate via:[TOKEN, KERBEROS] 
at org.apache.hadoop.security.SaslRpcClient.selectSaslClient(SaslRpcClient.java:172) 
at org.apache.hadoop.security.SaslRpcClient.saslConnect(SaslRpcClient.java:396) 
at org.apache.hadoop.ipc.Client$Connection.setupSaslConnection(Client.java:553) 
at org.apache.hadoop.ipc.Client$Connection.access$1800(Client.java:368) 
at org.apache.hadoop.ipc.Client$Connection$2.run(Client.java:722) 
at org.apache.hadoop.ipc.Client$Connection$2.run(Client.java:718) 
at java.security.AccessController.doPrivileged(Native Method) 
at javax.security.auth.Subject.doAs(Unknown Source) 
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1628) 
at org.apache.hadoop.ipc.Client$Connection.setupIOstreams(Client.java:717) 
... 73 more 

注:我已经配置了失色相关参数为configuration.xml文件和捆绑入类路径。

<property> 
    <name>java.security.auth.login.config</name> 
    <value>./Configuration/login.conf</value> 
</property> 
<property> 
    <name>java.security.krb5.conf</name> 
    <value>./Configuration/krb5.conf</value> 
</property> 
<property> 
    <name>javax.security.auth.useSubjectCredsOnly</name> 
    <value>false</value> 
</property> 
+0

推荐阅读:https://steveloughran.gitbooks.io/kerberos_and_hadoop/content/ –

+0

在_“低层次的秘密” _你有关于启用一些技巧Kerberos调试跟踪,例如'export HADOOP_JAAS_DEBUG = true'和'-Dsun.security.krb5.debug = true'加上,如果您使用的是REST接口,'-Dsun.security.spnego.debug = true' –

+0

我也将添加我的个人风格:'-Djava.security.debug = gssloginconfig,configfile,configparser,logincontext'对于理解配置问题是非常有用的。 –

我认为,Kerberos身份验证失败,因为你login.confkrb5.conf文件无法在运行时使用的JAR时发现的。

我有一个类似的问题,当我试图从我的assets文件夹访问JAR文件中的文件。重点是,在将包导出为JAR时,路径会发生某种变化。您是否有机会在代码中以某种方式检查文件路径,例如

String resourceFile = YourClass.class.getResource("/krb5.conf").getFile(); 
// check if resourceFile is null! 

如果通过IDE运行此命令class.getResource(...)作品,但不会在你的JAR,问题是出在文件位置的差异。

我认为这篇文章可以帮助你:How to get a path to a resource in a Java JAR file