Kerberos无法在Java代码中使用票证缓存

Kerberos无法在Java代码中使用票证缓存,java,kerberos,gssapi,Java,Kerberos,Gssapi,我有一个服务,它试图使用kerberos票证缓存,但我总是得到如下错误 原因:java.lang.RuntimeException:gssexException:未提供有效凭据(机制级别:未能找到任何Kerberos Credentail) 如果我不使用票证缓存,一切似乎都正常。 下面是我用来指定票证缓存的参数 loginContext=newlogincontext(“”,null,null,new Configuration() { @凌驾 公共AppConfigurationEntry[]

我有一个服务,它试图使用kerberos票证缓存,但我总是得到如下错误
原因:java.lang.RuntimeException:gssexException:未提供有效凭据(机制级别:未能找到任何Kerberos Credentail)

如果我不使用票证缓存,一切似乎都正常。 下面是我用来指定票证缓存的参数

loginContext=newlogincontext(“”,null,null,new Configuration()
{
@凌驾
公共AppConfigurationEntry[]getAppConfigurationEntry(字符串名称)
{
Map options=newhashmap();
看跌期权(“refreshKrb5Config”、“true”);
期权。看跌期权(“不提示”、“真实”);
if(LOG.isDebugEnabled()){
选项。放置(“调试”、“真”);
}
如果(config.getKeytab()!=null){
options.put(“keyTab”,config.getKeytab().getAbsolutePath());
}
期权。看跌期权(“isInitiator”、“false”);
期权。看跌期权(“useKeyTab”、“true”);
期权。卖出(“本金”,服务本金);
//期权。看跌期权(“storeKey”、“true”);
//为ticketCache手动指定/tmp/krb5cc\u ServiceUid
options.put(“ticketCache”,config.getCredentialCache().getAbsolutePath());
期权。看跌期权(“useTicketCache”、“true”);
期权。看跌期权(“续期”、“真实”);
返回新的AppConfigurationEntry[]{new AppConfigurationEntry(Krb5LoginModule.class.getName(),必需,选项)};
}
});
loginContext.login();
然后,我使用以下代码片段获取凭据:

String name=loginContext.getSubject().getPrincipals().iterator().next().getName();
serverCredential=doAs(loginContext.getSubject(),()->gssManager.createCredential(
//gssManager.createName(config.getServiceName()+“@”+主机名,GSSName.NT_HOSTBASED_服务),
gssManager.createName(名称,GSSName.NT_基于主机的服务),
//无限期,
默认的生命周期,
/*新Oid[]{
新Oid(“1.2.840.113554.1.2.2”),//kerberos 5
新Oid(“1.3.6.1.5.5.2”)//spnego
},*/
新Oid(“1.2.840.113554.1.2.2”),
只接受);;
上面的代码片段有什么问题吗?我还确认
/tmp/krb5cc_ServiceUid
确实存在


谢谢

AFAIK Java只有部分Kerberos实现。它可以从票据缓存中读取TGT(如果JAAS配置允许),但不能写入缓存——不更新、不创建、不重新创建。而且它从不将缓存用于服务票证。作为记录,我从不为服务器端编写代码,我总是通过conf文件传递JAAS选项(语法很独特,但一旦您了解到可以使用多个auth类型的多个命名部分,就很容易读取…),Hadoop堆栈有自己的Kerberos实现,它构建在Java impl上,但覆盖了许多内容-例如,它允许通过运行
kinit-R
命令来更新缓存中现有的TGT:-0因为您没有提到激活调试跟踪,请注意,
-Dsun.security.krb5.debug=true
-Djava.security.debug=gssloginconconfig、configfile、configparser、logincontext
将对SdtErr/StdOut产生巨大的转储,但这些转储可能有助于您了解应用了哪些选项,以及哪些选项被默默忽略(duh!)